Как найти сходство текста в миллионах записей? - PullRequest
0 голосов
/ 14 июня 2019

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

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 14 июня 2019

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

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

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

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

1 голос
/ 14 июня 2019

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

Чтобы быть очень быстрым на больших наборах данных, я могу порекомендовать Локализацию с учетом локальных особенностей (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-sensitive-hashing-lsh-python/

...