elasticsearch算法之搜索模型(一)


面對海量的信息,我們很容易被淹沒在信息的海洋中;當我們需要查找某個信息的時候,我們就會輸入能夠體現我們意圖的關鍵字,搜索引擎會通過解析我們的關鍵字從而構造相應的查詢表示方法;然后搜索引擎通過構造的查詢在內存存儲的文檔集合中查找跟用戶需求相關的文檔,並根據相關度進行排序;以上搜索引擎進行計算的過程就是相關度計算,而其相關的理論基礎就是檢索模型;

用戶輸入的是關鍵字,搜索引擎輸出的是相關文檔,從關鍵字和相關性兩個角度可以將文檔集合分為4個子集;檢索模型要解決的就是盡量包含並提升set1、set3的排序;目前主流的的搜索模型主要處理的是包含關鍵字的set1、set2,而基本上不會涉及set3;

相關文檔 不相關文檔
包含關鍵字 set1 set2
不包含關鍵字 set3 set4

需要注意的一點,我們這里有一個隱含的假設條件,就是用戶數據的關鍵字可以充分體現用戶的需求,考慮到自然語言的復雜多變,如果關鍵字不能精確的代表用戶的需求,即使再優秀的檢索模型也無濟於事;

一、布爾模型

基於集合論的布爾模型使用單詞集合來表示文檔和用戶的查詢,並通過布爾表達式來計算兩者的相似性;

用戶通過與、或、非來構建邏輯表達式作為自己的查詢需求;例如我們要查詢包含elasticsearch和包含lucene或者kibana的文檔;

elasticsearch and (lucene or kibana)

如果搜索引擎中有5個文檔,同時每個文檔包含三個關鍵字的情況如下

通過文檔矩陣可以看到包含elasticsearch的有d1、d3、d5;

通過文檔矩陣可以看到包含lucene或者kibana的文檔有d1、d2、d4、d5;

對以上兩個條件命中的記錄計算交集得到d1、d5;

d1 d2 d3 d4 d5
elasticsearch Y Y Y
lucene Y Y Y
kibana Y Y Y

布爾模型雖然比較簡單直觀,但是由於其輸出結果的二元性,無法細致的計算文檔的相關性,自然無法對粗糙的搜索結果進行排序;

二、向量空間模型

向量空間模型是一種歷史悠久的文檔表示和相關性計算模型;其將文檔看做有眾多分詞組成的多維向量,同時會根據一定的規則計算每個維度的權重;

例如有三個由elasticsearch、lucene、kibana組成的文檔,elasticsearch在d1中的權重為我w11,lucene在d1中的權重為w12,kibana在d1中的權重為d13,所以d1可以使用向量(w11,w12,w13)來表示;

elasticsearch lucene kibana
d1 w11 w12 w13
d2 w21 w22 w23
d3 w31 w32 w33

實際的搜索場景中,除了要搜索的文檔可以向量化,用戶輸入的查詢關鍵字也可以向量化,從而將用戶的搜索查詢轉化為計算查詢和文檔的內容相似性計算;Cosine相似性是最常用的也是非常有效的計算相似性的方式,我們可以通過如下公式計算用戶查詢Q和文檔Di相似性

\[Cosine(Q, D_i) = \frac {\sum_{j=1}^{t} w_{ij} \times q_{j} } {\sqrt{\sum_{j=1}^{t} w_{ij}^2 \times \sum_{j=1}^t} q_{j}^{2}} \]

公式中的分子是兩個向量的點積,而分布是兩個向量在歐式空間中的長度的乘積;通過公式我們也可以看到余弦相似性計算的是兩個向量之間夾角的余弦值,所以兩個向量夾角越小則越相似;

公式中的分母也是對計算結果的規范化;這是為了避免長文檔得分過高的一種懲罰機制;通過同時可以看到對於同一個查詢,包含同樣關鍵字的長文檔會使得分子更小,同時使得分母更大,從而導致相似性下降的更快,即存在過分抑制長文檔的問題;例如兩個長短差別比較大的文檔都包含跟特定主體有關的詞,雖然單詞在兩個文檔出現的次數不同,但是在兩個文檔中出現的詞頻是相當的,此時公式中的分子不變,但是由於長文檔包含的單詞比較多,其長度會比較長,隨意會導致計算值更小;如果從空間向量的角度考慮,共線的不同長度的向量,通過除以其長度編程單位向量,不管兩個向量的長度差距多大,最終的單位向量必然相等,所以向量的長度越長,則抑制效果越明顯;

三、TF-IDF模型

查詢和文檔轉化為向量,這是就需要計算每個分詞的權重,而特征權重的計算框架就是TF-IDF框架,其包含詞頻TF、逆文檔頻率IDF;

TF代表單詞在文檔中出現的次數,一般來說某個單詞出現的次數越多則越能代表文檔,其權重值應該越高;雖然可以直接使用單詞在文檔中出現的次數來計算,考慮到長短文檔的影響,實際場景中使用的比較少;

一種詞頻計算公式如下,我們對單詞出現的頻數取log運算,這樣可以抑制出現次數過多對計算結果的影響;同時為了避免單詞出現一次導致結果為0,從而采用加1的平滑處理方案;

\[W_{TF} = 1 + \log(TF) \]

另外一種單詞詞頻的的計算公式如下,其中的a是調節因子,TF是單詞實際出現的頻數,而Max(TF)是文檔中出現頻數最多的單詞的頻數,通過兩者相除進行規范化,計算得到每個單詞的在文檔內相對出現頻數最高的單詞的相對頻數,從而避免長文檔對詞頻的影響;

\[W_{TF} = a + (1-a) \times \frac {TF} {Max(TF)} \]

詞頻衡量的是單詞對包含自身文檔的重要性,即對文檔內容的表征能力,而逆文檔詞頻反映的是單詞對文檔集合中文檔的甄別能力;其計算公式如下,其中N代表文檔集合中文檔的總數,nk代表包含單詞k的文檔的數量;從公式可以看到nk越大,則IDF值越小,則對文檔的甄別能力越差;

\[IDF_{k} = \log (\frac{N} {n_{k}}) \]

TF-IDF框架結合兩種權重因子,一般將兩者相乘計算分詞權重值;

\[Weight_{word} = TF \times IDF \]

從公式可以看到,如果對於某個文檔來說,

如果某個分詞在此文檔中出現的詞頻很高,同時在集合中其他文檔中很少出現,那么分詞的權重就會很高;

如果某個單詞在此文檔中出現的詞頻很低,同時在集合中其他文檔中出現的很多,那么分詞的權重就會很低;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM