可信賴的武漢網(wǎng)站建設(shè)舉例網(wǎng)絡(luò)營銷的例子
前言
Elasticsearch 是基于 Lucene 的世界范圍內(nèi)最流行的全文檢索框架,其文檔相似度算法包含 TF/IDF 和 BM25,從 ES 5.0開始 BM25 算法已經(jīng)成為 ES 默認的相似度評分模塊。
TF-IDF 與 BM25 的區(qū)別
TF-IDF 和 BM25 都是計算文本相似性的常用算法。TF-IDF 的計算方法簡單,計算復(fù)雜度低,但對高頻詞不敏感,參數(shù)難以調(diào)節(jié)。BM25 是在 TF-IDF 的基礎(chǔ)上進行改進的,它考慮了文檔的長度和查詢詞在文檔中出現(xiàn)的次數(shù),在大多數(shù)情況下都能夠產(chǎn)生比 TF-IDF 更準確的相關(guān)性評分
TF-IDF 和 BM25 的主要區(qū)別在于計算方法的不同。TF-IDF 的計算方法為:
TF-IDF(t,d) = TF(t,d) * IDF(t)
其中:
- TF(t,d) 表示詞 t 在文檔 d 中的詞頻
- IDF(t) 表示詞 t 的逆文檔頻率
BM25 的計算方法為:
BM25(t,d) = (k1 + 1) * TF(t,d) / (k1 * (1 - b + b * df / docLength) + TF(t,d))
其中:
- k1 是控制詞頻對權(quán)重的貢獻的參數(shù)
- b 是控制逆文檔頻率對權(quán)重的貢獻的參數(shù)
- d 是控制文檔長度對權(quán)重的貢獻的參數(shù)
TF-IDF 和 BM25 的區(qū)別主要體現(xiàn)在以下幾個方面:
- 參數(shù)數(shù)量:TF-IDF 只需要一個參數(shù),即逆文檔頻率。BM25 需要三個參數(shù),即 k1、b 和 d,可以根據(jù)實際需求進行調(diào)節(jié),以提高相關(guān)性評分的準確性
- 計算復(fù)雜度:TF-IDF 的計算復(fù)雜度為 O(n),其中 n 是文檔中的詞數(shù)。BM25 的計算復(fù)雜度與 TF-IDF 相當(dāng),即 O(n)。
- 相關(guān)性評分:BM25 在大多數(shù)情況下都能夠產(chǎn)生比 TF-IDF 更準確的相關(guān)性評分。
評分在查詢業(yè)務(wù)場景中的應(yīng)用
在實際業(yè)務(wù)中,有關(guān)查詢場景的評分可以分為如下四類:
不關(guān)注評分
這類場景下,純粹把 ES 當(dāng)作檢索庫使用,不關(guān)注相似度評分,那么可以使用 constant query 或者使用 bool query 中的 filter 來進行過濾即可,這樣可以提高檢索性能
默認評分
默認評分,也就是框架默認評分。這類場景下,僅使用最簡單的查詢方式,比如 查詢 name:"tom",并沒有人為額外干預(yù)評分的機制,僅靠默認的評分算法的得到 rank 列表 ,做為檢索結(jié)果
業(yè)務(wù)評分 + 框架評分
此種場景下比較常見,比如查詢 name:"tom"^10 name:"cat"^5, 或者更加復(fù)雜的結(jié)合通過 Function Score Query 來完成更加復(fù)雜的業(yè)務(wù)
僅業(yè)務(wù)評分
這種場景下,一般在推薦業(yè)務(wù)中比較常見,其完全忽略框架的評分策略,而采納業(yè)務(wù)方或者產(chǎn)品方定義的評分規(guī)則,實現(xiàn)起來一般比較復(fù)雜,看一個例子:
GET /pi_ent_work/_search
{"query": {"function_score": {"query": {"bool": {"must": [{"query_string": {"boost": 0, # 注意此處禁用框架評分"query": "prov:(33 OR 36)"}}], "must_not": [{"terms": {"id": ["123"]}}], "filter": [{"term": {"count": {"value": "1"}}}]}}, "score_mode": "sum", "boost_mode": "replace", "functions": [{"script_score": {"script": {"lang": "expression", # 完全采用自定義評分并與數(shù)據(jù)中的某個字段關(guān)聯(lián)"source": " _score*0.8 + doc['custom_score'].value*0.4"}}}, {"weight": 6, "filter": {"query_string": {"query": "prov:(33 OR 36)"}}}, {"weight": 4, "filter": {"query_string": {"query": " product_id:112900 "}}}, {"weight": 2, "filter": {"query_string": {"query": "price:[* TO 3]"}}}]}}, "size": 100, "_source": {"includes": ["id","_score","prov","product_id","custom_score","count"]}
}
上面的例子完全忽略了框架評分,而全部采用自己指定的規(guī)則評分,在 ES 中可以結(jié)合 Function Score Query來實現(xiàn)
總結(jié)
在實際工作中,搜索和推薦業(yè)務(wù)會比較依賴全文檢索框架,很多情況下框架的默認的評分機制并不能很好的滿足我們的需求,所以需要結(jié)合一些自定義評分策略來完善我們的 rank 效果