Поиск дублирующегося контента с помощью MySQL и PHP

У меня возникла проблема при разработке моего веб-приложения, вот описание:

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

Я придумал следующие шаги:

  1. При отправке извлекает длину текста и сохраняет ее в отдельной таблице (article_id,length), проблема заключается в том, что статьи кодируются с помощью функции PHP special_entities(), а пользователи публикуют контент с небольшими изменениями (некоторые можно пропустить запятую, ударение или даже пропустить некоторые слова)
  2. Затем извлеките все записи из базы данных с диапазоном длины = new_post_length +/- 5% (должен ли я использовать другой порог, имея в виду человеческий фактор при отправке статей?)
  3. Получите первые 3 ключевых слова и сравните их со статьями, полученными на шаге 2.
  4. Имея окончательный массив с наиболее вероятными совпадениями, сравните новую запись, используя функцию PHP levenstein().

Этот процесс должен выполняться при отправке статьи, а не с использованием cron. Однако я подозреваю, что это создаст большие нагрузки на сервер.

Не могли бы вы дать какую-нибудь идею, пожалуйста?

Спасибо! Майк


person Mike    schedule 12.09.2009    source источник
comment
Можете ли вы определить, что такое дублированный контент? Как вы это определяете?   -  person Joe Phillips    schedule 13.09.2009
comment
Дублированный контент — это контент, взятый из одного и того же источника (журнала, веб-страницы и т. д.) и размещенный двумя разными людьми.   -  person Mike    schedule 13.09.2009
comment
Если контент представлен сообществом, почему бы не позволить им также управлять им? Кроме того, категоризация источника и жанра облегчит обнаружение дубликатов.   -  person OMG Ponies    schedule 13.09.2009


Ответы (3)


Текстовое сходство/плагиат/дублирование — большая тема. Алгоритмов и решений очень много.

Ленвенштейн в вашем случае не подойдет. Вы можете использовать его только для небольших текстов (из-за его «сложности» он убьет ваш процессор).

В некоторых проектах используется «адаптивное локальное выравнивание ключевых слов» (информацию об этом можно найти в гугле).

Кроме того, вы можете проверить это (проверьте 3 ссылки в ответе, очень поучительно):

Сходство косинуса и расстояние Хэмминга

Надеюсь, это поможет.

person Toto    schedule 13.09.2009

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

Это открытый исходный код, и в основном он написан в небольших специализированных программах на C. Возможно, есть что-то, что вы могли бы использовать.

person gahooa    schedule 12.09.2009

Вы можете спроектировать свое приложение так, чтобы уменьшить нагрузку, не сверяя текстовые строки и ключевые слова со всеми другими сообщениями в той же категории. Что, если бы вы попросили пользователей отправлять сторонний контент, на который они ссылаются, в виде URL-адресов? См. реализацию Tumblr — в основном это текстовое поле произвольной формы, поэтому каждый пользователь может комментировать и создавать свою собственную описательную часть контента публикации, но также есть форматированные поля, также зависящие от типа ссылки, которую добавляет пользователь (видео, изображение, ссылка, цитата и т. д.) Улучшением Tumblr было бы предоставление пользователю возможности добавлять столько/несколько типов форматированного контента, сколько они хотят, в любой пост.

Затем вы проверяете только известные типы, такие как URL-адрес или код встроенного видео. Объедините это с предложением rexem заставить пользователей классифицировать по какой-либо категории или жанру, и у вас будет гораздо меньше возможностей для поиска дубликатов.

Кроме того, если вы можете предоставить каждому пользователю какой-либо способ публикации в своем собственном «потоке», тогда не имеет значения, если многие люди дублируют один и тот же контент. Дайте людям возможность проголосовать за переход от отдельных потоков к основному потоку уровня «главной страницы», чтобы сообщество могло регулировать, когда они видят повторяющиеся элементы. Вместо голосования за/против, как Digg или Reddit, вы можете добавить способ для людей объединять/добавлять сообщения к связанным сообщениям (позволяя им сортировать и управлять контентом как действие в вашем приложении, а не делать это проблемой позади обработка сцен).

person KellyRued    schedule 12.09.2009