一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

HubbleDotNet 和 Lucene.Net 匹配相關度的比較

  很多網友在使用 Lucene.NET (Lucene Java 版本也是一樣)后會感覺Lucene.NET 的匹配相關度存在問題,搜索得到的結果往往不是希望的結果,不完全匹配的記錄往往比完全匹配的記錄排序還要靠前,很多人試圖通過分詞來解決,中文環境搜索,分詞確實能解決一些問題,但不能根本解決問題,而英文環境下,分詞根本無法解決任何問題。

  問題的本質是由于Lucene的得分算法缺陷造成的,不改進得分算法根本不能根本解決問題。HubbleDotNET的得分算法參考了Lucene的得分算法并做了重大改進,匹配相關度比Lucene.NET 有了顯著提高。本文結合一個極端的例子來分析兩者得分算法的異同,并從原理上講解為什么HubbleDotNET 的匹配相關度要比Lucene.NET 的高。

  先看例子

  我們對下面兩條記錄分別用 Lucene.NET 2.9.1 和 HubbleDotNET 0.9.7.1 進行索引。

  記錄1

  教育問題一直是國家最關心的,我們要長抓不懈

  記錄2

  教育獨生子女問題,這是很多家長要關心的問題

分詞采用盤古分詞,分詞參數中關閉多元分詞。

兩個句子的分詞結果分別為:

教育/問題/一直/是/國家/最/關心/的/我們/要/長抓/不懈/

教育/獨生子女/問題/這/是/很多/家長/要/關心/的/問題/

要搜索的句子是:教育問題

其分詞結果為:教育/問題/

從直觀上看,記錄1 是完全匹配,應該得分比記錄2高,這也是我們希望的排序結果,即記錄1排在第一個,記錄2排第二個。

  下面看看實際的排序結果:

  Lucene.NET 的排序結果:(這是盤古分詞帶的Lucene.NET 的例子稍作改動后(將得分輸出了)的輸出結果) 從結果我們可以看出記錄2被排在了第一位,得分為 0.042 而記錄1 的得分為 0.034 排第二位,這個顯然不是我們希望的結果。

image

  再看HubbleDotNET的結果

image

  這里我們看到記錄1被排在第一位,得分為 390218522

  記錄2 排第二位,得分 85937

  原因分析

要分析兩者匹配相關度的差異,我們需要比較兩者的基礎得分算法

  Lucene 的基礎得分算法

image

coord(q,d): 文檔d中,q中命中的項數除以查詢q的項總數

queryNorm(q): 只在不同query比較時影響score的normalizing因素

tf(t in d):單文本詞匯頻率,t在文檔d中出現的次數除以d中所有的項總數的平方根

idf(t):逆文本頻率指數,log(numDocs/docFreq+1)+1.0

image

  If the document has multiple fields with the same name, all their boosts are multiplied together

  從Lucene的得分算法公式我們可以看出,得分算法和單詞在文檔中的位置沒有任何關系,也就是說Lucene 的得分算法只關心單詞分量的出現頻率,不關心出現位置。這就不難理解為什么文檔2的得分比文檔1高了,因為文檔2中 “教育”分量出現了1次,“問題”分量出現了2次,而文檔1中這兩個分量各出現了一次,另外idf 和 norm(t,d) 在當前環境中又幾乎相等,于是文檔2的得分就超過了文檔1。這是Lucene得分算法的重大缺陷,因為文檔的匹配相關度不僅與頻率有關還與位置有關。

  HubbleDotNET 的基礎得分算法

  HubbleDotNET 在設計得分算法時充分考慮到了Lucene 的這個缺陷,在得分算法中加入了位置函數 fp(t,d,q) ,這個位置函數的加入使HubbleDotNET 的匹配相關度比Lucene有了大幅的提高。 

HubbleDotNET 的基礎得分算法公式如下:

image

  這個算法其實是以 TF-IDF 算法為基礎并增加了位置函數 fp(t,d,q)

其中

  • FieldRank 為字段權值
  • Rank(t,q) 為單詞分量(term)的在查詢字符串中的權值,即 教育^1^0 中的 1
  • Rank(t,d) 為單詞分量(term)所在文檔的權值,默認為1,如果要指定文檔權值,需要在表中增加一個 rank int untokenized 字段。
  • TF(t,d) : 為單文本詞匯頻率,要查詢的單詞分量(term)在文檔中的出現的次數除以文檔所有單詞分量出現的次數。

公式如下:

image

  • IDF(t) 為逆文本頻率指數。

公式如下:

image

|D|: 文本集合的文檔總數

image : 為含有單詞分類(term)的文檔總數

HubbleDotNET 的 tf idf 算法是根據標準算法來寫的,和Lucene 的算法有不同。參考 tf-idf

  • Sum(t) = 單詞分量(term) 在所有文檔中出現的總數的平方根。

公式如下:

image

  • fp(t,d,q) 是單詞分量在文檔中的位置與在查詢字符串中的位置關系函數,位置越接近,則返回值越大。

  除去 fp(t,d,q) 以外的部分和 Lucene 的得分算法是近似的,都是基于余弦定理來做的,只是在實現上有點區別而已。

  而 fp(t,d,q) 則是Lucene 得分算法所沒有的,這個函數是單詞分量在文檔中的位置與在查詢字符串中的位置關系函數,位置越接近,則返回值越大。

  就拿上面的例子來說,教育 和 問題 這兩個單詞分量在文檔1 中的位置關系和查詢字符串 “教育問題” 的位置關系是一致的,這時 fp(t,d,q) 函數的返回值就會很大,而文檔2中,兩個單詞分量的位置關系和查詢字符串“教育問題” 的位置關系不一致,這時返回值就比較小。這也就是我們看到文檔1的得分要比文檔2大幾個數量級的原因。

  關于fp(t,d,q)這個函數的實現原理我將在另外的文章中闡述,主要思路就是計算相同向量在文檔中和查詢字符串中的向量夾角然后求積,不過說起來簡單,這里面要考慮的問題還是比較多,比如如何控制返回值不能太大,查詢字符串中有多個相同單詞分量怎么處理等等。

  相關文章:

  HubbleDotNET 和 Lucene.NET 性能對比測試

  HubbleDotNET 海量數據測試報告

NET技術HubbleDotNet 和 Lucene.Net 匹配相關度的比較,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 成年人免费在线视频观看 | 久久首页| 国产成人久久精品推最新 | 狠狠影院 | 黄色小视频免费在线观看 | 韩国精品一区二区三区四区五区 | 在线精品国内视频秒播 | 91在线一区二区 | 日本欧美韩国专区 | 激情五月深爱五月 | 视频一区 在线 | 九色精品视频在线观看 | 亚洲大片免费看 | 麻豆国产在线视频 | 真实乱视频国产免费观看 | 国产91丝袜香蕉在线播放 | 在线色 | 日韩精品网址 | 国产精品免费一区二区三区 | 精品久久久99大香线蕉 | 男人把女人c爽的免费视频 男人操女人免费视频 | 超级成人97碰碰碰免费 | 亚洲热在线视频 | 亚洲天堂首页 | 亚洲国产网 | 美女色网 | 亚洲精品久中文字幕 | 日韩成人免费在线 | 国产精品精品国产 | 亚洲haose在线观看 | 亚在线| 欧美精品在线免费观看 | 九九精品在线播放 | 在线观看亚洲精品国产 | 婷婷六月综合网 | 国产成人亚洲精品91专区手机 | 国产高清国产专区国产精品 | 国产精品精品视频 | 国产久视频 | 一级女人毛片人一女人 | 一区三区三区不卡 |