- •Содержание
- •Введение Актуальность магистерской диссертации
- •Понятие плагиата
- •Специфика понятия «плагиат» в программировании: окончательный вывод о заимствовании делает человек
- •Постановка задачи
- •1.1 Необходимость дополнительной проверки на основе анализа структурного анализа кодов
- •1.2 Общая схема работы модулей инструментальной системы поиска плагиата
- •Теоретические основы поиска плагиата в исходных кодах программ
- •2.1 Классификация методов поиска плагиата в программировании
- •2.2 Атрибутные методы поиска плагиата
- •2.3 Структурные методы поиска плагиата
- •2.3.1 Строковое выравнивание
- •2.3.2 Метод поиска на xml-представлении
- •2.3.3 Использование приближения Колмогоровской сложности
- •2.3.4 Метод идентификационных меток
- •2.3.5 Нейросетевые методы обнаружения плагиата
- •2.4 Другие методы
- •Методы поиска плагиата в произвольных текстах
- •3.1 Локальные методы
- •3.1.2 Методы на основе меры tf
- •3.1.3 Методы, использующие понятия шинглов
- •3.1.4 Методы, использующие семантические сети
- •3.2 Глобальные методы
- •3.2.1 Методы на основе меры tf-idf
- •3.2.3 Метод «опорных» слов
- •3.3 Метод шинглов
- •Разбиение на шинглы;
- •Вычисление хешей шинглов;
- •3.3.1 Канонизация текстов
- •3.3.2 Разбиение на шинглы
- •3.3.3 Вычисление хешей шинглов
- •3.4 Дистанция (расстояние) Левенштейна
- •3.4.1 Алгоритм Вагнера — Фишера
- •3.5. Наибольшая общая последовательность (longest common subsequence, lcs)
- •3.6 Вычисление хеш-функции
- •3.6.1 Параметры вычисление хеш-функции: полином-генератор, разрядность и стартовое слово
- •3.6.2 Популярные и стандартизованные полиномы
- •3.7 Виды представления исходного кода
- •3.8 Представление исходного кода в виде токенов
- •Обзор инструментальных средств и сервисов анализа плагиата в программах и произвольных текстах
- •4.1 Обзор программ поиска плагиата в программировании
- •4.2 Обзор сервисов поиска плагиата
- •4.3 Обзор программ поиска плагиата в произвольных текстах
- •Описание используемых методов поиска плагиата в исходных кодах и произвольных текстах
- •5.1 Общая схема поиска
- •5.1.1 Cхема поиска для исходных кодов
- •5.1.2 Основной структурный метод для анализа исходных кодов
- •5.1.2.1 Достоинства и недостатки
- •5.1.3 Дополнительный атрибутный метод для исходных текстов
- •5.1.3.1 Достоинства и недостатки
- •5.2.1 Cхема поиска для произвольных текстов (в том числе и программ)
- •Программная реализация модуля поиска плагиата методами анализа исходных кодов программ
- •6.1 Интерфейс модуля поиска плагиата в исходных кодах программ
- •6.1.1 Главное окно модуля поиска плагиата методами анализа исходных кодов
- •6.1.2 Окно групповых режимов анализа
- •6.2 Взаимодействие модуля поиска плагиата методами анализа исходных кодов
- •6.2.1 Взаимодействие модуля с архивом работ и базой языков (добавление файла в базу)
- •6.2.2 Взаимодействие модуля с архивом работ и базой языков (частотный анализ, автоматический частотный анализ)
- •6.2.3 Взаимодействие модуля с архивом работ и базой языков (автоматический анализ последовательностей операторов)
- •6.2.4. Взаимодействие модуля с архивом работ и базой языков (анализ последовательностей операторов, просчет всех пиков)
- •6.2.5 Взаимодействие модуля с архивом работ и базой языков (удаление файла/языка из базы)
- •6.2.6 Взаимодействие модуля с базой языков (добавление языка в базу)
- •6.2.9 Поиск первоисточника и списка первоисточников
- •6.2.10 Некоторые особенности модуля
- •6.3 Описание отчетов по анализу плагиата
- •6.3.1 Критерии автоматического заключения о наличии плагиата при пакетном и полном анализе
- •6.3.2 Алгоритм поиска первоисточника для файла или списка первоисточников при полном анализе
- •6.3.3 Сводный отчет
- •6.3.4 Итоговый отчет
- •6.3.5 Экспорт итогового протокола в Excel
- •6.3.5.1 Исследование итогового протокола по полученным диаграммам Excel
- •6.3.6 Экспорт списка первоисточников в Excel
- •6.3.6.1 Исследование списка первоисточников в Excel
- •6.4 Пример работы модуля
- •6.4.1 Пример 1 анализа последовательности операторов
- •Режим работы модуля PlagiatSearch с произвольным текстом
- •Режим работы модуля PlagiatSearch с исходным кодом
- •7.1.2 Меню «Анализ» и его возможности для поиска плагиата в произвольных текстах
- •7.1.3 Информационное окно модуля PlagiatSearch поиска плагиата в произвольных текстах с результатами вычисления дистанции Левенштейна
- •7.1.4 Представление результатов нахождения наибольшей общей подпоследовательности (longest common subsequence, lcs)
- •7.1.5 Представление метода шинглов для сравнения произвольных текстов
- •7.1.6 Применение метода шинглов для сравнения исходных кодов
- •Заключение
- •Список использованных источников (библиографический список)
- •Приложение Доработанная блок-схема алгоритма анализа последовательности операторов (с показом наиболее длинного совпадающего фрагмента кода)
- •55. Мд.Иу.Мсавпсрит.Пз
Режим работы модуля PlagiatSearch с произвольным текстом
Режим работы модуля PlagiatSearch с исходным кодом
Рисунок 24 Главное окно модуля PlagiatSearch поиска плагиата методами сравнения произвольных текстов
Первый и основной алгоритм O(NP) [29], реализованный в дипломе и являющийся модификацией алгоритма Вагнера-Фишера, позволяет в большинстве случаев почти в два раза сократить время выполнения по сравнению с алгоритмом O(ND) [28]. Пусть A и B будет две последовательности длины M и N соответственно, где без потери общности N >=M, и пусть D - длина кратчайшего сценария редактирования между ними (shortest edit script). Параметр P, связанный с D - это количество удалений в таком сценарии, P = D/2 −(N −M)/2. Алгоритм нахождения кратчайшего расстояния редактирования A и B имеет в худшем случае время выполнения O(NP) и чьи ожидаемое время O (N +PD). Алгоритм прост и является очень эффективным, особенно когда A похож на B. То есть, как раз в случае подозрений на плагиат.
Второй алгоритм O(ND) [28], реализованный в дипломе и являющийся модификацией алгоритма Вагнера-Фишера, имеет ожидаемое время выполнения O(ND), где N – сумма длин последовательностей A и B, а D – длина кратчайшего сценария редактирования между ними.
7.1.2 Меню «Анализ» и его возможности для поиска плагиата в произвольных текстах
Меню «Анализ» (рисунок 25) становится доступным и применяется после выполнения сравнения произвольных текстов по Левенштейну.
Рисунок 25 Меню «Анализ»
Это меню включает следующие опции:
Вычислить расстояние Левенштейна;
Результат вычисления этого расстояния может интерпретироваться следующим образом: если оно мало, то можно предположить, что второй файл получается из первого файла за минимальное число действий (удаление-изменение-добавление).
Вычислить расстояние Дамерау;
Результат вычисления этого расстояния может интерпретироваться следующим образом: если оно мало, то можно предположить, что второй файл получается из первого файла за минимальное число действий с весовыми коэффициентами (удаление-изменение-добавление). В отличие от простого расстояния Левенштейна расстояние Дамерау позволяет учитывать при поиске плагиата разный вес действий. Например, можно считать, что «добавление» имеет меньшее значение с точки зрения поиска плагиата, чем изменение. Поэтому в этом случае весовой коэффициент операции «добавления» должен быть больше, чем весовой коэффициент операции «изменение». Чем больше операций «добавление» при сравнении файлов и вычислении для них расстояния Дамерау, тем больше будет значение расстояния Дамерау. Следовательно, тем менее похожими можно считать сравниваемые файлы.
Вычислить длину LCS (наибольшей общей подпоследовательности, longest common subsequence)
Показать все совпадающие строки
Смысл введения этой опции следующий: показать, для каждой строки в файле 1 ее дубликаты, которые есть во втором файле. В информационном окне наличие дубликатов представляется следующим образом: если для строки файла 1 есть идентичные строки в файле 2, то они указаны в квадратных скобах через знак равенства. Например, для строки с номером 71 в файле 1 есть идентичная строка в файле 2 с номером 34: [71]=[34] . Кроме того, после выполнения операции поиска совпадающих строк вычисляется длина и место максимального непрерывного фрагмента совпадающих строк (Максимальная длина в строках непрерывного фрагмента совпадающих строк ->5 со строки 33) и фокус в главном окне модуля переводится на это место (рисунок 26). В нашем случае этот фрагмент начинается со строки 33 и имеет длину 5 строк.
Рисунок 26 Поиск всех совпадающих строк в файлах и показ максимального непрерывного фрагмента совпадающих строк
Пример результата в информационном окне показан ниже (синим цветом).
Совпадающие строки в файле 1 и в файле 2:
[2]=[2] [2]=[4] [2]=[7] [2]=[23] [2]=[26] [2]=[28] [2]=[30] [2]=[32] [2]=[38]
[3]=[3]
[4]=[2] [4]=[4] [4]=[7] [4]=[23] [4]=[26] [4]=[28] [4]=[30] [4]=[32] [4]=[38]
[8]=[2] [8]=[4] [8]=[7] [8]=[23] [8]=[26] [8]=[28] [8]=[30] [8]=[32] [8]=[38]
[9]=[8]
[13]=[22]
[33]=[18]
[34]=[19]
[35]=[20]
[36]=[21]
[37]=[22]
[41]=[2] [41]=[4] [41]=[7] [41]=[23] [41]=[26] [41]=[28] [41]=[30] [41]=[32] [41]=[38]
[42]=[2] [42]=[4] [42]=[7] [42]=[23] [42]=[26] [42]=[28] [42]=[30] [42]=[32] [42]=[38]
[43]=[24]
[45]=[2] [45]=[4] [45]=[7] [45]=[23] [45]=[26] [45]=[28] [45]=[30] [45]=[32] [45]=[38]
[51]=[2] [51]=[4] [51]=[7] [51]=[23] [51]=[26] [51]=[28] [51]=[30] [51]=[32] [51]=[38]
[52]=[31]
[55]=[34]
[61]=[2] [61]=[4] [61]=[7] [61]=[23] [61]=[26] [61]=[28] [61]=[30] [61]=[32] [61]=[38]
[63]=[37]
[65]=[34]
[67]=[37]
[71]=[34]
[76]=[2] [76]=[4] [76]=[7] [76]=[23] [76]=[26] [76]=[28] [76]=[30] [76]=[32] [76]=[38]
[77]=[2] [77]=[4] [77]=[7] [77]=[23] [77]=[26] [77]=[28] [77]=[30] [77]=[32] [77]=[38]
[78]=[2] [78]=[4] [78]=[7] [78]=[23] [78]=[26] [78]=[28] [78]=[30] [78]=[32] [78]=[38]
[79]=[37]
[82]=[34]
[85]=[2] [85]=[4] [85]=[7] [85]=[23] [85]=[26] [85]=[28] [85]=[30] [85]=[32] [85]=[38]
[86]=[37]
[88]=[34]
[90]=[37]
[91]=[2] [91]=[4] [91]=[7] [91]=[23] [91]=[26] [91]=[28] [91]=[30] [91]=[32] [91]=[38]
[93]=[34]
[101]=[37]
[102]=[2] [102]=[4] [102]=[7] [102]=[23] [102]=[26] [102]=[28] [102]=[30] [102]=[32] [102]=[38]
[109]=[2] [109]=[4] [109]=[7] [109]=[23] [109]=[26] [109]=[28] [109]=[30] [109]=[32] [109]=[38]
[125]=[2] [125]=[4] [125]=[7] [125]=[23] [125]=[26] [125]=[28] [125]=[30] [125]=[32] [125]=[38]
[131]=[2] [131]=[4] [131]=[7] [131]=[23] [131]=[26] [131]=[28] [131]=[30] [131]=[32] [131]=[38]
[132]=[2] [132]=[4] [132]=[7] [132]=[23] [132]=[26] [132]=[28] [132]=[30] [132]=[32] [132]=[38]
[134]=[37]
[135]=[2] [135]=[4] [135]=[7] [135]=[23] [135]=[26] [135]=[28] [135]=[30] [135]=[32] [135]=[38]
[139]=[34]
[151]=[2] [151]=[4] [151]=[7] [151]=[23] [151]=[26] [151]=[28] [151]=[30] [151]=[32] [151]=[38]
[154]=[37]
[155]=[2] [155]=[4] [155]=[7] [155]=[23] [155]=[26] [155]=[28] [155]=[30] [155]=[32] [155]=[38]
[156]=[39]
Всего найдено совпадающих строк в файле 1 и в файле 2 ->215
Максимальная длина в строках непрерывного фрагмента совпадающих строк ->5 со строки 33
Показать все удаленные в файле 1 строки, которые были добавлены в файле 2.
Смысл введения этой опции следующий: некоторые удаленные из файла 1 строки могут быть просто перемещены в другое место в файле 2. При сравнении файлов по Левенштейну это подозрительное с точки зрения поиска плагиата действие не будет обнаружено. В информационном окне это представляется следующим образом: если для удаленной строки файла 1 есть добавленные строки в файле 2, то они указаны в квадратных скобах через знак равенства. Например, для удаленной строки с номером 52 в файле 1 есть добавленная строка в файле 2 с номером 31: [52]=[31].
Пример результата в информационном окне показан ниже (синим цветом).
Удаленные строки в файле 1 среди добавленных в файле 2:
[41]=[2] [41]=[4] [41]=[7] [41]=[23] [41]=[26] [41]=[28] [41]=[30] [41]=[32] [41]=[38]
[51]=[2] [51]=[4] [51]=[7] [51]=[23] [51]=[26] [51]=[28] [51]=[30] [51]=[32] [51]=[38]
[52]=[31]
[55]=[34]
[61]=[2] [61]=[4] [61]=[7] [61]=[23] [61]=[26] [61]=[28] [61]=[30] [61]=[32] [61]=[38]
[63]=[37]
[65]=[34]
[67]=[37]
[71]=[34]
[76]=[2] [76]=[4] [76]=[7] [76]=[23] [76]=[26] [76]=[28] [76]=[30] [76]=[32] [76]=[38]
[77]=[2] [77]=[4] [77]=[7] [77]=[23] [77]=[26] [77]=[28] [77]=[30] [77]=[32] [77]=[38]
[78]=[2] [78]=[4] [78]=[7] [78]=[23] [78]=[26] [78]=[28] [78]=[30] [78]=[32] [78]=[38]
[79]=[37]
[82]=[34]
[85]=[2] [85]=[4] [85]=[7] [85]=[23] [85]=[26] [85]=[28] [85]=[30] [85]=[32] [85]=[38]
[86]=[37]
[88]=[34]
[90]=[37]
[91]=[2] [91]=[4] [91]=[7] [91]=[23] [91]=[26] [91]=[28] [91]=[30] [91]=[32] [91]=[38]
[93]=[34]
[101]=[37]
[102]=[2] [102]=[4] [102]=[7] [102]=[23] [102]=[26] [102]=[28] [102]=[30] [102]=[32] [102]=[38]
[109]=[2] [109]=[4] [109]=[7] [109]=[23] [109]=[26] [109]=[28] [109]=[30] [109]=[32] [109]=[38]
[125]=[2] [125]=[4] [125]=[7] [125]=[23] [125]=[26] [125]=[28] [125]=[30] [125]=[32] [125]=[38]
[135]=[2] [135]=[4] [135]=[7] [135]=[23] [135]=[26] [135]=[28] [135]=[30] [135]=[32] [135]=[38]
[139]=[34]
[151]=[2] [151]=[4] [151]=[7] [151]=[23] [151]=[26] [151]=[28] [151]=[30] [151]=[32] [151]=[38]
[154]=[37]
Всего найдено удаленных строк в файле 1 среди добавленных в файле 2 ->132
