在進一步討論相關度和評分之前,我們會以乙個更高階的話題結束本章節的內容:可插拔的相似度演算法(pluggable similarity algorithms)。 elasticsearch 將 實用評分演算法 作為預設相似度演算法,它也能夠支援其他的一些演算法,這些演算法可以參考 相似度模組 文件。
能與 tf/idf 和向量空間模型媲美的就是 okapi bm25
,它被認為是 當今最先進的 排序函式。 bm25 源自 概率相關模型(probabilistic relevance model) ,而不是向量空間模型,但這個演算法也和 lucene 的實用評分函式有很多共通之處。
bm25 同樣使用詞頻、逆向文件頻率以及字段長歸一化,但是每個因子的定義都有細微區別。與其詳細解釋 bm25 公式,倒不如將關注點放在 bm25 所能帶來的實際好處上。
詞頻飽和度
tf/idf 和 bm25 同樣使用 逆向文件頻率 來區分普通詞(不重要)和非普通詞(重要),同樣認為(參見 詞頻 )文件裡的某個詞出現次數越頻繁,文件與這個詞就越相關。
不幸的是,普通詞隨處可見,實際上乙個普通詞在同乙個文件中大量出現的作用會由於該詞在 所有 文件中的大量出現而被抵消掉。
曾經有個時期,將 最 普通的詞(或 停用詞 ,參見 停用詞)從索引中移除被認為是一種標準實踐,tf/idf 正是在這種背景下誕生的。tf/idf 沒有考慮詞頻上限的問題,因為高頻停用詞已經被移除了。
elasticsearch 的standard
標準分析器(string
字段預設使用)不會移除停用詞,因為儘管這些詞的重要性很低,但也不是毫無用處。這導致:在乙個相當長的文件中,像the
和and
這樣詞出現的數量會高得離譜,以致它們的權重被人為放大。
另一方面,bm25 有乙個上限,文件裡出現 5 到 10 次的詞會比那些只出現一兩次的對相關度有著顯著影響。但是如圖 tf/idf 與 bm25 的詞頻飽和度 所見,文件**現 20 次的詞幾乎與那些出現上千次的詞有著相同的影響。
這就是 非線性詞頻飽和度(nonlinear term-frequency saturation) 。
在 字段長歸一化 中,我們提到過 lucene 會認為較短欄位比較長字段更重要:字段某個詞的頻度所帶來的重要性會被這個字段長度抵消,但是實際的評分函式會將所有欄位以同等方式對待。它認為所有較短的title
欄位比所有較長的body
欄位更重要。
bm25 當然也認為較短欄位應該有更多的權重,但是它會分別考慮每個字段內容的平均長度,這樣就能區分短title
欄位和長
title 字段。
在 查詢時權重提公升 中,已經說過title
字段因為其長度比body
字段 自然 有更高的權重提公升值。由於字段長度的差異只能應用於單字段,這種自然的權重提公升會在使用 bm25 時消失。
不像 tf/idf ,bm25 有乙個比較好的特性就是它提供了兩個可調引數:
k1
這個引數控制著詞頻結果在詞頻飽和度中的上公升速度。預設值為1.2
。值越小飽和度變化越快,值越大飽和度變化越慢。
b
這個引數控制著字段長歸一值所起的作用,
0.0
會禁用歸一化,1.0
會啟用完全歸一化。預設值為0.75
。在實踐中,除錯 bm25 是另外一回事,
k1
和b
的預設值適用於絕大多數文件集合,但最優值還是會因為文件集不同而有所區別,為了找到文件集合的最優值,就必須對引數進行反覆修改驗證。
余弦相似度及基於python的余弦相似度實現
余弦相似度,又稱為余弦相似性,是通過計算兩個向量的夾角余弦值來評估他們的相似度。對於兩個向量,可以想象成空間中的兩條線段,都是從原點 0,0,出發,指向不同的方向。兩條線段之間形成乙個夾角 如果夾角為0度,則意味著方向相同 線段重合 如果夾角為90度,意味著形成直角,方向完全不相似 如果夾角為180...
初學hadoop之一 相似度計算(余弦距離)
一 問題 老師給我們留的作業就是求乙個或多個txt檔案中任意兩行的距離 余弦 jacard 歐式距離都行 txt檔案中每一行是中文英文還是數字都不限。下面 的我做測試用的資料格式是這樣的 1,前面的1為行號,後面 裡的內容為真正要計算距離的某一行至,每個值之間用空格隔開。二 余弦距離 網上關於余弦距...
余弦相似度 高維資料 文字相似度的設計與實現
摘要 本文主要設計並實現了乙個文字相似度系統,該系統主要功能計算文件之間的相似度,通過使用向量空間模型 vsm,vector space model 及余弦相似度計算公式計算文件之間的相似度,資料預處理過程中加入word2vec模型進行語義擴充,從而能夠匹配到更多相關文件。向量空間模型 vsm,ve...