Отсев похожих записей?

Здравствуйте!


У нас в проекте пользователи добавляют материал — это текстовая строка, длинной до 300 символов.

Очень много встречается дубликатов. Хотел бы при добавлении сделать проверку: если добавляемая строка похоже на 90% с уже добавленными, то не давать добавить.


В качестве БД используется MySQL.


На данный момент пришло в голову решение такое:


— убираем из строки все знаки препинания и пробелы

— опускаем в нижний регистр

— делаем md5 хеш полученного

— добавляем хеш в отдельное поле в БД

— при добавлении нового — сверяем, нет ли такого в БД


Решение не самое лучшее, возможно есть что-нибудь по лучше?


P.S. Записей примерно 10 тыс. в сутки добавляется 500 новых. Есть возможность задействовать sphinx, но не нашел в нем похожего функционала.
  • Вопрос задан
  • 4543 просмотра
Пригласить эксперта
Ответы на вопрос 4
Gluttton
@Gluttton
Помоему существующий подход позволет отсеивать не похожие записи, а идентичные…

Я думаю, что это задача, крайне сложная, если вообще выполнимая и пожалуй это больше не к БД, а к ИИ. Предположим есть два сообщения:
1. Как мне отсивать похожие записи в БД?
2. Какой есть способ предупреждения дублирования записей в БД?
Они похожи?

На мой взгляд лучше всего предоставить решение этой задачи пользователям, например предложив ему перед публикацией взглянуть по ссылке типа «А здесь смотрели», в которой например в порядке реливантности будут идти 5 — 10 ссылок на сообщения, в которых, максимально встречались слова из публикуемого сообщения. Так же можно приспособить для этого теги и искать сообщия не только по словам, но и по тегам (или же вообще только по тегам).

Ну это так, полемика. На практике с таким никогда сталкиваться не приходилось.
Ответ написан
Комментировать
Сделать для каждого материала сайт, отправить их на индексацию в Яндекс, если оба будут в индексе, то сможно считать их различным :)

А если серьезно, то есть сервисы и программы, позволяющие оценивать схожесть текстов (распростаненны у сеошников и их помощников-рерайтеров). С открытыми исходниками не встречал таких, но можно попробовать с авторами договоритться или использовать сервис/программу как внешний сервис/модуль.

Сам с ходу бы решал бы задачу так:
— составляем список слов в материале (можно с количеством встречающихся слов)
— выбрасываем «мусор» (предлоги, союзы, «спасибы» и «пожалуйсты»)
— получаем список «тегов»
— ищем материал(ы), список которого наиболее полно совпадает с текущим списком (например, в цикле по текущему списку получаем N первых материалов с этим тегом и берём самый(е) часто встретившийся)
— смотрим как похож текущий на найденный(е) (критерий задаётся в настройках, например, если больше 80% совпадает, то считаем похожим)
— если не похож (совпадений меньше 80%), то публикуем
— если похож, то отправляем пользователю эти сообщения с вопросом «Вы это же имели в виду?», если пользователь говорит «нет», то публикуем, если «да», то ничего не делаем

После первоначального запуска следим за качеством фильтра (сначала можно следить прозрачно для пользователей, отмечая схожие материалы только в БД/админке) и по необходимости изменяем порог похожести, словарь незначащих слов, может быть вводим понятия синонимов и/или обрезаем слова до основы (открытые продукты кажется даже описывались на хабре недавно), учитываем словосочетания, позицию слов в материале/предложении… В общем постепенно превосходим алгоритмы автоматического опредления дублирующегося контента в гугле/яндексе, продаём им их и забываем про пользователей, которым лень поискать самим перед публикацией :)

Ещё один подход — сделать нейронную сеть, обучить её на имеющейся базе и подучивать в процессе, но тут я затрудняюсь оценить даже приблизетельно ресурсоемкость и разработки, и собственно анализа. Ну или семантический анализатор разработать :)
Ответ написан
Комментировать
@Sandrique
Скорее всего вам подойдут шинглы — habrahabr.ru/blogs/algorithm/65944/
Ответ написан
Комментировать
lashtal
@lashtal
Расстояние Хэмминга en.wikipedia.org/wiki/Hamming_distance
Расстояние Левенштейна en.wikipedia.org/wiki/Levenshtein_distance
Расстояние Дамерау—Левенштейна en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы