《資訊檢索導論》讀書筆記
1引言
隨著網際網路資訊的不斷膨脹,如何快速從大量資料中獲取需要的資訊也成為當前一個重要的問題。谷歌、百度、雅虎等公司建立了強大的網際網路搜尋引擎用於快速檢索使用者需要的網頁,一些電商、專業網站往往也建立了內部的檢索系統,這一系列背後的技術都離不開資訊檢索這一門學科的知識。本文將圍繞這一方面進行詳細地解說。
2 資訊檢索概述
資訊檢索是從大規模非結構化資料(通常是文字)的集合(通常儲存在計算機上)中找出滿足使用者資訊需求的資料(通常是文件)的過程。資訊檢索也能涵蓋上述基本定義之外的資料型別和資訊處理問題。
資訊檢索也可以按照它們所處理資料的規模進行區分,比如可以將資訊檢索按照資料的規 模分成 3 個主要級別。第一個級別是以 Web 搜尋(web search)為代表的大規模級別,此時需 要處理儲存在數百萬臺計算機上的數十億篇文件;二個級別是小規模,可以看成是與第一種規模相對的另一極端情況,這種規模 的一個代表性例子為個人資訊檢索;介於第一種大規模和第二種小規模之間的資訊檢索主要面對的是中等規模的資料,包括面向企業、機構和特定領域的搜尋
3 布林檢索模型
布林檢索模型接受布林表示式查詢,即通過AND、OR及NOT等邏輯操作符將詞項連線起來的查詢。建立布林檢索模型的一般過程是:文字分詞處理、建立倒排索引、處理查詢。
1) 倒排索引
一個倒排索引由一個詞項詞典和每個詞項對應的倒排記錄組成。詞項詞典中記錄了文件中出現的所有單詞,而詞項對應的倒排記錄則記錄了該詞項在什麼文件或者什麼位置出現。
假如對一本100頁的書建立倒排索引如下圖所示,那麼第一排表示“資訊”這個詞在第1、6、9、50、89頁出現。
建立一個倒排索引往往包括以下幾步:
1. 收集需要建立索引的文件
2. 將每篇文件轉換成一個個詞條的列表,即詞條化。
3. 進行語言學處理,產生歸一化詞條來作為詞項
4. 對所有文件按照其中出現的詞項來建立倒排索引。
2) 布林查詢處理
建立好倒排索引後,接下來就可以處理查詢了。例如,我們要查詢“資訊檢索”在書中哪一個位置出現了,那麼首先需要解析這個查詢。根據布林檢索的要求,查詢被轉譯成了“資訊”and“檢索”,計算機會在倒排索引中分別查詢“資訊”和“檢索”兩個詞項的倒排記錄,如果有一個位置兩個詞項都出現了,就作為一個結果返回。於是,返回了第1頁和第86頁的結果。
可以發現,其實對and型別的檢索是對詞項取了交集,這一過程可以通過對倒排記錄的合併演算法來快速完成。
Intersect (p1, p2) answer while p1 != NIL and p2 !=NIL do if docID(p1) = docID(p2) then Add( answer, docID(p1) ) p1 .next(p1) p2 .next(p2) else if docID(p1) < docID(p2) then p1 .next(p1) else p2 .next(p2) return answer |
如果查詢中有非邏輯,那麼需要對演算法進行一些擴充套件。
3) 採用跳錶優化
合併演算法在處理倒排記錄上的查詢效率可以通過一些改進來進一步提高,採用跳錶就是其中一種。
跳躍列表(也稱跳錶)是一種隨機化資料結構,基於並聯的連結串列,其效率可比擬於二叉查詢樹(對於大多數操作需要O(log n)平均時間)。
基本上,跳躍列表是對有序的連結串列增加上附加的前進連結,增加是以隨機化的方式進行的,所以在列表中的查詢可以快速的跳過部分列表,因此得名。所有操作都以對數隨機化的時間進行。
考慮上圖的倒排記錄,當查詢Brutus和Caesar時,查詢到8這個記錄後,Caesar到了41,Brutus需要連續比較4次才會來到43這個記錄,如果在Brutus的14記錄上增加一個指標指向28,那麼可以跳過19、23的比較,從而加快查詢效率。
4) 詞項集合的確定
以上我們介紹瞭如何用詞項建立倒排索引,以及如何用倒排索引處理查詢,然而跳過了一個重要的問題——如何確定詞項集合。確定詞項集合主要分為幾個部分:詞條化、去除停用詞、詞項歸一化、詞幹還原和詞形歸併。
i. 詞條化
詞條化類似於自然語言處理中的分詞概念,然而在資訊檢索中往往忽略標點符號,而分詞是需要保留標點以方便詞性標註的。這裡有幾個重要的概念需要區分:
詞條:文件中出現的字元序列的一個例項;
詞條類:相同詞條構成的集合;
詞項:資訊檢索詞典中所包含的某個可能經過歸一化處理的詞條類。
詞條化的主要任務是確定哪些才是真正的詞條,針對不同的語言,詞條化的複雜程度是不一樣的。英文的詞條化常見的問題是,一個單詞詞條化後是否表達正確的意思,比如“奧尼爾”的拼寫是O’Neill,它的詞條化可以是oneill,o’neill, o’ neill, o neill。對於漢語、阿拉伯語、日語等語言還會有更復雜的問題。另外,一個新詞的產生也會帶來如何去詞條化的問題。
ii. 去除停用詞
對於這麼一個句子“但是,由於經濟發展的不平衡,很多地區的矛盾開始進一步升級。”裡面的“但是”、“由於”等連詞往往不需要重視,它們的存在反而會影響查詢的效果,這是就需要將它們去除。常見的方法是建立一張停用詞表。
在資訊檢索系統不斷髮展的歷程中,停用詞表有從大到小,最後到不使用的趨勢,特別是Web搜尋引擎通常都不用停用詞表,否則就會出現像中國移動推出的“和手機”無法檢索的案例。
iii. 詞項歸一化
將文件和查詢轉換成一個個的詞條之後,最簡單的情況就是查詢中的詞條正好和文件中的詞條相一致,然而很多情況下,即使此條之間並不完全一致,我們仍希望它們能夠進行匹配,這時就需要進行詞條歸一化。
詞條歸一化就是將看起來不完全一致的多個詞條歸納成一個等價類,最常規的做法就是建立等價類,每一個等價類用其中的某個元素進行命名。建立等價類有兩種方式,一種叫做建立顯示等價類,另一種是建立隱式等價類。
常見的建立隱式等價類的方法是去除字元,比如連詞符,這種方法不需要事先計算出等價類的全部元素。
建立顯示等價類的方法則是維護多個非歸一化詞條之間的關聯關係,比如“喜歡”和“喜愛”這種近義詞或者同義詞。實現這種等價類的常用方法有兩種,一種是採用非歸一化的詞條進行索引,併為查詢詞項維護一張由多個片語成的查詢擴充套件表,然後將它們的查詢結果進行合併;另一種方式是在構建索引時就對詞進行擴充套件,“喜歡”出現的記錄在“喜愛”這個詞項中也進行記錄。第一種方式需要更多的查詢時間,而第二種方式則需要更大的儲存開銷。
iv. 詞幹還原和詞形歸併
出於語法上的要求,文件中的同一個詞往往會以不同的形態出現,如英文的一般現在時、現在進行時、一般過去時、過去分詞、三人稱單數等等。對它們進行歸一化就是詞幹還原和詞形歸併的工作了。
詞幹還原是指很粗略地去除單詞兩端詞綴地啟發式過程,並且希望大部分時間它都能達到這個正確目的,包括去除派生詞綴。
詞形歸併則是利用詞彙表和詞形分析來去除詞綴,從而返回詞地原形或詞典中的詞地過程。
4 向量空間模型
用布林模型進行檢索可以得到查詢關鍵詞在哪些文件中出現,但是無法對這些查詢結果進行相關度評分。因此引入了向量空間模型(VSM),它將一系列文件表示為在同一向量空間中的向量形式。向量空間模型是資訊檢索領域一系列相關處理的基礎,如文件評分、分類、聚類等。那麼首先需要介紹如何將文件進行向量化。
1) 文件向量化和Tf-Idf權重
將一篇文件看成是一個向量,其中每個分量都對應詞典中的一個詞項,採用權重計算公式計算出詞項的權重值作為該分量的大小,如果一個詞項在一篇文件中沒有出現,那麼這篇文件中該詞項對應分量值為0 。通過這種思路,就可以對文件進行向量化,向量化後的文件表示如下:
其中d表示文件向量,而ti表示每個token 代表的分量。這是一種詞袋模型的思想,詞袋模型忽略了詞與詞之間的順序和關聯關係,只保留出現的次數。
一個詞項在文件中出現頻率越高,那麼它所佔文件的權重也應該更高,對應的分量的值也應該更高,這是基於詞頻決定向量值的思想。然而,實際問題中,一篇文件包含多個“和”“不”“因為”“如果”這種並不重要的詞,並且它們出現的頻率很高,從而降低查詢的準確率。採用停用詞表是一個解決該問題的方法,但是會因此帶來其他的問題,有一種更好的方法可以有效解決這個矛盾,就是Tf-Idf(詞項頻率-逆文件頻率)加權。
同一個單詞如果在越多的文件中出現,我們認為它是越不重要的,基於這種思想,我們引入了逆文件頻率(Idf)的概念。
其中N代表文件中的文件數目,dft代表文件頻率,即一個詞項在多少文件中出現的數目。dft 越大,idft越小。
對於每篇文件的每個詞項,將tf和idf組合在一起形成tf-idf權重,計算公式如下:
對文件d中的詞項t,當t只在少數幾篇文件中多次出現時,權重取值最大。
2) 向量空間模型
所有需要建立索引的文件的所有詞項組成了一個向量空間,每篇文件都由空間中的一個向量來表示,這樣的模型就是向量空間模型。
在向量空間模型中,我們可以對文件進行相似度的計算,採用類似的方法也可以計算查詢與文件之間的匹配得分,從而對檢索結果進行排序。
計算餘弦相似度是最常用的比較文件之間相似程度的方法,因為它可以有效避免因為文件長度不一致帶來的誤差。計算公式如下:
式中分子是兩個向量的內積,分母是兩個向量的歐式距離,除以分母的作用相當於將向量進行歸一化。公式計算出的結果是兩個向量的夾角餘弦。
3) 查詢向量
文件可以表示成向量,那麼一個查詢語句也可以。對於查詢q,它與一篇文件d之間的相似度是:
這樣一來,檢索過程就是:計算查詢向量和文件集中每個向量的餘弦相似度,結果按照得分排序,並選擇得分最高的K篇文件。然而只採用這種查詢方法,如果向量空間的維度很大,那麼每次查詢都會做很多次內積計算,效率很慢。
至此,一個典型的檢索系統由以下幾部分組成:向量化後的文件集、查詢向量、正整數K。檢索目標為:給定查詢,從文件集合中返回得分最高的K篇文件。以下是返回查詢q的前K篇相似文件的演算法描述,該演算法使用了查詢向量的非0分量對每篇文件計算得分,然後排序返回。
4) 快速評分和排序
為了提高檢索效率,需要對倒排索引進行一些改進,第一是將N/dfi 儲存在t對應的倒排記錄表的頭部,從而避免使用浮點數,減少儲存開銷;第二是在倒排記錄中儲存詞項頻率tf t,d。
在檢索過程中由這樣一個事實,對於查詢q來說,它的非0分量只是少數關鍵詞對應的分量,不考慮查詢詞項的權重時而給定查詢時實現文件排序的目標,實際上只需要得到文件之間的相對得分。因此只需要計算文件的單位向量和查詢的布林向量(0-1向量)而不是單位向量。改進後的快速評分演算法如下:
該演算法的一大改進在於將浮點數的先乘後加改成了整形的累加,提升了演算法的效率。
5) 非精確返回前K篇文件的方法
以上的介紹都是精確返回前K篇文件的方法,然而在實際檢索過程中存在很多非精確的方法,可以大幅降低計算的複雜度,同時並不會讓使用者感覺到相關度的降低。這些方法主要分為兩個步驟:
a) 找到文件集合A,它包含參與最後競爭的候選文件,其中K<|A|<<N,A不必包含前K篇得分最高的文件,但是應該包含很多和前K篇文件得分相近的文件;
b) 返回A中得分最高的K篇文件。
以下是一些經常使用的非精確返回前K篇文件的方法:
i. 索引去處技術
索引去除技術的含義就是通過減少查詢的索引數目來加快查詢效率,常用的方法兩種,一種是隻考慮idf值超過一定閥值的詞項所在的文件,因為idf較低的詞項倒排索引較長,並且它們對評分結果沒有什麼貢獻;另一種是隻考慮包含多個查詢詞項的文件,但是這種方法存在的風險是可能返回的文件數目不足K。
ii. 勝者表
勝者表的基本思路是對於詞典中的每個詞項t,預先計算出r個最高權重的文件;給定查詢q,對q中所有詞項的勝者表求並集。r值的確定是這一技術的難點。
iii. 簇剪枝方法
簇剪枝方法中沒首先對文件進行聚類,然後在查詢處理時,只考慮利用少數幾個簇中的文件進行餘弦相似度計算。這裡面涉及到先導者和追隨者問題,其實也就是聚類演算法中所說的聚類中心和範圍類中的點。方法如下:
查詢過程處理如下:
5 資訊檢索系統的評價
至此,介紹完了一個完整的搜尋引擎所有的部分,其總體架構可以用下圖來表示:
接下來需要關心的是,如果評價一個搜尋引擎檢索結果的好壞。
通常情況下,會給定一個測試集,根據返回結果度量兩個指標:正確率(查準率)和召回率(查全率)。準確率反映搜尋引擎返回的正確結果與總結果間的關係,召回率反映正確結果與本應該返回的結果數之間的關係。
為了更好的理解上述概念,可以對照下表:
那麼,正確率P和召回率R的計算公式為:
還有一種融合了P和R的指標是F值,它是這兩個指標的調和平均值,計算公式如下:
當值為1時,公式可以簡化為:
6 小結
近期閱讀《資訊檢索導論》一書,對這一領域有了更深刻的認識。資訊檢索涉及範圍廣,包括自然語言處理、機器學習等相關領域,並在實際場景中對它們進行了運用,對交叉學習很有幫助。運用該書所講知識,結合Apache Lucene的學習,理論與實踐相輔相成,對一個搜尋引擎的完整結構有了更深入的瞭解。