王瑋璇
(1.同濟大學,上海 200092;2.上海亞太神通計算機有限公司,上海 200040)
在計算機語言中,數據總體上可分為結構化數據和非結構化數據,結構化數據指的是具有固定格式或有限長度的數據,如XML、數據庫、數據結構等。非結構化數據指不定長度或無固定格式的數據,如郵件、文檔等。由于結構化數據具有一定的規律和結構,因此查詢起來比較容易和快速。但對于非結構化數據,目前大量使用的方法是全文檢索法,其基本思路是從非結構化的數據中提取一部分信息進行重構,使其具有一定的結構,然后再對這部分有結構的數據進行搜索[1]。在日常生活中,對非結構化數據的需求量要遠多于對結構化數據的需求量,因此,全文檢索法作為創建搜索引擎的基本思路被廣泛使用。
目前,判斷兩組向量相關性的方法主要使用空間向量模型算法,作為業界最為知名的開源搜索引擎Lucene,它的評分機制也是以空間向量模型作為理論基礎。Lucene 默認通過實現Similarity 模型對文檔相關性進行評分[2]。但在實際應用中,Similarity 模型的默認實現往往不能夠適應特定的業務邏輯,需要對Similarity 模型進行衍生和擴展。在常見的內容管理系統門戶網站中都具有全文檢索功能,能夠根據查詢關鍵字將站內的數據按照一定的排序邏輯進行檢索,本文將著重研究內容管理系統中全文檢索功能的具體實現。
全文檢索過程主要分為索引創建和索引搜索兩部分。索引創建對包括文件系統、數據庫、互聯網等現實世界中所有結構化和非結構化的數據進行提取和重構,使之成為結構化文檔;索引搜索是從客戶端得到查詢語句,再從現有的索引中查詢符合關鍵字的結果[3]。
Lucene 是一套用于全文檢索和搜尋的開源程式庫,由Apache 軟件基金會支持和提供。Lucene 提供了一個簡單卻強大的應用程式接口,提供全文索引和搜尋功能。在Java 開發環境里Lucene 基于Java 開發環境,具備成熟的開源全文檢索框架,它的評分機制(Lucene Scoring) 建立在Similarity 模型的基礎上,是整個框架的核心部分[4]。
在Lucene 中,默認Similarity 模型的實現是基于空間向量模型中的向量相關性的余弦公式,其評分公式為:

其中,coord(q,d)—該分值衡量了文檔中所含Term 的數量,Term 的數量越多,相應文檔的分值越高;queryNorm(q)—表示標準化因子,對多個查詢器返回的結果進行比較,不影響文檔的排名。用于給查詢器設置權重;tf(tinq)—表示查詢關鍵字在文檔中出現的頻率,即詞頻。關鍵詞在文檔中出現的次數越多,得分越高;idf(t)—代表著關鍵字的逆詞頻,衡量了關鍵字在整個文檔庫中出現的頻度。其值越大,得分越高;t.getBoost()—該值表示搜索時權重因子,用于在查詢時賦予不同的查詢關鍵字相應的權重;norm(t,d)—封裝了索引時的標準化因子,它包括三個參數: ①Document boost: 衡量了文檔的重要程度,該值越大,說明此文檔越重要;②Field boost: 設置域的權重,值越大,說明該域越重要;③Length Norm: 衡量了文檔的長度,文檔越長,值越小。
Lucene 默認的相似度評分算法考慮到不同的影響因素,提供了比較精確的相似度算法,但對于全文檢索業務邏輯,其檢索結果與用戶滿意度存在較大的差距,它在文檔相似度上計算得非常細致,但對于所有全文檢索業務邏輯來說并不是越細致越好[5],如圖1 所示的為使用Lucene 默認的DefaultSimilarity 相似度模型算法查詢關鍵字為“2013 同濟” 的文檔。
在前6 篇文檔的標題和摘要中出現 “2013 同濟” 的次數是差不多的,事實上它們在相似度評分上的差異并不大,用戶此時更關心的是查詢關鍵字在標題中的命中率以及發布日期越新越好,但默認的相似度算法計算出的評分太過細致,人工基本無法使用其他排序規則對這些相似度差異不大的文檔進行排序。這就要求我們在創建索引時提高標題域的權重,同時對Similarity 模型進行改造[6],在查詢結果排序時對相似度相同的文檔按照發布日期進行倒序排列[7],除此之外,在內容管理系統發布文章時,通常都會設置文章的欄目,因此,在創建索引時需要將欄目信息也進行索引。具體做法如下:
(1)在創建每一篇文檔的索引時,為欄目、標題、摘要和發布日期創建索引,同時提高標題域的權重,本文中將其放大100 倍,這樣做的目的是增加關鍵字在標題中出現的評分比重。
(2)新建Similarity 模型CustomSimilarity,使用面向對象方式將其繼承Similarity 默認的DefaultSimilarity 實現類,并重寫其中計算queryNorm,tf,idf 等相關性因子的計算邏輯,此處為了徹底屏蔽這些次要因素對相關性評分的影響,均將它們的計算結果返回1.0f。這樣做意在使相似度差不多的文檔具有相同的相似度,以此來突出發布日期對排序的影響。

圖1 使用DefaultSimilarity 的查詢結果

表1 相關性評分的比較
(3)在查詢索引時,先確定欄目域,再對查詢關鍵字進行分詞處理,最后按照相關性評分排序,對于評分相同的文檔按照發布日期倒序,取排序前十名的文檔。使用explain 方法對比DefaultSimilatiry 和CustomSimilatiry 計算的相關性信息可以得出表1 的數據[8],由于屏蔽了詞頻、逆詞頻、關鍵字權重、文檔權重、文檔長度等因素的影響,CustomSimilatiry 相對于DefaultSimilatiry,它的得分粒度被放大了,從而出現了一些有著相同相關性評分的文檔,把這些文檔按照發布日期進行倒序排列,如圖2 所示,最終得到的是更加合理的查詢結果。
對于Lucene 搜索引擎來說,其默認的相關性評分模型僅僅提供了一種通用的相關性算法,對于特定的檢索邏輯,需要借用面向對象的方法對默認的相關性模型算法進行擴展。本文描述了在內容管理系統中對Lucene搜索引擎文檔相關性評分模型Similarity 進行個性化定制,從中可以看出經過自定義的評分模型相比默認的評分模型更具合理性,類似的,這種自定義評分模型的方式也可以使用在其他全文檢索業務當中。

圖2 使用CustomSimilarity 的查詢結果
[1] 倪俊峰.基于黃頁搜索引擎的關鍵字排名廣告系統的設計與實現[A];2005年中國索引學會年會暨學術研討會論文集[C];2005.
[2] 李明宙,羅艷,王宗義.Lucene 全文檢索引擎的研究及應用[A];廣西計算機學會,2010年學術年會論文集[C];2010.
[3] 張校乾.基于Lucene 的全文檢索系統的研究與應用[D].大連理工大學,2005.
[4] 徐財應.基于Lucene 的搜索引擎技術的研究與改進[D].長春理工大學,2010.
[5] 于飛.基于搜索引擎的個性化推薦研究[D].哈爾濱理工大學,2010.
[6] 周月紅.基于Lucene 的站內搜索引擎的設計與開發[D],華東理工大學,2011.
[7] 侯云.構建基于Lucene 的網站站內搜索[J].信息與電腦(理論版),2010,2.
[8] 王紅勝.多文檔全文檢索系統的設計與開發[D].電子科技大學,2010.