Быстрый поиск k-NN по моделям мешка слов

У меня есть большое количество документов одинакового размера. Для каждого из этих документов я создаю модель мешка слов (BOW). Количество возможных слов во всех документах ограничено и велико (например, 2^16). Вообще говоря, у меня есть N гистограмм размера K, где N — количество документов, а K — ширина гистограммы. Я могу рассчитать расстояние между любыми двумя гистограммами.

Первая возможность оптимизации. В документах обычно используется только небольшое подмножество слов (обычно менее 5 %, в большинстве случаев менее 0,5 %).

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

Запрос по содержанию

Запрос — это тоже документ. Мне нужно найти k наиболее похожих документов.

Наивный подход

  • Рассчитать модель BOW из запроса.
  • For each document in dataset:
    • Calculate it's BOW model.
    • Найдите расстояние между запросом и документом.

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

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

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


person Evgeny Lazin    schedule 07.07.2015    source источник


Ответы (1)


k-d-tree и подобные индексы предназначены для плотных данных.

Ваши данные, скорее всего, скудны.

Хорошим индексом для поиска ближайших соседей по разреженным данным являются инвертированные списки. По сути, так же, как работают поисковые системы, такие как Google.

person Has QUIT--Anony-Mousse    schedule 08.07.2015