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

Какие есть Алгоритмы поиска синонимов?

Здравствуйте.
Имеется база документов на 1,500млн документов. Каждый состоит из тайтла и небольшого текста (200-300 символов).
Мне нужно реализовать поиск, который бы учитывал возможные сокращения (аббрв), альтернативные названия предметов, и т.д. - в полностью автоматическом режиме.
К примеру: вов, варкрафт, world of warcraft, и просто warcraft это именно те синонимы, которые мне нужно извлечь.

Ембеддинги не подходят, т.к. они: 1) работают лишь на уровне слов, 2) скорее всего поставят где-то рядом wow, wot - хотя это совсем разное, 3) хочется математической строгости и закономерности, а также высокой точности, плюс необходима высокая скорость работы, т.к. данные документы прибавляются каждый день и там есть новые документы, дообучать постоянно условный w2v будет очень трудно.

Как я вижу:
1) вытянуть список коллокаций (устойчивых слов, которые идут всегда строго по порядку), таким образом получится вытянуть всевозможные названия, к примеру "world of tanks". Минус, что оно также найдет еще фразы типа "добрый день"... (как?)
2) на второй итерации, вытянуть также найденные в первом шаге возможные сочитания + слова (или как?), которые часто встречаются рядом с ними, чтобы "wot" попало "рядом" к "world of tanks" в один кластер.
3) из каждого документа выдерать списки таких найденных "признаков" (или как?), сохранять как-то id этих признаков.
4) когда производится поиск, выбирать ранее найденные фразы-признаки из поискового запроса (к примеру "world of warcraft"), находить им альтернативные фразы (варкрафт, вов и т.д.), и уже затем составлять автоматом перефразированный запрос.
Типа оригинальный запрос: "warcraft скачать", после всех манипуляций станет: (warcraft|wow|вов|варкрафт|....) (скачать|download|загрузить...)
Вопрос как это можно реализовать полностью автоматически?
Заранее спасибо.
  • Вопрос задан
  • 1655 просмотров
Подписаться 3 Средний 3 комментария
Решения вопроса 1
@odissey_nemo
Программист, ГИС-системы, растры, космоснимки
Можно табличным методом решить.

Составь 2 таблицы в любой БД, например SQLite:

Synonyms: поля group(int),name(text).
Paronyms: поля name1(text), name2(text).

Всё храни и используй в верхнем регистре.
В Synonyms все имена с одинаковым group считаются синонимами.
В Paronyms name1 и name2 составляют пару, невозможную для таблицы Synonyms в одной группе.

Составь и потихоньку заполняй их.
А проверки все делаются на обычном SQL.
Перед вставкой новых значений в Synonyms проверяй на наличие в паронимах. Если обнаружено в паронимах, вручную решай, что делать, убрать пароним или не вставлять.

База наполнится и начнёт работать. Размеры будут не сильно большими, несколько десятков тысяч записей на каждую таблицу. Впрочем, зависит от области применения.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
fenrir1121
@fenrir1121
Начни с документации
Какие есть Алгоритмы поиска синонимов?

К примеру: вов, варкрафт, world of warcraft, и просто warcraft

А вас не смущает что в вашем примере нет ни одного синонима? Если хотите математическую точность решения, начинайте с математической точности запроса.

Я здесь вижу транслитерацию, сокращение и совокупность транслитерации и сокращения. Причём сокращение это всегда узкая дорожка, когда вы что-то додумали за пользователя: с чего вы взяли что вов это "ворлд оф варкрафт", а не "великая отечественная война"?

Вопрос как это можно реализовать полностью автоматически?
Взять готовые инструменты для нечёткого поиска, например ElasticSearch
Ответ написан
mayton2019
@mayton2019
Bigdata Engineer
Можно попробовать расширять текстовый запрос по такой формуле

вов => "вов OR wow"

Здесь преобразования достаточно простые.

По поводу world of warcraft => warcraft я не согласен. Это вообще другая игра, поэтому и результат поиска будет не верный. Хотя это на откуп автору. Если его база содержит только игры последних лет то пускай комбинирует слова через or.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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