【问题标题】:Lucene scoring, precision about vector space modelLucene 评分,关于向量空间模型的精度
【发布时间】:2015-09-11 19:39:40
【问题描述】:

我不确定如何在 lucene 评分中使用向量空间模型。

我在这里 (https://www.elastic.co/guide/en/elasticsearch/guide/current/practical-scoring-function.html) 读到,lucene 将文档评分为每个术语查询的 tf-idf 的总和(如果我们省略协调因子、字段长度和提升)。我不明白向量空间模型是如何使用的。

空间向量模型可用于计算文档的 tf-idf 向量与查询的 tf-idf 向量之间的相似度。 这应该给我们一个查询和文档之间的 CosSimilarity 分数。分数介于 0 和 1 之间,因此不同的请求应该很容易比较。

为什么不使用 lucene 分数?

【问题讨论】:

    标签: elasticsearch lucene similarity


    【解决方案1】:

    Lucene 使用链接中提到的“实用评分函数”,它是余弦相似度的近似值 - 已扩展为支持“实用”功能,例如提升。

    如果对查询 q 和文档 d 采用向量空间余弦相似度公式,则有:

    s(q, d) = q * d / (||q|| * ||d||)
    

    考虑到q和d是[tf(t1) * idf(t1), ...]这样的向量,并且q向量中tf(t)要么为1要么为0,公式变为:

    s(q, d) = ∑( tf(t in d) * idf(t)² )(t in q) / (||q|| * ||d||)
    

    根据queryNorm = 1 / √sumOfSquaredWeights 的定义,您可以进一步将||q|| 替换为1 / queryNorm(q)

    s(q, d) = queryNorm(q) * ∑( tf(t in d) * idf(t)² )(t in q) / ||d||
    

    这与他们在文档中给出的公式很接近:

    score(q, d) = queryNorm(q) * coord(q,d) * 
                  ∑ ( tf(t in d) * idf(t)² * t.getBoost() * norm(t,d)) (t in q)  
    

    ||d||,但是,文档向量的范数在其公式中没有直接等价物。

    【讨论】:

    • 好吧,这是有道理的,所以norm(d) 被定义为√numTerms(d) ?
    • 不,这不是同一个规范 - 我已经清理了答案中的符号。 ||d||他们的公式中没有直接的等价项,但它可能包含在 coord(q,d) 中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-24
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 2017-05-17
    相关资源
    最近更新 更多