Во-первых, обратите внимание, что меня интересует, как это работает, и я не собираюсь создавать его для клиента и т. Д., Так как я уверен, что уже могут быть реализации с открытым исходным кодом.
Как работают алгоритмы, которые обнаруживают плагиат в загруженном тексте? Использует ли он регулярное выражение для отправки всех слов в индекс, выделяет известные слова типа «the», «a» и т. Д., А затем видит, сколько слов одинаково в разных эссе? Есть ли у них волшебное количество одинаковых слов, которые обозначают его как возможный дубликат? Использует ли он levenshtein () ?
Мой язык выбора – PHP.
ОБНОВИТЬ
Я думаю о том, чтобы не проверять плагиат во всем мире, но, скорее, в 30 загруженных эссе из класса. В случае, если ученики собрались вместе на одноуровневое задание.
Вот онлайн-сайт, который утверждает, что делает это: http://www.plagiarism.org/
Хорошее обнаружение плагиата будет применять эвристику на основе типа документа (например, эссе или программного кода на определенном языке).
Однако вы также можете применить общее решение. Посмотрите на нормализованное расстояние сжатия (NCD). Очевидно, вы не можете точно рассчитать сложность текста Колмогорова , но вы можете приблизиться к нему, просто сжимая текст.
Меньше NCD указывает, что два текста более похожи. Некоторые алгоритмы сжатия дают лучшие результаты, чем другие. К счастью, PHP обеспечивает поддержку нескольких алгоритмов сжатия, поэтому вы можете безостановочно запустить свой код обнаружения плагиата, управляемый NCD. Ниже я приведу пример кода, который использует Zlib :
PHP:
function ncd($x, $y) { $cx = strlen(gzcompress($x)); $cy = strlen(gzcompress($y)); return (strlen(gzcompress($x . $y)) - min($cx, $cy)) / max($cx, $cy); } print(ncd('this is a test', 'this was a test')); print(ncd('this is a test', 'this text is completely different'));
Python:
>>> from zlib import compress as c >>> def ncd(x, y): ... cx, cy = len(c(x)), len(c(y)) ... return (len(c(x + y)) - min(cx, cy)) / max(cx, cy) ... >>> ncd('this is a test', 'this was a test') 0.30434782608695654 >>> ncd('this is a test', 'this text is completely different') 0.74358974358974361
Обратите внимание, что для больших текстов (читайте: фактические файлы) результаты будут гораздо более выраженными. Попробуйте и сообщите о своих впечатлениях!
Я думаю, что эта проблема сложна и не имеет лучшего решения. Вы можете обнаружить точное дублирование слов на всем уровне документа (т.е. кто-то загружает все эссе из Интернета) вплоть до уровня фразы. Выполнение этого на уровне документа довольно просто – наиболее тривиальное решение будет принимать контрольную сумму каждого представленного документа и сравнивать его с списком контрольных сумм известных документов. После этого вы можете попытаться обнаружить плагиат идей или найти предложения, которые были скопированы непосредственно, а затем слегка изменены, чтобы сбросить программное обеспечение, подобное этому.
Чтобы получить что-то, что работает на уровне фразы, вам может потребоваться более сложный, если вы хотите любой уровень эффективности. Например, вы можете искать различия в стиле письма между абзацами и фокусировать свое внимание на параграфах, которые кажутся «неуместными» по сравнению с остальной частью статьи.
Там есть много работ по этой теме, поэтому я подозреваю, что пока нет идеального решения. Например, в этих двух статьях приводятся некоторые общие проблемы с этим программным обеспечением и есть множество ссылок, которые вы могли бы углубить, если хотите.
http://ir.shef.ac.uk/cloughie/papers/pas_plagiarism.pdf
http://proceedings.informingscience.org/InSITE2007/IISITv4p601-614Dreh383.pdf
Это действительно зависит от «плагиата от того места». Если вы говорите в контексте одного сайта, это сильно отличается от Интернета, или библиотеки congres, или …
http://www.copyscape.com/ довольно много доказывает, что это можно сделать.
Основная концепция, похоже,
Детальная часть анализа, безусловно, может быть схожей, поскольку это сравнение 1 к 1, но ключевым фактором является поиск и получение исходных документов.
Для получения лучших результатов по не очень большим строкам:
Существуют проблемы с непосредственным применением формулы НИЗ по строкам или небольшим текстам. NCD (X, X) не равно нулю (!). Чтобы удалить этот артефакт, вычтите сравнение.
См. Аналогичную демонстрацию_NCD_gzip () по адресу http://leis.saocarlos.sp.gov.br/SIMILAR.php
function similar_NCD_gzip($sx, $sy, $prec=0, $MAXLEN=90000) { # NCD with gzip artifact correctoin and percentual return. # sx,sy = strings to compare. # Use $prec=-1 for result range [0-1], $pres=0 for percentual, # $pres=1 or =2,3... for better precision (not a reliable) # Use MAXLEN=-1 or a aprox. compress lenght. # For NCD definition see http://arxiv.org/abs/0809.2553 # (c) Krauss (2010). $x = $min = strlen(gzcompress($sx)); $y = $max = strlen(gzcompress($sy)); $xy= strlen(gzcompress($sx.$sy)); $a = $sx; if ($x>$y) { # swap min/max $min = $y; $max = $x; $a = $sy; } $res = ($xy-$min)/$max; # NCD definition. # Optional correction (for little strings): if ($MAXLEN<0 || $xy<$MAXLEN) { $aa= strlen(gzcompress($a.$a)); $ref = ($aa-$min)/$min; $res = $res - $ref; # correction } return ($prec<0)? $res: 100*round($res,2+$prec); }
Ну, прежде всего, вы должны понять, с чем вы против.
Дословный плагиат должен быть смехотворно прост. Самый наивный подход состоял бы в том, чтобы взять кортежи длиной достаточной длины и сравнить их с вашим корпусом. Достаточная длина может быть невероятно низкой. Сравните результаты Google:
"I think" => 454,000,000 "I think this" => 329,000,000 "I think this is" => 227,000,000 "I think this is plagiarism" => 5
Поэтому даже при таком подходе у вас есть очень высокий шанс найти хороший матч или два (забавный факт: большинство преступников действительно глупые).
Если плагиатор использовал синонимы, изменил порядок слов и т. Д., Очевидно, что это становится немного сложнее. Вам также придется хранить синонимы и пытаться нормализовать грамматическую структуру, чтобы поддерживать тот же подход. То же самое касается орфографии, конечно (например, попытайтесь сопоставить по нормализации или попытайтесь объяснить отклонения в ваших соответствиях, как и в подходах NCD, опубликованных в других ответах).
Однако самой большой проблемой является концептуальный плагиат. Это действительно сложно, и нет очевидных решений без разбора семантики каждого предложения (т. Е. Достаточно сложного AI).
Правда, правда, вам нужно всего лишь найти НЕКОТОРЫЙ вид матча. Вам не нужно найти точное соответствие, чтобы найти соответствующий текст в вашем корпусе. Окончательная оценка всегда должна быть сделана человеком в любом случае, так что это нормально, если вы найдете неточное совпадение.
Плагиаты в основном глупы и ленивы, поэтому их копии будут глупыми и ленивыми. Некоторые прикладывают невероятные усилия в свою работу, но эти работы часто являются неочевидным плагиатом в первую очередь, поэтому трудно отследить программно (т.е. если у человека возникают проблемы с распознаванием плагиата с обоими текстами, представленными бок о бок , скорее всего, будет и компьютер). Для всех остальных 80% -или-то, глупый подход достаточно хорош.