Как эффективно внедрить систему поиска сходства документов? - PullRequest
4 голосов
/ 03 февраля 2010

Как реализовать систему «похожих предметов» для предметов, описываемых набор тегов?

В моей базе данных у меня есть три таблицы: Article, ArticleTag и Tag. каждый Статья связана с несколькими тегами через многие ко многим отношения. Для каждой статьи я хочу найти пять самых похожих статьи для реализации ", если вам нравится эта статья, вам понравятся эти тоже "система".

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

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

Может быть, кто-то может предложить для этого готовое решение? Большинство поисковые системы, на которые я смотрел, не позволяют подобие документа поиск.

Ответы [ 2 ]

1 голос
/ 05 февраля 2010

Некоторые вопросы,

  • Чем ArticleTag отличается от Tag? Или это таблица сопоставления M2M?
  • Можете ли вы набросать, как вы реализовали алгоритм согласования косинусов?
  • Почему бы вам не сохранить теги вашего документа в какой-либо структуре данных в памяти, используя ее только для получения идентификаторов документов? Таким образом, вы попадаете в базу данных только во время поиска.
  • В зависимости от частоты добавления документов, эта структура может быть разработана для быстрого / медленного обновления.

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

Приветствие.

0 голосов
/ 19 марта 2010

Вы можете сделать это с помощью Lemur набора инструментов. С KeyfileIncIndex вы должны повторно извлечь документ из его источника; IndriIndex поддерживает извлечение документа из индекса.

Но в любом случае вы индексируете свои документы, а затем создаете запрос из документа, к которому хотите найти похожие документы. Затем вы можете выполнить поиск по этому запросу, и он оценит другие документы на предмет сходства. Это довольно быстро по моему опыту. Он рассматривает как исходные документы, так и базовые запросы как документы, поэтому поиск сходств - это действительно то, что он делает (если только вы не используете материал парсера Indri - это немного отличается, и я не уверен, как это работает).

...