鉴于索引或数据库包含大量(短)文档(约100万),我正在尝试为每个新传入的文档进行某种新颖性检测。
我知道我必须计算新文档与索引中每个文档的相似性。如果相似性低于某个阈值,则可以将该文档视为新颖的。一种常见的方法 - 我想做的 - 是使用向量空间模型并计算余弦相似度(例如,通过使用Apache Lucene)。
但这种方法有两个缺点: 1)它计算成本高,而且 2)它没有分别包含文档和单词的语义。
为了克服这些缺点,我的想法是使用LDA主题分发或命名实体来增加Lucene索引和查询(即文档集合和每个新文档)的语义。
现在,我完全迷失了具体的实施。我已经使用Mallet训练了LDA主题模型,我也可以在语料库上进行命名实体识别。但我不知道如何使用这些主题和命名实体来实现新颖性检测。更具体地说,我不知道如何使用这些功能进行索引和查询创建。
例如,将一个文档的所有命名实体存储为索引中的单独字段,添加某些权重(即提升它们)并使用MultiFieldQuery是否足够?我不认为这已经为相似性检测添加了某种语义。这同样适用于LDA主题:是否足以将每个术语的主题概率添加为有效负载并实现新的相似性分数?
如果您能提供一些关于如何在Lucene中纳入LDA主题或命名实体的提示或甚至代码片段以获得某种新颖性检测或语义相似性度量,我将非常高兴。
提前谢谢。