Найти дублированный контент, используя MySQL и PHP - PullRequest
1 голос
/ 13 сентября 2009

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

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

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

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

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

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

Спасибо! Mike

Ответы [ 3 ]

1 голос
/ 13 сентября 2009

Схожесть текста / плагиат / дубликат - большая тема. Есть так много алгоритмов и решений.

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

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

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

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

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

0 голосов
/ 13 сентября 2009

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

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

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

0 голосов
/ 13 сентября 2009

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

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

...