Я пытаюсь определить, является ли статья или сообщение на форуме дублирующейся записью в базе данных. Я подумал об этом, и пришел к выводу, что кто-то, кто дублирует контент, сделает это, используя один из трех (по убыванию трудно обнаружить):
- просто скопируйте и вставьте весь текст
- копировать и вставлять части текста, объединяя его со своими собственными
- скопировать статью с внешнего сайта и маскировать под себя
Подготовка текста для анализа
В основном любые аномалии; цель состоит в том, чтобы сделать текст как можно более «чистым». Для более точных результатов текст «стандартизирован»:
- Удаление дублирующих пробелов и обрезка ведущих и конечных.
- Новые строки стандартизированы в \ n.
- HTML-теги удалены.
- Использование RegEx под названием Daring Fireball URL-адреса удаляются.
- Я использую BB-код в своем приложении, чтобы перейти к.
- (ä) ccented и иностранные (кроме английского) преобразуются в их не иностранную форму.
Я храню информацию о каждой статье в (1) таблице статистики и в (2) таблице ключевых слов.
(1) Таблица статистики Следующие статистические данные хранятся о текстовом содержании (так же, как этот пост)
- длина текста
- количество букв
- количество слов
- количество предложений
- среднее количество слов в предложении
- индекс автоматической читаемости
- стрельба туман
Для европейских языков следует использовать 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) в моем первоначальном посте.
Я думаю, взвешенное среднее между статистикой, но в каком порядке и каковы будут последствия ...
источник
Ответы:
Есть много алгоритмов, которые имеют дело с подобием документа в НЛП. Вот оригинальный документ, описывающий различные алгоритмы. Также в Википедии есть большая коллекция. Я предпочитаю меру Джаро Винклера и использую ее для проектов аспирантуры в методах агломерационной кластеризации.
источник
Взгляните на алгоритм Рабина-Карпа . Он использует скользящий хеш, аналогичный rsync, чтобы минимизировать количество байтов, передаваемых во время синхронизации. Регулируя размер окна, которое вы используете для хэша, вы можете сделать его более или менее чувствительным. РК используется, помимо прочего, для обнаружения плагиата, который в основном ищет своего рода обманщиков.
источник
Первым делом можно было бы обнаружить предложения (или какой-то другой разумный блок данных. Возьмите эти блоки и удалите любые метаданные, случайные пробелы в формате html, возвраты и т. Д. Возьмите результат MD5 и сохраните его в таблице. Вы могли бы затем сопоставьте эти блоки, чтобы попытаться найти совпадения.
Если это не работает, вы можете попробовать n-грамм. Здесь вам нужна одна запись каждого слова на странице, но она должна быть в состоянии дать вам довольно хорошие совпадения.
http://en.wikipedia.org/wiki/N-gram
источник
Для точной математической математики я бы сохранил хеш, а затем сравнил бы его.
Я думаю, что системы, которые используются для экзаменов, измеряют группы слов, а затем частоту групп каждого размера. Например, цепочка из 30 слов, которые будут скопированы, даст 5 баллов риска, а 5 вхождений из 10 цепочек слов - 5 баллов. Тогда вы получите 30 очков на 500 слов.
На самом деле вам нужен семантический алгоритм, чтобы такие слова, как «также» и «и» были проанализированы как одинаковые.
источник