Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.21;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.038 c
2-1146143675
Hitkliff
2006-04-27 17:14
2006.05.21
Формы


3-1143716463
wsm-100
2006-03-30 15:01
2006.05.21
Как получить список имен БД на сервере MSSQL


2-1146674856
Simplest
2006-05-03 20:47
2006.05.21
запуск стороннего приложения


2-1146647312
Sw
2006-05-03 13:08
2006.05.21
Компонент TdxDBTreeView


15-1145547611
Mozgan
2006-04-20 19:40
2006.05.21
Как обработать событие OnClick???