Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.05.21;
Скачать: [xml.tar.bz2];

Вниз

aнализaтор кода   Найти похожие ветки 

 
Тимур   (2006-04-24 22:12) [0]

Допустим, есть некоторое (большое) количество курсовых работ (по технологии программирования) с исходными кодами. нужно определить, насколько похожи эти
исходники. т.е сравнить их на наличие одинаковых(или очень похожих похожих) кусков кода.
И на основе этого анализа, вывести, например коэффициент подобия или процент
подобия, или в каких именно работах найдены совпадения...
Иными словам нужно написать программу-aнaлизaтор кода для этого...
Искал в Инете, но ничего похожего не нашел..как приваили по словао "анализатор" понималось
что-то другое: компилятор, анализатор скрытых ошибок и т.д.
Может быть, у кого-нибудь есть идеи, советы...или какие-нибудь разработки....


 
pavia ©   (2006-04-24 22:30) [1]

Заменяешь в тексте все переменные, константы, названия процедур, типов. Одним символом. Дальше процедура на наибольшее вхождение одной строки в другую. Правдо долго будет работать.
Можно еще удалить пробелы, табы, переводы строки... и взять хэши от процедур, строк и их сравнить.


 
Kolan ©   (2006-04-24 22:46) [2]

Сравнивать строки по похожести:
Вот одна старая ветка:
-= нечеткое сравнение строк =- [D5, D6, D7, Win95/98, WinME, Win2k, WinXP]

WST   (14.09.05 21:29)

Представте, что у вас 2 строчки с текстом. Вам нужно сравнить насколько они совпадают. Они могут иметь разную длинну, символы, буквы, цифры. А мне необходимо узнать насколько процентов одна строка "похожа на вторую". Нужно мне это чтобы если человек введет вместо слова Мастера ДЕЛФИ, например, Мастра Делви или чтото в этом роде. Я уже долго пытаюсь что-то такое написать. Не получаеться. Подскажите, МАСТЕРА, плз.
<Цитата>

kami ©   (14.09.05 21:40) [1]

Из ветки
http://delphimaster.net/view/1-1115465140/&web=1
//------------------------------
Функция вычисляющая в процентах схожесть двух строк..
infom ©   (07.05.05 15:25)

Я как-то очень давно видел здесь упоминание об этой функции, но к сожалению найти её не смог... помогите плиз найти или где искать !
//-----------------------------------------------
[1] Slym ©   (07.05.05 15:32)
/*
Нечеткое сравнение строк
Авторство:
  (c) N!ghtmare [nightmare2000@pisem.net]
*/
macro ПоискСовпаденийВСтроке(Стр1, Стр2, МаксПодстрока,ЧК,ЧС)
НомерСимволаСтр2 = 1;
while (strlen(substr(Стр2,НомерСимволаСтр2,МаксПодстрока))==МаксПодстрока)  
 НомерСимволаСтр1 = 1;
 Выход = 0;
 while ((Выход ==0) and (strlen(substr(Стр1,НомерСимволаСтр1,МаксПодстрока))==МаксПодстрока))
   if (substr(Стр1,НомерСимволаСтр1,МаксПодстрока)!=substr(Стр2,НомерСимволаСтр2,МаксП одстрока))
     НомерСимволаСтр1 = НомерСимволаСтр1 + 1;
   else
     ЧС = ЧС + 1;
     Выход = 1;
   end;
 end; // строка а
 ЧК = ЧК + 1;
 НомерСимволаСтр2 = НомерСимволаСтр2 + 1;
end; // строка б
SetParm(3, ЧК);
SetParm(4, ЧС);
end;

macro НечеткоеСравнениеСтрок(МаксДлинаПодстроки,Стр1,Стр2);
if ((МаксДлинаПодстроки<=0) or (trim(Стр1)=="") or (trim(Стр2)==""))
 return 0;
end;                                                  
ЧК = 0; // Число комбинаций
ЧС = 0; // Число совпадений
ДлинаПодстроки = 1;
while (ДлинаПодстроки<=МаксДлинаПодстроки)
 ПоискСовпаденийВСтроке(Стр1,Стр2,ДлинаПодстроки,ЧК,ЧС);
 ПоискСовпаденийВСтроке(Стр2,Стр1,ДлинаПодстроки,ЧК,ЧС);
 ДлинаПодстроки = ДлинаПодстроки + 1;
end;                                  
if (ЧК == 0)
 return 0;
end;
return double(ЧС)/double(ЧК);
end;

macro FuzzyCompareString(S1,S2)
rez=НечеткоеСравнениеСтрок(3, trim(S1), trim(S2));
println("Процент совпадения: "+(rez*100));
end;                                          

//FuzzyCompareString("ABDUL RAHMAN YASIN","ABDUL RAHMAN");
//----------------------------------------------------------------------
[2] infom ©   (07.05.05 15:35)

Спасибки !
//-------------------------------------------------------------------
<Цитата>

kami ©   (14.09.05 21:46) [2]

[3] Nik_vr   (07.05.05 18:41)

Где нашел - не помню...

//-----------------------------------------------------------
//MaxMatching - максимальная длина подстроки (достаточно 3-4)
//strInputMatching - сравниваемая строка
//strInputStandart - строка-образец

// Сравнивание без учета регистра
// if IndistinctMatching(4, "поисковая строка", "оригинальная строка  - эталон") > 40 then ...
type
TRetCount = packed record
 lngSubRows: Word;
 lngCountLike: Word;
end;

//--------------------------------------------------------------

function Matching(StrInputA: WideString;
StrInputB: WideString;
lngLen: Integer): TRetCount;
var
TempRet: TRetCount;
PosStrB: Integer;
PosStrA: Integer;
StrA: WideString;
StrB: WideString;
StrTempA: WideString;
StrTempB: WideString;
begin
StrA := string(StrInputA);
StrB := string(StrInputB);

for PosStrA := 1 to Length(strA) - lngLen + 1 do
begin
 StrTempA := System.Copy(strA, PosStrA, lngLen);

 PosStrB := 1;
 for PosStrB := 1 to Length(strB) - lngLen + 1 do
 begin
   StrTempB := System.Copy(strB, PosStrB, lngLen);
   if SysUtils.AnsiCompareText(StrTempA, StrTempB) = 0 then
   begin
     Inc(TempRet.lngCountLike);
     break;
   end;
 end;

 Inc(TempRet.lngSubRows);
end; // PosStrA

Matching.lngCountLike := TempRet.lngCountLike;
Matching.lngSubRows := TempRet.lngSubRows;
end; { function }
//------------------------------------------------------------------------------
function IndistinctMatching(MaxMatching: Integer;
strInputMatching: WideString;
strInputStandart: WideString): Integer;
var
gret: TRetCount;
tret: TRetCount;
lngCurLen: Integer; //текущая длина подстроки
begin
 //если не передан какой-либо параметр, то выход
if (MaxMatching = 0) or (Length(strInputMatching) = 0) or
 (Length(strInputStandart) = 0) then
begin
 IndistinctMatching := 0;
 exit;
end;

gret.lngCountLike := 0;
gret.lngSubRows := 0;
 // Цикл прохода по длине сравниваемой фразы
for lngCurLen := 1 to MaxMatching do
begin
     //Сравниваем строку A со строкой B
 tret := Matching(strInputMatching, strInputStandart, lngCurLen);
 gret.lngCountLike := gret.lngCountLike + tret.lngCountLike;
 gret.lngSubRows := gret.lngSubRows + tret.lngSubRows;
     //Сравниваем строку B со строкой A
 tret := Matching(strInputStandart, strInputMatching, lngCurLen);
 gret.lngCountLike := gret.lngCountLike + tret.lngCountLike;
 gret.lngSubRows := gret.lngSubRows + tret.lngSubRows;
end;

if gret.lngSubRows = 0 then
begin
 IndistinctMatching := 0;
 exit;
end;

IndistinctMatching := Trunc((gret.lngCountLike / gret.lngSubRows) * 100);
end;
<Цитата>

default ©   (14.09.05 22:42) [3]

для этого нужно определиться с критерием схожести
естественна такая линия поведения: Вам нужно распознать ситуацию когда человек ошибся в наборе текста по которому хочет что-то найти для помощи ему в его поиске; для этого целесообразно найти какую-нибудь статистику таких ошибок и подумать в связи с ней о том каков должен быть искомый критерий;
пример;
пишет человек слово "Масерта", а хотел "Мастера" то есть возникла перестановка букв, состав прежний; значит стоит перебрать все комбинации букв какие есть в слове "Масерта" и проверить получающиеся комбинации букв на "словарность" - то есть что получаются реальные слова, а не ненаделённые смыслом последовательности букв и тд
это лишь одна возможная ситуация ошибки; поэтому думаю стоит посмотреть на статистику ошибок и подумать как сказано выше над тем какой должен быть критерий
<Цитата>

Джо ©   (14.09.05 22:45) [4]

Алгоритм SoundEx, реализован в StrUtils.pas. Впрочем, кажется, только для английского.
<Цитата>

wicked ©   (14.09.05 22:55) [5]

еще вот такое можно предложить:
http://delphibase.spb.ru/?action=viewfunc&topic=strmath&id=10289

в общем - вариантов море...
<Цитата>

farapiplug   (14.09.05 23:05) [6]

http://itman.narod.ru/index.htm - здесь на эту тему куча информации, хотя по мне, слишком долго разбираться


 
Palladin ©   (2006-04-25 00:00) [3]


> Тимур

С ума не сходи.

"Путник прошел от пункта А до пункта Б"
"Чувак прошконделябрал некое количество расстояния от пункта имени первой буквы алфавита и запнулся об следующую букву"

Одно и тоже между прочим. Выдели корреляционные моменты плиз.


 
Тимур   (2006-04-25 01:31) [4]

да..действительно..долго разбираться..такие методы только для тоталитарного общества...
если серьезно, то и вправду гемор...
нашел вот FuzzySearch...но без исходных кодов...
слышал еще про self organizing maps..


 
atruhin ©   (2006-04-25 04:52) [5]

По теме, если насколько я понимаю, это попытка найти списанные/скачанные из инета работы, то межет подойдет простой алгоритм. Удаляем из строк все пробелы, табуляции, ищем полностью совпадающие строки, выводим % совпадающих строк, и эти строки. Преподаватель смотрит.


 
balepa ©   (2006-04-25 09:35) [6]

А если взять один и тот же код и поменять в одном названия процедур, функций и переменных и т. д. что анализатор скажет ?


 
Calm ©   (2006-04-25 10:34) [7]

а для чего такая автоматизация?
По своему опыту могу сказать, что определить какой студент принес списанную/модифицированную работу - легко и времени много не занимает.


 
evvcom ©   (2006-04-25 10:40) [8]

Главное, не то, что студент списал или не списал, а разобрался или не разобрался. Подавляющее большинство списывальщиков не могут объяснить даже, для чего предназначена та или иная стандартная функция, не говоря уже о том, чтобы пояснить, как работает "его" произведение.



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2006.05.21;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.014 c
2-1146549580
wirg
2006-05-02 09:59
2006.05.21
Подскажите в чём ошибка


2-1146324731
AlexanderMS
2006-04-29 19:32
2006.05.21
Более оптимальный код


2-1146625853
unlink
2006-05-03 07:10
2006.05.21
код символа


2-1146666776
De
2006-05-03 18:32
2006.05.21
Деструктор в DLL есть?


1-1144907581
vidiv
2006-04-13 09:53
2006.05.21
TAction.OnUpdate против эффективности





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский