Список вопросов
Как зайти в Даркнет?!
25th January, 01:11
8
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
899
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
952
0
Очень долго работает Update запрос Oracle
27th January, 09:58
916
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
907
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
942
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1727
0
период по дням
25th October, 10:44
3957
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3722
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4614
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4382
0
Помогите пожалуйста решить задачи
24th November, 23:53
6087
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4352
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4400
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Отсев похожих записей?
Просмотров: 301
 
Ответов: 5
Здравствуйте!
У нас в проекте пользователи добавляют материал — это текстовая строка, длинной до 300 символов.
Очень много встречается дубликатов. Хотел бы при добавлении сделать проверку: если добавляемая строка похоже на 90% с уже добавленными, то не давать добавить.
В качестве БД используется MySQL.
На данный момент пришло в голову решение такое:
— убираем из строки все знаки препинания и пробелы
— опускаем в нижний регистр
— делаем md5 хеш полученного
— добавляем хеш в отдельное поле в БД
— при добавлении нового — сверяем, нет ли такого в БД
Решение не самое лучшее, возможно есть что-нибудь по лучше?
P.S. Записей примерно 10 тыс. в сутки добавляется 500 новых. Есть возможность задействовать sphinx, но не нашел в нем похожего функционала.
Помоему существующий подход позволет отсеивать не похожие записи, а идентичные…
Я думаю, что это задача, крайне сложная, если вообще выполнимая и пожалуй это больше не к БД, а к ИИ. Предположим есть два сообщения:
1. Как мне отсивать похожие записи в БД?
2. Какой есть способ предупреждения дублирования записей в БД?
Они похожи?
На мой взгляд лучше всего предоставить решение этой задачи пользователям, например предложив ему перед публикацией взглянуть по ссылке типа «А здесь смотрели», в которой например в порядке реливантности будут идти 5 — 10 ссылок на сообщения, в которых, максимально встречались слова из публикуемого сообщения. Так же можно приспособить для этого теги и искать сообщия не только по словам, но и по тегам (или же вообще только по тегам).
Ну это так, полемика. На практике с таким никогда сталкиваться не приходилось.
Сделать для каждого материала сайт, отправить их на индексацию в Яндекс, если оба будут в индексе, то сможно считать их различным :)
А если серьезно, то есть сервисы и программы, позволяющие оценивать схожесть текстов (распростаненны у сеошников и их помощников-рерайтеров). С открытыми исходниками не встречал таких, но можно попробовать с авторами договоритться или использовать сервис/программу как внешний сервис/модуль.
Сам с ходу бы решал бы задачу так:
— составляем список слов в материале (можно с количеством встречающихся слов)
— выбрасываем «мусор» (предлоги, союзы, «спасибы» и «пожалуйсты»)
— получаем список «тегов»
— ищем материал(ы), список которого наиболее полно совпадает с текущим списком (например, в цикле по текущему списку получаем N первых материалов с этим тегом и берём самый(е) часто встретившийся)
— смотрим как похож текущий на найденный(е) (критерий задаётся в настройках, например, если больше 80% совпадает, то считаем похожим)
— если не похож (совпадений меньше 80%), то публикуем
— если похож, то отправляем пользователю эти сообщения с вопросом «Вы это же имели в виду?», если пользователь говорит «нет», то публикуем, если «да», то ничего не делаем
После первоначального запуска следим за качеством фильтра (сначала можно следить прозрачно для пользователей, отмечая схожие материалы только в БД/админке) и по необходимости изменяем порог похожести, словарь незначащих слов, может быть вводим понятия синонимов и/или обрезаем слова до основы (открытые продукты кажется даже описывались на хабре недавно), учитываем словосочетания, позицию слов в материале/предложении… В общем постепенно превосходим алгоритмы автоматического опредления дублирующегося контента в гугле/яндексе, продаём им их и забываем про пользователей, которым лень поискать самим перед публикацией :)
Ещё один подход — сделать нейронную сеть, обучить её на имеющейся базе и подучивать в процессе, но тут я затрудняюсь оценить даже приблизетельно ресурсоемкость и разработки, и собственно анализа. Ну или семантический анализатор разработать :)
Расстояние Хэмминга en.wikipedia.org/wiki/Hamming_distance
Расстояние Левенштейна en.wikipedia.org/wiki/Levenshtein_distance
Расстояние Дамерау—Левенштейна en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance
ru.wikipedia.org/wiki/Soundex — алгоритм сравнения двух строк по их звучанию. Он устанавливает одинаковый индекс для строк, имеющих схожее звучание.
Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться