elasticsearch演算法之搜尋模型(一)

無風聽海發表於2022-03-02

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

使用者輸入的是關鍵字,搜尋引擎輸出的是相關文件,從關鍵字和相關性兩個角度可以將文件集合分為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 \]

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

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

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

相關文章