ElasticSearch相關度計算

  1. 布爾模型(Bool Model)
    假如現在搜索一個詞組”hunter plus java”(利用terms可以做到)首先會應用一個bool模型,也就是先判斷文檔裏面是否存在這三個term之一或者更多,只有存在關鍵詞的文檔纔可以進入下一輪的競爭排序。這個bool模型很大程度保證了計算的實時性和有效性。什麼?爲什麼要先排除不帶有關鍵詞的?連關鍵詞都沒有,湊合什麼呢!

  2. 詞條頻度/倒排文檔頻度(TF/IDF)
    假如現在有兩個文檔如下
    {“name”:”charlie”,”description”:”hunterplus java”}
    {“name”:”charles”,”description”:”hunterplus web”}
    後面的三個計算都以這兩個簡單文檔爲例子

詞條頻度 TF

詞條頻度,全稱Term Frequency,簡稱TF,是對bool模型殘留下來的所有文檔進行詞條的統計,得出了一個頻數的平方根
這個頻數是指殘留文檔中出現了關鍵詞的文檔數量除以總殘留文檔數量
**公式爲 TF = sqrt(frequency)
**其中fre爲某個詞在其文檔出現的頻數
例如hunterplus這個詞條在description這個字段出現的頻率就是1, 則
TF=sqrt(1)=1

倒排文檔頻度 IDF

倒排文檔頻度,全稱Inverse Document Frequency, 簡稱IDF,是對某個詞條在全數據庫中所有文檔出現的頻率作的計算。比如說一篇文章裏面,and和or,或者說中文裏面的“的”字,都是經常出現的,那麼如果這類型的詞條當作關鍵詞,其權重應該是非常低的,因爲太頻繁出現了,沒有區分度。
**公式爲 IDF = 1+log ( total/ (fre+1) )
**其中total是總文檔數(過濾後的),fre是某個搜索詞出現的頻數
fre後面加一是爲了分母不爲零,前面的加一併不對函數變化產生影響
依然拿上面的例子來講,對於hunterplus這個詞條,就是
IDF=1+log(2/3) = 0.82

  1. 字段長度歸約(Field-Length Norm)
    字段長度歸約是爲了讓內容較短的字段發揮更大的作用,而內容較長的字段權重相對降低
    **公式爲 NORM=1/sqrt(numTerms+1)
    **其中numTerms是該文檔裏面關鍵詞所在的字段的詞條數量
    依然取hunterplus爲例子,
    Norm = 1/sqrt(3) = 0.55

驗證
1.2.3所描述的三個因子都是文檔在index的時候就馬上計算出來的,會佔用一定的存儲空間
我們可以通過explain查看具體的計算結果來驗證
curl localhost:9200/candidate/_search?pretty=true&&explain=true -d ‘{“query”:{“term”:{“description”:”java”}}}’
很可惜,看到的結果和理論值並不一致。。囧。。應該是es內部的實現不是理論這麼簡單,有其他方面的計算
不過基本思想是一樣的,依然是通過計算詞條的統計學量值來分析相關度。

上面描述了對一個詞條的相關度計算,那麼假如是多個詞條的話,就是多個詞條對應的相關度構成一個一維向量,然後計算不同文檔之間的向量距離,elastic採取的是餘弦距離
例如上述例子,搜索兩個term,一個是hunterplus一個是java,那麼兩個document都會出現,但是第一個doc會計算出比較大的相關度向量,假設是(5,2),另一個(0,2),那麼以大的爲最準,求出(0,2)與(5,2)的餘弦距離,然後排序即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章