【问题标题】:How to calculate "OnTopicness" of documents using Lucene.NET如何使用 Lucene.NET 计算文档的“OnTopicness”
【发布时间】:2011-11-11 05:51:15
【问题描述】:

想象一下,我有一个庞大的数据库,其中包含来自不同论坛站点的主题和帖子(大约 10.000.000 条记录),其中包括用作我的 lucene 文档的几个子论坛。

现在我正在尝试根据其中使用的术语为每个帖子计算一个名为“OnTopicness”的功能。事实上,这个特性只不过是两个文档向量之间的简单余弦相似度,它们将存储在数据库中,因此每个帖子只需计算一次。 :

  • Forum-OnTopicness:我的帖子与虚拟帖子之间的余弦相似度 包含指定论坛中所有其他帖子的文档(包括 论坛中的所有主题)
  • Thread-OnTopicness:我的帖子与虚拟帖子之间的余弦相似度 包含指定线程中所有其他帖子的文档

由于 Lucene.NET API 不提供计算文档-文档或文档-索引余弦相似度的方法,I read 我可以将其中一个文档解析为查询并在结果,或者我可以使用 TermFreqVectors 和 DocFrequencies 手动计算相似度。

我尝试了第二次尝试,因为它听起来更快,但遇到了一个问题:IndexReader.GetTermFreqVector() 方法将内部 docNumber 作为参数,我不知道我是否只是将两个文档传递给我的 GetCosineSimilarity 方法:

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 新手,我仍然不确定我的整体索引设计,并且肯定可以使用一些一般性建议。非常感谢您的帮助 - 谢谢!

【问题讨论】:

    标签: indexing lucene.net information-retrieval similarity trigonometry


    【解决方案1】:

    看看S-Space。它是一个免费的开源 Java 包,可以做很多你想做的事情,例如计算文档之间的余弦相似度。

    【讨论】:

    • 不幸的是,S-Space 是一个 Java 实现,它不适合我,因为我在纯 .NET 环境中工作。
    【解决方案2】:

    看看 MoreLikeThisQuery 在 https://svn.apache.org/repos/asf/incubator/lucene.net/trunk/src/contrib/Queries/Similar/

    它的来源可能有用。

    【讨论】:

    • 感谢您的回答。您能否进一步解释一下我应该从源头上采取什么来实现我的目标?据我了解,MoreLikeThis 查询可以根据整个索引从我的文档中提取和评分重要术语。不过,我仍然不确定如何构建和比较两个文档。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 2014-07-22
    • 2010-12-07
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    相关资源
    最近更新 更多