Алгоритм возврата аналогичных документов, представленных в модели векторного пространства - PullRequest
1 голос
/ 21 июня 2011

У меня есть БД, содержащая векторы tf-idf около 30 000 документов.

Я хотел бы вернуть для данного документа набор похожих документов - около 4 или около того.

Я думал о реализации K-Means (алгоритм кластеризации) для данных (с косинусным сходством), но я не знаю, является ли это лучшим выбором из-за многих неопределенностей: я не уверен, что положить в мой исходные кластеры, я не знаю, сколько кластеров создать, боюсь, кластеры будут слишком несбалансированными, я не уверен, что качество результатов будет хорошим и т. д.

Будем весьма благодарны за любые советы и помощь опытных пользователей.

Спасибо,

Кейти

Ответы [ 2 ]

0 голосов
/ 23 июня 2011

Если я понимаю, вы

  1. чтение 30 тыс. Записей из большей базы данных в файл кэша / в память
  2. косинусное сходство, 10 терминов * 30 тыс. Записей -> лучшее 4.

Можете ли вы оценить время выполнения этих фаз отдельно?

  1. чтение или кеш: как часто это будет сделано, Насколько велики 30k векторов вместе?
  2. 10 * 30k множителей добавляет: в вашем c / java / ... или в каком-то непрозрачном БД? В c или java это должно занять <1 секунду. </li>

В общем, сделайте некоторые оценки за пределами конверта до фантазии.

(Кстати, Я считаю, что best-4 быстрее и проще в линейном c, чем std :: part_sort; YMMV.)

0 голосов
/ 21 июня 2011

Я хотел бы вернуть для данного документа набор похожих документов - около 4 или около того.

Тогда не делай К-средних. Просто верните четыре ближайших документа по подобию tf-idf, как это сделает любая поисковая система. Это можно реализовать как поиск k-ближайшего соседа или, проще, установив библиотеку поисковой системы и используя исходный документ в качестве запроса. Lucene приходит на ум.

...