Разработка шумового фильтра для двигателя обнаружения плагиата в Ruby - PullRequest
3 голосов
/ 17 декабря 2011

Я работал над внедрением механизма обнаружения плагиата, основанного на академической статье за ​​MOSS (показатель сходства программного обеспечения)

Ссылка на МОСС

Для разработки шумового фильтра для такого языка, как C / C ++ / Java, я должен принять несколько решений.

Имеют ли ключевые слова релевантные для выявления плагиата или они должны быть удалены? Исходные файлы на одном языке должны иметь одинаковый набор ключевых слов. В статье не обсуждается, как с ними бороться.

Как обращаться с идентификаторами? Замена всех ключевых слов одним символом 'V' делает сопоставление независимым от имени переменной.

Что делать с импортом пакетов и библиотекой?

Пробелы, комментарии и знаки препинания должны быть обязательно удалены.

Мне интересно, что после выполнения всех операций исходный файл будет просто буквой 'V' и некоторым другим искаженным текстом.

Какие операции должен выполнять шумовой фильтр?

Выводы и мнения о лучшем способе борьбы с шумом?

Ответы [ 2 ]

1 голос
/ 17 декабря 2011

Для отдельных функций: скомпилируйте их и сравните полученный ассемблерный код или объекты.Для всей программы: выполните все вышеперечисленное для всех функций и создайте нечеткий поиск, чтобы найти фрагменты в базе данных известных функций и фрагментов.

Таким образом, в основном вам нужно создать компилятор, который выдаетКанонизированное представление его входных данных, аналогично P-коду, но желательно удобочитаемому человеку.

Некоторые фрагменты более характерны, чем другие, фрагмент

for (i=0; i < 12345; i++) {
  array[i] = 54321;
  }

Вероятно, произойдет в той или иной форме вкаждая программа.Он на 100% функционально идентичен

j=0;
while ( j < 12345) {
  foobar[j++] = 54321;
  }

, и компилятор, вероятно, выдаст идентичный код.

Могут быть различия в именах переменных, числовых константах, константах адреса, чем угодно.Но «скелет» ключевых слов (-> {сравнения, циклы, выражения, присваивания, вызовы функций}) будет таким же.Итак: не отбрасывайте ключевые слова, они являются основой программы.

0 голосов
/ 03 ноября 2015

В Google можно найти много интересного, если вы ищете "текстовый отпечаток пальца". Черепица - это х-слово (х = 7 во многих исследовательских проектах). Вы строите набор всех черепиц слово за словом.

Вы строите хэш над галькой, а затем сравниваете 1000-ю гонт в тексте. Это довольно просто. Есть несколько вещей, таких как специальные хеш-функции, которые вы наверняка не слышали вне этого контекста и т. Д.

Начните с чтения, например, это не ракетостроение, но и не тривиальное.

«Эффективное определение происхождения текста» Бесник Фетаху, Андреас Фрише http://resources.mpi -inf.mpg.de / d5 / обучение / ws10_11 / хир / отчеты / BesnikFetahu.pdf

«Алгоритмы для дубликатов документов», Андрей Бродер http://www.cs.princeton.edu/courses/archive/spr05/cos598E/bib/Princeton.pdf

...