Виявлення кластерів "подібних" вихідних кодів


10

Припустимо, у мене 400 студентів (це у великому університеті), які повинні робити проект з інформатики, і що їм доведеться працювати поодинці (немає групи студентів). Як приклад проекту можна навести "реалізацію алгоритму швидкої трансформації фур'є у фортран" (я знаю, це не звучить сексуально, але це робить моє питання простішим). Я є коректором, і я хочу надіслати підпрограми, щоб перевірити, чи є групи студентів, які запропонували реалізацію, які "занадто схожі, щоб бути написаними по-справжньому".

Це непідконтрольний пошук кластерів. Я думаю, що питання стосується більше того, які атрибути використовувати, а не того, який алгоритм кластеризації використовувати. Перше, що я зробив би - це лист за буквою гістограмою. В ідеалі, оскільки обдурювачі розумніші за це, я б, нарешті, спробував правильно підібрати випадкові перестановки літер, щоб побачити, чи існує хороша відповідність гістограми букви (з перестановкою). Крім того, що ті, хто не досліджує структуру коду, лише граничний розподіл літер ... яке рішення у вас є? чи існують програмне забезпечення або пакети, присвячені цій проблемі? (насправді в мої старі часи вчителі інформатики заявляли, що вони мають такий інструмент, але зараз я підозрюю, що у них було щось дуже просте)

Я думаю, що у юристів із розробки програмного забезпечення є такий тип питань (не з 1000 студентами, а з двома великими кодами ... що ускладнює справи)?

Відповіді:


4

Очевидний крок попередньої обробки - об’єднання файлів, які справді однакові.

Після цього ключовим є нормалізація . У якийсь момент студенти почнуть рефакторинг коду, перейменування змінних тощо. Або переробити коментарі. На це занадто сильно впливає буквена гістограма (плюс вона охопить багато властивостей мови).

Поширена техніка полягає у використанні мовного аналізатора та перетворення вихідного коду в абстрактне синтаксичне дерево. Потім витягніть з цього функції. І, можливо, паралельно проаналізуйте коментарі.

Тоді існує лінійний підхід "найдовшого загального підпорядкування". Якщо ви маєте досить гарну схожість в одиночних рядках, ви можете шукати найдовшу загальну підпорядкованість будь-яких двох файлів. Це також дасть низку матчів.


Хотілося лише додати, що найдовший загальний підряд можна ефективно знайти за допомогою дерев суфіксів або суфіксних масивів.
sebp

Дякую Аноні, мені дуже подобається дух вашої відповіді (і її схвалив). Це звучить як справжня статистика високих розмірів із "перетворенням даних" та пошуком екстремальних зразків. Яку відстань ви поставили б на цих деревах?
Робін Жирард

Я не є експертом для подібності уявлень AST. Я вважаю, що існує поняття "симуляція" в тому сенсі, що одне дерево - це особливий вид піддерев'я іншого. Для порівняння AST, я думаю, вам потрібно буде їх вирівняти і порахувати відносні відмінності. Можливо, не враховуючи порядок гілок, тому тривіальне впорядкування коду не змінює результати. Будьте в курсі, що ви можете дійти до того, що ви отримаєте помилкові позитиви, тому що просто є n способів ефективного вирішення проблеми, і ви отримуєте помилкові позитиви лише тому, що вони знайшли правильне рішення ...
Мав QUIT - Anonymous-Mousse

0

Із світу проти плагіату я раніше стикався з поняттям "Графічний ізоморфізм". Можливо, ви також можете поглянути на це.

LCS - Можлива і найдовша спільна послідовність. Але спробуйте порівняти всі ці рішення і побачити, що найкраще :)


Ласкаво просимо на цей сайт! Чи можете ви надати кілька посилань на вищезазначені роботи, а може бути й більше деталей, щоб читачі могли краще зрозуміти, як графний ізоморфізм чи ЖКС можуть вирішити проблему?
chl
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.