Elasticsearch中的相似度模型(原文:Similarity in Elasticsearch)


原文鏈接:https://www.elastic.co/blog/found-similarity-in-elasticsearch

原文 By Konrad Beiske

翻譯 By 高家寶

譯者按

該文雖然名為Elasticsearch中的相似度模型,實際上多數篇幅講的都是信息檢索鄰域的通用相似度模型。其中涉及到具體實現的部分,Elasticsearch中相似度實際上是Lucene實現的,因此對於Lucene和Solr的開發者也具有參考意義。

導讀

Elasticsearch當前支持替換默認的相似度模型。在本文中我們介紹什么是相似度模型並具體講解tf-idf和bm25模型。

相似度模型簡介

相似度模型是定義了相似度的抽象和度量。當然這是廣義的定義。在這篇文章中我們只關注文本相似度模型。在此前提下:相似度模型可以分成兩類:文檔分類,將文檔划分到已知有限類集合中的某一類;信息檢索,找到和給定查詢最相關的文檔。在這篇文章中我們關注的是后者。
Elasticsearch提供了以下相似度模型:默認的tf-idf模型、bm25、drf和ib。我們暫時只關注默認模型和bm25模型。概率相似度和基於信息的相似度的區別可能會在以后的文章中講解。

默認相似度模型

Elasticsearch中的默認相似度模型是tf/idf模型。tf/idf模型是最常見的向量空間模型(vsm)。在向量空間模型中每個查詢詞被看成是向量空間中的一個維度。因此可以將查詢和文檔看成是兩個獨立的向量。這兩個向量的點積(scalar product)代表了文檔和查詢的相似度。這意味着文檔中詞的位置信息沒有被使用,一個文檔僅僅被看成一個詞袋(a bag of words)。

一個簡單的vsm模型的文檔向量根據文檔是否包含一個詞將這個詞對應的維度設成1或0。在不考慮查詢詞權重的情況下,查詢向量中所有詞對應的維度都被設成1。在這種簡單模型下,兩個向量的點積就是兩個向量中公共詞的個數。在這種簡單模型下,兩個包含同樣數量公共詞的文檔,一篇每個詞只出現一次,另一篇每個詞出現多次,這兩篇文檔會獲得相同的得分。然而哪篇文檔的主題和查詢詞會更接近呢?tf/idf中的tf部分幫助我們解決這個問題:tf指的是詞項的頻率(term frequency),解決方法就是使用詞項的頻率替代文檔向量中簡單的0或1。

最簡單的計算tf的方法是將文檔中出現某個詞項的次數作為這個詞項的tf。這種簡單的方式會帶來一個問題。假設一個查詢是fire fox,兩篇文檔用tf表示分別是D1{15,0}D2{5,5},使用查詢Q{1,1}查詢的時候,D1得分會是15,D2得分是10。有可能D1是一篇很長的關於火災的文章而D2是一篇關於如何安裝火狐瀏覽器的入門教程。你認為哪篇更貼近於查詢呢?為了讓包含更多查詢詞的文檔獲得較高的得分,if/idf使用log(tf)作為向量維度的值。如果你還記得數學課學過的知識的話,應該知道log(0)無限趨於負無窮,而log(1)=0。為了獲得想要的效果,我們可以在log運算前先給tf+1,也就是log(tf+1)。使用自然對數進行計算,現在兩篇文檔的向量變成了D1{2.772588722239781,0}D2{1.791759469228055,1.791759469228055},這樣D1得分會是2.772588722239781而D2得分會是3.58351893845611。我們現在有了一個可以根據文檔中所有詞項頻率評估文檔相似度的模型。

tf-idf的另一個部分是IDF,逆文檔頻率(Inverse Document Frequency)。idf的定義是總的文檔數/包含詞項的文檔數。idf用來處理在一種語言中一部分詞比其他詞出現頻率更高的現象。事實上很多頻繁出現的詞被作為噪音。如果在每篇文檔中都含有同一個詞,那么這個詞對選擇文檔能有什么幫助呢?你也許會說那么為什么不用停用詞(stop words)呢?當然,Elasticsearch有停用詞機制,然而使用停用詞被證明有時可能會損失精確度,而且使用停用詞不只是語言相關的,還是領域相關的。idf代表了一個詞出現在文檔中所代表的重要性。和tf相似,一般使用idf的log值。log所使用的基數是多少並不重要,重要的是它使得只有指數增長才能帶來idf的實際增長。

為了避免除數為0,因此一般要在分數的分母處+1。在Lucene的TFIDFSimilarity中為了避免idf是負數一般還會在log外+1。

BM25

TF-IDF屬於向量空間模型,而BM25屬於概率模型,但是他們的公式可能並沒有你想象的那么大差距。兩種相似度模型都使用idf方法和tf方法的某種乘積來定義單個詞項的權重,然后把和查詢匹配的詞項的權重相加作為整篇文檔的分數。

如果你想更深入的了解BM25的理論基礎,我推薦你閱讀 The Probabilistic Relevance Framework: BM25 and Beyond.這篇文章我更側重於講解實踐。

飽和度

tf-idf和bm25都默認對於高頻率的詞項來說,該詞項的頻率繼續升高對相關性的影響實際很小。區別在於BM25在這一點上做的更好一些。在BM25中高頻詞接近飽和之后會漸進一個邊界值,而在tf-idf中則沒有邊界值。在tf-idf中,將tf乘以log的底數將會持續的讓log值+1.

增長曲線的不同意味着對於包括log基數在內固定的調節參數的任意值,你都可以在tf-idf中創建一個比bm25中tf分數更高的文檔。

下面的公式描述了tf在BM25和tf-idf中的算分函數。

我們可以畫出tf從0變化到100的時候,不同函數的變化情況。k1只取幾個代表值。

看圖的時候注意圖中函數的絕對高度是無關的,因為可以簡單的用加權因子(boost factor)調節。有趣的是每條曲線的相對增長。有兩點需要注意:首先,可以看到log函數沒有上邊界,其次,k1取到1.2~2.0時函數變化很微小。后者可以說明當你不了解如何調節k1的值時,默認的值通常就可以滿足要求。

平均文檔長度

tf-idf和BM25之間第二點主要區別是BM25中對文檔長度的使用。BM25使用文檔長度來補償長文檔通常含有更多詞從而在並不相關的情況下獲取較高tf分數的情況。然后長文檔並不一定是不好的,有些長文檔覆蓋了更廣的范圍因此是合理的。BM25通過因子B來做長度補償,B通過一個調節參數b (0<=b<=1)、文檔長度dl和平均文檔長度avdl來計算,如下:

通過定義(tf_{adjusted} = tf * B) 並且把之前公式的 (tf) 替換為(tf_{adjusted}) ,我們可以得到:

這就是BM25中tf的使用方式。

完整的詞項權重

要獲得BM25中詞項的完整計算公式,我們需要要用 (W_{i}^{TF}) 乘上 (IDF_{i})。然而BM25中idf的定義和默認相似度稍有不同,這一點也反映到了Lucene中。公式如下:

D代表文檔總數,di代表包含查詢中第i個詞項的文檔數。

Lucene中BM25的實現

Lucene使用了BM25的一個變體,分子乘了一個 (\left(k_{1} + 1\right))。這是一個常用的技巧,使得公式和其他的排序方法更相似從而可以更方便的比較結果值。因為這個表達式是一個常量,因此它並不會影響排序的結果。

Lucene為了提高效率,這個公式並不是完全在查詢時計算的。Lucene在索引和查詢的時候都使用相似度模型。具體實現也取決於Elasticsearch。

BM25調優

關於調節參數,k1和b的定義肯定是有意義的。合理的參數值取決於文檔數據。不幸的是,在調節參數這個事情上沒有銀彈(silver bullet),唯一的方法就是不斷嘗試和修正錯誤,但是調節參數的作用還是很大的,至少給我們調節文檔和查詢的相關性提供了一個途徑。

結論

TF-IDF能夠獲得廣泛的應用當然有其原因。它在概念上非常易於理解而且實際性能也算不錯。這就是說,還有其它的強有力的替代者。典型地,它們能夠提供更多的可調節參數。在這篇文章中我們深入講解了他們中的一個,BM25。事實上,BM25一般被認為可能比tf-idf更好,特別是在短文檔集上。不過不要忘了,文本相關性並不是Elasticsearch中排序的唯一因素。要實現好的搜索體驗,關鍵是要基於需求場景綜合文本相似性和源數據靜態屬性,例如文檔的更新時間或是文檔和查詢者之間的特定關系。也可以繼續閱讀下一篇文章:BM25和Lucene Default Similarity比較


免責聲明!

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



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