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