Как рассчитать "OnTopicness" документов с помощью Lucene.NET - PullRequest
4 голосов
/ 06 сентября 2011

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

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

  • Forum-OnTopicness : косинусное сходство между моим сообщением и виртуальным документом, состоящим из всех других сообщений на указанном форуме (включая все темы на форуме)
  • Thread-OnTopicness : косинусное сходство между моим сообщением и виртуальным документом, состоящим из всех других сообщений в указанной теме

Поскольку API Lucene.NET не предлагаетметод для вычисления косинуса сходства документа-документа или индекса-документа, Я прочитал , что я мог либо проанализировать один из документов как запрос и найти другой документ в результатах, либо чтобы я мог вручную вычислить сходствоиспользуя TermFreqVectors и DocFrequencies.

Я попробовал вторую попытку, потому что она звучит быстрее, но столкнулась с проблемой: метод IndexReader.GetTermFreqVector () принимает внутренний docNumber в качестве параметра, который я не знаю, просто ли я передаю два документа в свой метод GetCosineS Similarity:

public void GetCosineSimilarity(Document doc1, Document doc2)
{
    using (IndexReader reader = IndexReader.Open(FSDirectory.Open(indexDir), true))
    {
        // how do I get the docNumbers?
        TermFreqVector tfv1 = reader.GetTermFreqVector(???, "PostBody");
        TermFreqVector tfv2 = reader.GetTermFreqVector(???, "PostBody");
        ...
        // assuming that I have the TermFreqVectors, how would I continue here?
    }
}

Кроме того, как бы вы создали упомянутый «виртуальный документ» для всего форума или темы?Должен ли я просто объединить поля PostBody всех содержащихся постов и проанализировать их в новом документе, или я могу просто создать для них индексный указатель и каким-то образом сравнить свой пост со всем этим индексом?

Как видите, какЯ новичок в Lucene, я все еще не уверен в своем общем дизайне индексов и определенно мог бы воспользоваться некоторыми общими советами.Помощь высоко ценится - спасибо!

Ответы [ 2 ]

0 голосов
/ 08 сентября 2011

Взгляните на S-Space . Это бесплатный пакет Java с открытым исходным кодом, который делает много вещей, которые вы хотите сделать, например, вычислить косинусное сходство между документами.

0 голосов
/ 06 сентября 2011

Посмотрите на MoreLikeThisQuery в https://svn.apache.org/repos/asf/incubator/lucene.net/trunk/src/contrib/Queries/Similar/

Источник может быть полезен.

...