如何计算" OnTopicness"使用Lucene.NET的文档

时间:2011-09-06 11:05:53

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

想象一下,我有一个庞大的线程和帖子数据库(大约10.000.000条记录)来自不同的论坛网站,包括几个作为我的lucene文档的子论坛。

现在我正在尝试计算一个名为" OnTopicness"每个帖子基于其中使用的术语。实际上,这个特征不仅仅是将存储在数据库中的两个文档向量之间的简单余弦相似性,因此每个帖子只需要计算一次。 :

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

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

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