Здравствуйте.
Имеется база документов на 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|загрузить...)
Вопрос как это можно реализовать полностью автоматически?
Заранее спасибо.
1) Мне кажется что математически строгий алгоритм здесь нельзя будет вывести.
И даже если теоретически предположить что ты придумал метод нахождения синонимов то тогда не только WOT будет сведен к основе но и "Добрый день" и многие другие sentences, tokens
могут тоже автоматически сжаться до какого то уж очень рафинированного текста.
2) Мне вспоминается пример из vectorized-db, где параллельным переносом из точки "king man"
можно было получить "queen". Возможно танковая игра тоже будет такой точкой внутри vectorized
пространства можно получить wot и все прочее.
Короче я-бы не сбрасывал со счетов векторизации документов.
К примеру: вов, варкрафт, world of warcraft, и просто warcraft
А вас не смущает что в вашем примере нет ни одного синонима? Если хотите математическую точность решения, начинайте с математической точности запроса.
Я здесь вижу транслитерацию, сокращение и совокупность транслитерации и сокращения. Причём сокращение это всегда узкая дорожка, когда вы что-то додумали за пользователя: с чего вы взяли что вов это "ворлд оф варкрафт", а не "великая отечественная война"?
Вопрос как это можно реализовать полностью автоматически?
Взять готовые инструменты для нечёткого поиска, например ElasticSearch
а как гугл взял, что вов - варкрафт, а не война?
но по факту, нужен парсер именно вышеуказанных сочитаний. Никакие инструменты в ElasticSearch не найдут
world of warcraft, если забить в поиск "вов". А вручную этот словать составлять никто не будет.
Мне кажется вам надо правильно понять "предобработку запроса"...на уровне того же Elastic...вам нужно свести все "входные слова" к единой форме и уже по ней искать...так же использовать эти же "правила" при индексации текста...
UPD:
Типа оригинальный запрос: "warcraft скачать", после всех манипуляций станет: (warcraft|wow|вов|варкрафт|....) (скачать|download|загрузить...)
Вопрос как это можно реализовать полностью автоматически?
У Вас будто от "обратного"...из-за одного слова - куча синонимов для поиска...