Lucene的打分機制_第1頁
Lucene的打分機制_第2頁
Lucene的打分機制_第3頁
已閱讀5頁,還剩9頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Lucene 的打分機制§ 1。配置 Lucene,對 ccer 數據建立索引和查詢系統中文分詞模塊 (IKAnalyzer可選 )§2。閱讀代碼,分析Lucene 的 ranking 算法。寫一個簡短的報告文檔。§3。改進 ranking 算法,并進行評估,給出一個實驗報告。算法改進可用方法:PageRank Combination, LSI, LanguageModel, or評估指標可用:P10, MAP, F1, or評估方法可用:human judgment or auto compare with googleresult or1.使用 IKAnaly

2、zer 對 ccer 下的 18652 左右的網頁進行了索引建立和查詢系統的建立,索引建立的過程大概持續了10 分鐘,CPU 使用率持續 100%。下面是索引建立之后的文件。 Index 文件 (調用了 optimize 之后的結果 )實現代碼如下。(附件中 )(我們做的是將目標的URL 和所得的分數顯示出來)查詢結果如下:(1)搜“北京大學”ReadNews.asp?NewsID=1487 0.14996947readview.asp?reviewID=2296&NewsID=24960.14321162ReadNews.asp?NewsID=83950.14157297Re

3、adNews.asp?NewsID=4173 0.14049698ReadNews.asp?NewsID=1890 0.14018208ReadNews.asp?NewsID=3450 0.13792434readview.asp?reviewID=2958&NewsID=30200.13510498ReadNews.asp?NewsID=6009 0.13157436ReadNews.asp?NewsID=2808 0.13154271ReadNews.asp?NewsID=1587 0.1266445418292 pages(s) found (in 63 millisec

4、onds)我看了下網頁中的內容,搜索結果中,第一個網頁有39 處匹配,文檔內容也較長。第二個網頁有3 處匹配,文檔內容很短。第三個網頁有27 處匹配,文檔內容較長。 。(2)第二次搜索是針對第一次搜索結果中,排在第三位的網頁中的內容。網頁中有一個獲得全國三好學生的學生名字,叫“曾垚”。試下看看結果。ReadNews.asp?NewsID=8395 0.73862696ReadNews.asp?NewsID=8448 0.10303292ReadNews.asp?NewsID=108940.10303292news.asp?alllistpage=910.09587039ReadNews.asp

5、?NewsID=105570.09587039ReadNews.asp?NewsID=6889 0.095870396 pages(s) found (in 31 milliseconds)果然,第一個匹配的網頁是第一次搜索的第三個網頁,結果還不錯。2.通過閱讀相關文檔和源代碼,Lucene 的 Ranking 算法中,包括 score 的計算和相似度分析。Lucene 將信息檢索中的Boolean model (BM) 和 Vector SpaceModel(VSM) 聯合起來,實現了自己的評分機制。VSM 模型如下:計算某個查詢 q 的文檔 d 得分如下 (摘自 API 文檔注釋 ):其中

6、每個因子的分析如下:1)在 Lucene 的實現中,使用了2)反映有多少個文檔包含了該term,文檔數越多,該因子的值越小,反之越大。計算idf 的常用方法為3)查詢時期t 的加權 ,或者由 t.setBoost(int boost) 來指定4)壓縮幾個索引期間的加權和長度因子。計算公式如下:其中的因子解釋如下:Document boost:文檔加權。在索引創建過程中寫入了索引中。用doc.setBoost()Field boost:字段加權,在索引創建過程中寫入了索引中。field.setBoost()lengthNorm(field):由字段( Field )內的Token 的個數來計算此

7、值,字段越短,評分越高,在做索引的時候由Similarity.lengthNorm計算。5) 評分因子, 是基于文檔中出現查詢項的個數。 越多的查詢項在一個文檔中,說明些文檔的匹配程序越高。6)查詢的標準查詢,使不同查詢之間可以比較。此因子不影響文檔的排序,因為所有有文檔都會使用此因子。這個因子是在查詢的時候計算的。而 sumOfSquareWeights 的計算由下面來得到: (注:以上部分摘自 Lucene 的 API 文檔的英文部分,自己進行了理解和翻譯 )在 Lucene 中計算的具體過程分析如下:在 Lucene 的 Ranking 計算過程中,包括了Query 、 Weight、S

8、core、 Similarity,Collector 幾個不同的類。文檔匹配階段主要調用Searcher 對象的 search 方法,在search方法內部,通過直接或間接調用, search(Weightweight, Filter filter, Collectorcollector) 方法。通過閱讀源代碼,使用search 的時候都將得到一個 Weight 對象 (第一個的search 方法顯示調用了Query的createWeight 方法來創建一個 Weight 對象 ),Weight 對象會創建一個 Scorer 對象, Scorer 對象來進行 score 函數的調用并將結果保存

9、在Collector 對象中。如下:。public void search(Query query,Collector results)throwsIOException search(createWeight(query), null, results);Overridepublic voidsearch(Weight weight, Filter filter, Collector collector)throws IOException if(filter = null) /沒有使用 Filter 對象的時候for (int i = 0; i < subReaders.le

10、ngth;i+) / 遍歷每個 subReader,但在 indexSearcher 中,只有一個 readercollector.setNextReader(subReadersi, docStartsi);Scorer scorer = weight.scorer(subReadersi, !collector.acceptsDocsOutOfOrder(), true);/ 創建了一個 scorer 對象if (scorer != null) scorer.score(collector);/ 將結果保存在collector 中,以便后邊使用else for (int i = 0; i

11、< subReaders.length;i+) / search each subreadercollector.setNextReader(subReadersi, docStartsi);searchWithFilter(subReadersi, weight, filter, collector);public Weightweight(Searcher searcher) throws IOException Query query= searcher.rewrite(this);Weightweight = query.createWeight(searcher);fl

12、oatsum = weight.sumOfSquaredWeights();floatnorm = getSimilarity(searcher).queryNorm(sum);if(Float.isInfinite(norm) | Float.isNaN(norm)norm = 1.0f;weight.normalize(norm);/ 歸一化return weight;在源代碼中可以看出 (沒有列出 ),在 IndexReader 中的subReaders數組中存放的只有原 reader,沒有其他的 reader,那么docStarts 數組中也是一個只包含一個0 的長度為 1 的數組。構

13、造 Weight 對象,通過調用scorer 函數來構造Score 對象,得到所有符合要求的文檔序列。IDF 的計算: (在 DefaultSimilarity類中 )public floatidf(int docFreq, int numDocs) return(float)(Math.log(numDocs/(double)(docFreq+1)+ 1.0);TF 的計算: (在 DefaultSimilarity中 )publicfloat tf(float freq) return (float)Math.sqrt(freq);得到 Boost:(在 Query 類中。雖然在 Fieldable 接口和 Document 類中也有 setBoost 方法,但是還是建議在 Query 中調用,因為在 Fieldable 和 Document 中定義 boost 的話,會一同寫到 index 中,想改變 boost 會變得困難。 如果確實想提高一個文檔或文檔中某個 Field 的分值,可以同index 一起寫到索引文件中)public float getBoost() return boost;/Query 類中的方法3.Lucene 的Ranking算法的結果主要有S

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論