【问题标题】:Penalize documents with a lot of unique terms in lucene用lucene中的许多独特术语惩罚文档
【发布时间】:2012-12-12 17:04:07
【问题描述】:

我的目的是在给定城市(术语)的情况下找到动物(doc)

我以这种方式索引文档:

doc1(bear)  = [city1, city2, city2, city3..]
doc2(dog)   = [city1, city1, city1, city2, city2, city2, city3, city3, city3..]
..

我想惩罚出现在很多城市的(动物)文件,因此不同城市/所有城市比例很高的文件,如“狗”。

有什么建议吗?谢谢

【问题讨论】:

    标签: lucene similarity


    【解决方案1】:

    已经可以了!

    Similarity.computeNorm

    默认情况下,norm 函数将较短字段上的匹配视为更精确的匹配,因此对它们的评分高于较长字段。

    如果您需要这产生更大的影响,您可以使用自定义版本覆盖 DefaultSimilarity,并修改从 computeNorm 方法返回的值以更重地权衡计算的 lengthNorm 部分。如果您需要这样做,我建议您在现有算法的某处添加一个乘数,但可以根据需要对其进行调整。

    注意!如 API 中所述,此值存储在索引中,而不是在查询时计算。您必须重新索引才能看到更改生效。


    computeNorm (3.6.0) 中的计算是:

    state.getBoost() * ((float) (1.0 / Math.sqrt(numTerms)))
    

    其中 numterms 是字段中的总词条数,state 是 FieldInvertState

    【讨论】:

    • 感谢您的快速回复,问题是我只想惩罚“高峰”文件,即在许多城市中非常常见的动物,我不想提升非常稀有的动物。这是因为非常稀有的动物通常具有非常低的术语频率,并且仅因为它们通常具有较低的场范数而得到提升。我需要检索具有高频率的动物(只切断真正常见的动物)。
    • 好吧,这有点复杂,当然,需要你定义什么是“峰值”。但答案还是一样的。在自定义相似度中实现您的逻辑,扩展 DefaultSimilarity,使用满足您要求的 computeNorm 实现,然后使用它重新索引。
    • 好的,谢谢..你能发布任何粗略的示例代码吗?我正在考虑使用条件概率en.wikipedia.org/wiki/Conditional_probability 和 boost,以及没有字段规范的索引。 IE。将连接到 dog 的唯一城市(术语)的数量除以唯一城市的总数。比使用该概率因子的倒数来提升文档。例如。 doc * boost 1/Pfactor[P(狗城市)/P(城市)]。我可以计算 lucene 的条件概率。这种方法有意义吗?
    • 我不知道我能提供什么,除了一个 DefaultSimilatiry 子类的骨架。我将从 DefaultSimilarity.computeNorm() 复制源代码,以便至少了解如何从 FieldInvertState 中提取相关数据。至于您的条件概率算法是否有意义,我真的无法回答。似乎很合理,但我不知道您的要求。
    猜你喜欢
    • 1970-01-01
    • 2018-04-29
    • 1970-01-01
    • 1970-01-01
    • 2014-04-18
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多