Lucene:相似度类...如何定义多个相似度度量?

4

为了进行我的实验,我需要为我的文档集合中的每个字段定义特定的相似度度量。

例如,我需要使用tf.idf来测量描述字段的相似性,并使用Harvesine距离来测量地理位置字段的相似性等等...

我现在正在研究Similarity类。我想知道是否有任何好的教程或示例可以帮助我更快地进行...

谢谢

1个回答

1

编辑: 如果我理解正确,您有每个字段的相似度公式,并且希望对所有其他文档运行它以使用每个文档。 您可以在索引时间使用几个选项:

  1. 扩展DefaultSimilarity类。
  2. 扩展SimilarityDelegator类,如果您只需要修改部分方法。

在这两种方法中,您可以利用payloads存储特定于术语的信息(对于纬度和经度数据可能很有用)。

使用其中一种方法实现一个相似性类之后,使用Similarity.setDefault(mySimilarity)将其设置为索引和搜索的相似性实例。

然后才能索引您的文本语料库,稍后可以搜索-您可能还需要扩展Searcher类以获取原始相似度。

话虽如此,我认为这种方法对于您的用例是错误的 - Lucene被优化为获取几个相似的文档,而不是每个文档的得分,因此我预测运行时间将是禁止的 - 希望我错了,但无论如何,我建议您阅读大规模数据挖掘以获得更好的方法 - 最小哈希和shingling。

祝你好运。

Patrick,我首先引用Grant Ingersoll关于修改Similarity类的话:“这里有龙”。自定义Lucene的Similarity类很难。我已经做过了。这并不好玩。只有在绝对必要的情况下才这样做。

我建议您先阅读Grant的空间搜索论文他的可发现性论文他的“调试相关性”论文。这些论文展示了其他获取所需结果的方法。


@Yuval F,你给我的材料不完全是我要找的。我不需要优化Lucene文档得分或可查性。此外,我不需要关于位置感知服务的信息(虽然很有趣)。我需要知道的是如何将多个相似度测量集成到一个中:Lucene已经有了我可以用于某些字段的tf-idf得分。对于其他字段,例如纬度-经度,我需要使用Harvesine距离(我已经有一个公式可以使用)... - aneuryzm
1
@Patrick - 请您详细说明一下吗?您是需要类似于Lucene的文档相似度排名,还是需要它作为比较文档的特性用于其他目的? - Yuval F
@Yuval F 好的。我将使用一个集合中的文档作为查询,以便将其与所有其他文档进行比较。因此,它是用于比较文档的。每个文档都有文本字段、地理字段和时间/日期字段。我需要对所有字段的分数进行平均。我想要使用自己的地理和时间/日期得分公式。对于其他字段,可以使用tf/idf。 - aneuryzm
以下是我的建议:如果你的集合不是很小,那么使用Lucene并不是一个好选择。Lucene的相似度计算旨在提取少量相似的文档,而不是与所有其他文档进行比较。我建议你使用Weka或Mahout的聚类功能来完成这个任务。我会相应地修改我的回答。 - Yuval F
@Yuval F,我想尝试一下,因为我的文档非常简短。但我实际需要的是针对每个字段定义不同的相似度度量。你能帮我吗? - aneuryzm
@Yuval F 感谢您更新答案。然而,在我的问题中,我已经提到了Similarity类。Similarity类的问题在于computeNorm()、lengthNorm()和scorePayload()只有字段作为输入参数。因此,我无法按字段级别自定义分数,只能按文档级别自定义分数。 - aneuryzm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接