Как найти сходство текста среди миллионов записей?

Используя Spacy, чтобы найти сходство в нескольких текстах, теперь я пытаюсь найти похожие тексты в миллионах записей (мгновенно).

У меня есть приложение с миллионами текстов, и я хотел бы предоставить пользователю похожие тексты, если они попросят.

Как такие сайты, как StackOverflow, так быстро находят похожие вопросы?

Я могу представить 2 подхода:

  1. Каждый раз, когда вставляется текст, сравнивается вся БД и делается ссылка между обоими вопросами (в промежуточной таблице с обоими внешними ключами)
  2. Каждый раз, когда текст вставляется, вектор вставляется в поле, связанное с этим текстом. Всякий раз, когда пользователь запрашивает похожие тексты, он «ищет» в БД похожие тексты.

Я сомневаюсь во втором выборе. Хранения вектора слов достаточно для быстрого поиска похожих текстов?


person Victor Marconi    schedule 13.06.2019    source источник


Ответы (2)


Сравнивать все тексты каждый раз, когда приходит новый запрос, невозможно.

Чтобы быть действительно быстрым на больших наборах данных, я могу порекомендовать Hasing с учетом местоположения (LSH). Это дает вам записи, которые похожи с высокой вероятностью. Это значительно снижает сложность вашего алгоритма.

Тем не менее, вы должны обучить свой алгоритм один раз — это может занять время — но после этого он будет работать очень быстро.

https://towardsdatascience.com/understanding-locality-sensitive-hashing-49f6d1f6134 https://en.wikipedia.org/wiki/Locality-sensitive_hashing

Вот руководство, похожее на ваше приложение: https://www.learndatasci.com/tutorials/building-recommendation-engine-locality-sensive-hashing-lsh-python/

person ohlr    schedule 13.06.2019

Вам нужна функция, которая может быстро преобразовать текст в многомерное пространство. Ваша коллекция документов должна быть проиндексирована относительно этого пространства, чтобы вы могли быстро найти соответствие между вашим текстом и тем, что находится в пространстве, по кратчайшему расстоянию.

Существуют алгоритмы, которые ускорят этот процесс индексации, но могут быть такими же простыми, как субиндексация пространства в осколки или блоки на менее детализированной основе и сужение поиска таким образом.

Одним из простых способов определения такого пространства может быть term -частота (TF), термин-частота-обратная частота документа (TFIDF) - но без определения ограничения на размер вашего словаря, они могут страдать от проблем с пробелами/точностью - тем не менее, со словарем наиболее конкретных 100 слов в корпусе, вы должны быть в состоянии получить разумное указание на сходство, которое будет масштабироваться до миллионов результатов. Это зависит от вашего корпуса.

Есть много альтернативных функций, которые вы могли бы рассмотреть, но все они решают иметь надежный метод преобразования вашего документа в геометрический вектор, который вы затем можете запросить на предмет сходства.

person Thomas Kimber    schedule 14.06.2019