Задать вопрос

Поиск статьи в БД и вычет % схожести

Реально ли такое сделать?

Есть БД со статьями. При добавлении новой нужно искать в БД есть ли что то похожее на нее.
Читать все по очереди и сравнивать очень не выгодно со стороны нагрузки.
Возможно составить какой то хеш по которому и искать?
  • Вопрос задан
  • 2794 просмотра
Подписаться 13 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
sergeypid
@sergeypid
Для приблизительного сравнения текстов есть такой способ: составить нулевую матрицу 30х30, координаты матрицы — буквы алфавита. Пробегаемся по тексту и считаем, сколько раз в текста встречались последовательные пары букв. Например, если видим подряд буквы А и Б, прибавляем 1 к элементу [0, 1] матрицы. Потом нормируем — делим все элементы матрицы на общее число букв в тексте. В результате получится хэш-матрица, ее запоминаем для каждой статьи в БД.

Для проверяемой статьи строим такую же матрицу и вычитаем ее из хэш-матрицы каждой статьи в БД. Считаем сумму квадратов получившихся элементов. Исследуем на 20-40 типовых статьях и выводим пороговое значение. Для коротких текстов (порядка 100-500 букв) хорошо работало, попробуйте на ваших статьях!

В теории это имеет отношение к марковским цепям, n-граммам (2 граммам :)
Ответ написан
TROODON
@TROODON
Самое простое решение поднять поисковой движок sphinx/lucene(elasticsearch, Solr) и индексировать все статьи, при добавлении новой статьи отправить в поисковик запрос указав поля тело = тело, заголовок=заголовок и смотреть на размер вхождений.
Высокое значение вхождений — Статья похожа
Ответ написан
Комментировать
SergeiStartsev
@SergeiStartsev
Можно при добавлении каждой статьи составлять (1 раз) ее карту, она может иметь различный вид, все зависит от того насколько релевантные должны быть результаты (как наиболее простой вариант — выбирать наиболее часто употребляемые слова), а затем уже производить анализ по этой карте.
Ответ написан
@gkirok
алгоритм nilsimsa

поищите perl-Digest-Nilsimsa
создаете хэш для каждой статьи кладете в базку
сравнение кажется побитное непомню использовал давно
точный (если куски текста просто поменяны местами находит 100% идентичность)
относительно быстрый
не латиницу перед созданием хэша транслитеруйте
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы