赞
踩
bm25
elasticsearch中BM25相似度算法使用的公式如上所示。其中f(qi, D) 表示term qi在文档D中的出现次数,即tf。参数k1用来控制公式对tf的敏感程度,k1越小,对tf越不敏感,即tf增大时,公式的值变化不大。参数b用来控制文档长度对权值的惩罚程度:b=0,则文档长度对权值没有影响,b=1,则文档长度对权值达到完全的惩罚作用。由于在我的应用中,词频不重要,而且需要query与文档尽量相似,即需要对文档长度进行惩罚,因此将k1设为较小的值1.2,将b设为较大的值为0.9。
IDF 还是和之前的一样. 公式 IDF(q) = 1 + ln(maxDocs/(docFreq + 1))
f(q, D) 是 tf(term frequency)
|d| 是文档的长度, avgdl 是平均文档长度.
先不看 IDF 和 Document Length 的部分, 变成 tf * (k + 1) / (tf + k),
相比传统的 TF/IDF (tf(q in d) = sqrt(termFreq)) 而言, BM25 抑制了 tf 对整体评分的影响程度, 虽然同样都是增函数, 但是, BM25 中, tf 越大, 带来的影响无限趋近于 (k + 1), 这里 k 值通常取 [1.2, 2], 而传统的 TF/IDF 则会没有临界点的无限增长.
而文档长度的影响, 同样的, 可以看到, 命中搜索词的情况下, 文档越短, 相关性越高, 具体影响程度又可以由公式中的 b 来调整, 当设值为 0 的时候, 就跟之前 ‘TF/IDF’ 那篇提到的 "norms": { "enabled": false }
一样, 忽略文档长度的影响.
综合起来,
k = 1.2
b = 0.75
idf * (tf * (k + 1)) / (tf + k * (1 - b + b * (|d|/avgdl)))
最后再对所有 term 求和. 就是 Elasticsearch 5 中一般查询的得分了.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。