1. 搜索 ES 计算文本相似度用的 BM25,参数默认,不适合电商场景,可调整 BM25 参数使其适用于电商短文本场景
2. k1、b、tf、L、tfScore 的关系如下图红框内所示(注:这里的 tf 即上式中的 f(qi,D))。
3. k1 用来控制公式对词项频率 tf 的敏感程度。((k1 + 1) * tf) / (k1 + tf) 的上限是 (k1+1),也即饱和值。当 k1=0 时,不管 tf 如何变化,BM25 后一项都是 1;随着 k1 不断增大,虽然上限值依然是 (k1+1),但到达饱和的 tf 值也会越大;当 k1 无限大时,BM25 后一项就是原始的词项频率。一句话,k1 就是衡量高频 term 所在文档和低频 term 所在文档的相关性差异,在我们的场景下,term 频次并不重要,该值可以设小。ES 中默认 k1=1.2,可调整为 k1=0.3。
4. b 用来控制文档长度 L 对权值的惩罚程度。b=0,则文档长度对权值无影响,b=1,则文档长度对权值达到完全的惩罚作用。ES 中默认 b=0.75,可调整为 b=0.1。
5. IDF 一项无参可调,这里只说明一点,公式中当 n(q) 超过 N/2 非常大时,IDF 有得到负值的可能,Lucene’s BM25 实现时对 log 中的除式做了加 1 处理,Math.log(1 + (docCount - docFreq + 0.5D)/(docFreq + 0.5D)),使其永远大于 1,取 log 后就不会得到负值。
参考资料:
- https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules-similarity.html
- https://en.wikipedia.org/wiki/Okapi_BM25
- https://www.elastic.co/guide/en/elasticsearch/guide/current/pluggable-similarites.html
- https://www.elastic.co/guide/en/elasticsearch/guide/current/practical-scoring-function.html
- http://opensourceconnections.com/blog/2015/10/16/bm25-the-next-generation-of-lucene-relevation/
- 《信息检索导论》p160