Какие алгоритмы можно использовать для обнаружения дубликатов статей или сообщений?

17

Я пытаюсь определить, является ли статья или сообщение на форуме дублирующейся записью в базе данных. Я подумал об этом, и пришел к выводу, что кто-то, кто дублирует контент, сделает это, используя один из трех (по убыванию трудно обнаружить):

  1. просто скопируйте и вставьте весь текст
  2. копировать и вставлять части текста, объединяя его со своими собственными
  3. скопировать статью с внешнего сайта и маскировать под себя

Подготовка текста для анализа

В основном любые аномалии; цель состоит в том, чтобы сделать текст как можно более «чистым». Для более точных результатов текст «стандартизирован»:

  1. Удаление дублирующих пробелов и обрезка ведущих и конечных.
  2. Новые строки стандартизированы в \ n.
  3. HTML-теги удалены.
  4. Использование RegEx под названием Daring Fireball URL-адреса удаляются.
  5. Я использую BB-код в своем приложении, чтобы перейти к.
  6. (ä) ccented и иностранные (кроме английского) преобразуются в их не иностранную форму.

Я храню информацию о каждой статье в (1) таблице статистики и в (2) таблице ключевых слов.

(1) Таблица статистики Следующие статистические данные хранятся о текстовом содержании (так же, как этот пост)

  1. длина текста
  2. количество букв
  3. количество слов
  4. количество предложений
  5. среднее количество слов в предложении
  6. индекс автоматической читаемости
  7. стрельба туман

Для европейских языков следует использовать Coleman-Liau и Automated Readability Index, поскольку они не используют подсчет слогов, поэтому должны давать достаточно точную оценку.

(2) Таблица ключевых слов

Ключевые слова генерируются путем исключения огромного списка стоп-слов (общих слов), например, «the», «a», «of», «to» и т. Д., И т. Д.

Образец данных

  • длина текста, 3963
  • Letter_count, 3052
  • word_count, 684
  • суждение_счет, 33
  • word_per_sentence, 21
  • gunning_fog, 11,5
  • auto_read_index, 9,9
  • ключевое слово 1 убито
  • Ключевое слово 2, офицеры
  • Ключевое слово 3, полиция

Следует отметить, что после обновления статьи все приведенные выше статистические данные восстанавливаются и могут иметь совершенно разные значения.

Как я могу использовать вышеуказанную информацию, чтобы определить, существует ли статья, которая публикуется впервые, уже существует в базе данных?


Я знаю, что все, что я спроектирую, не будет идеальным, самый большой риск - (1) Контент, который не является дубликатом, будет помечен как дубликат (2) Система пропускает дублированный контент.

Таким образом, алгоритм должен генерировать число оценки риска от 0, не являющегося дублирующим риском, 5 от возможного дублирования и от 10, являющегося дублирующим. Что-нибудь выше 5 тогда есть хорошая вероятность, что содержание дублируется. В этом случае контент можно пометить и связать со статьями, которые являются возможными дубликатами, и человек может решить, удалять или разрешать.

Как я уже говорил, я храню ключевые слова для всей статьи, однако мне интересно, смогу ли я сделать то же самое на основе абзацев; это также будет означать дальнейшее разделение моих данных в БД, но это также облегчит обнаружение (2) в моем первоначальном посте.

Я думаю, взвешенное среднее между статистикой, но в каком порядке и каковы будут последствия ...

Майкл
источник
Если это точное совпадение, вы можете просто установить поле на уникальное. Если нет, вам нужно решить, в какой момент текст может считаться копией или произведением, тесно связанным с ним.
Джеймс П.
2
Есть много направлений, в которых может идти этот анализ. Люди пишут целые книги на эту тему. Если ваша цель - определить «относительную близость», у вас действительно нет другого выбора, кроме как углубиться в то, что называется Обработка естественного языка и машинное обучение . Это то, что компьютерные ученые называют это, но на самом деле это просто расширенный статистический анализ. Хорошей отправной точкой может быть рассмотрение расстояний Левенштейна, но «тупые» показатели, такие как количество слов / предложений, скорее всего, мало что сделают для вас.
rdlowrey
1
Кроме того, до того как он был перенесен из SO, он был помечен [php], так что вы можете проверить встроенную функцию php levenshtein
rdlowrey
Отличная идея иметь человеческий чек, скорее всего, дублирует! Возможно, вы сможете автоматически решить, что> 7 является дубликатом, а <6 отличается, и только люди проверяют баллы по 6 или 7. Я знаю, что при идентификации спама существует машина «не знаю, а человек» категория "не знаю-либо"; серая область между почти дубликатом и оригинальной работой, где лучшее, что вы можете сделать, это сделать несколько произвольный суждений.
ГленПетерсон
@rdlowrey - алгоритмы Левенштейна - это то, что я использовал в аналогичном проекте, который я делал в C #. Я согласен, это хорошее место для начала и может быть достаточно.
jfrankcarr

Ответы:

4

Есть много алгоритмов, которые имеют дело с подобием документа в НЛП. Вот оригинальный документ, описывающий различные алгоритмы. Также в Википедии есть большая коллекция. Я предпочитаю меру Джаро Винклера и использую ее для проектов аспирантуры в методах агломерационной кластеризации.

Кандид
источник
6

Взгляните на алгоритм Рабина-Карпа . Он использует скользящий хеш, аналогичный rsync, чтобы минимизировать количество байтов, передаваемых во время синхронизации. Регулируя размер окна, которое вы используете для хэша, вы можете сделать его более или менее чувствительным. РК используется, помимо прочего, для обнаружения плагиата, который в основном ищет своего рода обманщиков.

Питер Роуэлл
источник
4
Проблема, которую описывает OP, похожа на обнаружение плагиата , и я бы посоветовал это в первую очередь обратиться за помощью. (Только не забудьте указать свои источники!)
Калеб
4

Первым делом можно было бы обнаружить предложения (или какой-то другой разумный блок данных. Возьмите эти блоки и удалите любые метаданные, случайные пробелы в формате html, возвраты и т. Д. Возьмите результат MD5 и сохраните его в таблице. Вы могли бы затем сопоставьте эти блоки, чтобы попытаться найти совпадения.

Если это не работает, вы можете попробовать n-грамм. Здесь вам нужна одна запись каждого слова на странице, но она должна быть в состоянии дать вам довольно хорошие совпадения.

http://en.wikipedia.org/wiki/N-gram

gam3
источник
Показатели, основанные на n-граммах, намного лучше, чем хэши md5, особенно для полуструктурированных данных, таких как html.
Кандидат
1

Для точной математической математики я бы сохранил хеш, а затем сравнил бы его.

Я думаю, что системы, которые используются для экзаменов, измеряют группы слов, а затем частоту групп каждого размера. Например, цепочка из 30 слов, которые будут скопированы, даст 5 баллов риска, а 5 вхождений из 10 цепочек слов - 5 баллов. Тогда вы получите 30 очков на 500 слов.

На самом деле вам нужен семантический алгоритм, чтобы такие слова, как «также» и «и» были проанализированы как одинаковые.

Перевернутая лама
источник