信息檢索導論學習筆記(2)


詞項詞典及倒排記錄表

回顧倒排索引的構建

Image(3)

  1. 收集待建索引的原文檔(Document)
  2. 將原文檔傳給詞條化工具(Tokenizer)進行文本詞條化
  3. 將第二步得到的詞條(Token)傳給語言分析工具(Linguistic modules)進行語言學預處理,得到詞項(Term)
  4. 將得到的詞項(Term)傳給索引組件(Indexer),建立倒排索引

文檔

文檔分析以及編碼轉換

語言識別、編碼方式識別、文件格式等處理,得到字符序列。

如何確定索引的單位? 合理組織“索引粒度”,確定文檔單位

 

注:語言識別和編碼識別,理論上都可以看成是分類問題,基於分類方法進行處理。但實際中,常采用啟發式方法

 

詞條化

定義好文檔單位之后,詞條化是將給定的字符序列拆分成一系列子序列的過程,其中每個子序列稱為一個詞條(token) 。

詞條化最簡單的方法是根據空格將字符串進行拆分並去掉標點符號。然而真實情況下的詞條化處理是個復雜的過程,如上撇號 ’、連字符-、數字、復合詞、不同語言種類等等問題的處理。

實際檢索中的分詞:

  1. 查詢和文檔切分采用一致的分詞系統。
  2. 保證分詞速度,速度快
  3. 一般原則,沒把握的情況下細粒度優先,保證召回率
  4. 多粒度並存
  5. 猜想:大詞典+統計分析+啟發式規則

 

停用詞的處理:

根據停用詞表(stop list), 將那些最常見的詞從詞典中去掉。比如直觀上可以去掉:
一般不包含語義信息的詞: the, a, and, to, be
漢語中的“的”、“得”、“地”等等。
這些詞都是高頻詞: 前30個詞就占了約30% 的倒排記錄表空間

在信息檢索系統不斷發展的歷程中,有從大停用詞表(200~300 個詞)到小停用詞表(7~12個詞)最后到不用停用詞的趨勢。Web 搜索引擎通常都不用停用詞表。一些現代 IR系統更關注如何利用語言的統計特性來更好地處理常見詞問題。

現代信息檢索系統中傾向於不去掉停用詞:

  1. 在保留停用詞的情況下,采用良好的壓縮技術后,停用詞所占用的空間可以大大壓縮,最終它們在整個倒排記錄表中所占的空間比例很小
  2. 采用良好的查詢優化技術基本不會增加查詢處理的開銷
  3. 所謂的停用詞並不一定沒用,比如:短語查詢: “King of Denmark”、歌曲名或者台詞等等: “Let it be”, “To be or not to be”、“關系型” 查詢“flights to London

 

語言分析處理

 

詞條歸一化

詞條歸一化 (token normalization) 就是將看起來不完全一致的多個詞條歸納成一個等價類,以便在它們之間進行匹配的過程。

 

最常規的做法是隱式地建立等價類

刪除句點、刪除連字符     U.S.A.,USA    ------->USA      anti‐discriminatory, antidiscriminatory ------>antidiscriminatory

 

另一種建立等價類的方法是維護多個非歸一化詞條之間的關聯關系

索引階段方法:對於包含automobile的文檔,我們同時也用car來索引(同樣,包含car的文檔也用automobile來索引,如car‐automobile)

搜索階段方法:建立查詢擴展,查詢car時,合並car和automobile的倒排索引

 

進行詞條歸一化處理之后在很多情況下會提高檢索的效果,但有時也可能會損害檢索的效果。(C.A.T ----> cat)

 

詞干還原(stemming)和詞形歸並(lemmatization)

詞干還原和詞形歸並的目的都是為了減少屈折變化的形式,並且有時會將派生詞轉化為基本形式。比如: am, are, is------>be  car, cars, car’s, cars’------>car

然而,詞干還原(stemming)和詞形歸並(lemmatization)這兩個術語所代表的意義是不同的。前者通常指的是一個很粗略的去除單詞兩端詞綴的啟發式過程,並且希望大部分時間它都能達到這個正確目的,這個過程也常常包括去除派生詞綴。而詞形歸並通常指利用詞匯表(即保存的某種字典)和詞形分析來去除屈折詞綴,從而返回詞的原形或詞典中的詞的過程,返回的結果稱為詞元(lemma) 。 假如給定詞條 saw, 詞干還原過程可能僅返回 s, 而詞形歸並過程將返回 see或者 saw,當然具體返回哪個詞取決於在當前上下文中 saw 到底是動詞還是名詞。這兩個過程的區別還在於:詞干還原在一般情況下會將多個派生相關詞合並在一起,而詞形歸並通常只將同一詞元的不同屈折形式進行合並。詞干還原或詞形歸並往往通過在索引過程中增加插件程序的方式來實現,這類插件程序有很多,其中既有商業軟件也有開源軟件。 

 

詞干還原及其它歸一化工作對檢索的幫助
英語:結果要一分為二,對某些查詢來說提高了召回率,但是對另外一些查詢來說降低了正確率
對西班牙語、德語、芬蘭語等語言非常有用,其中對於芬蘭語有30% 的性能提高!

常用詞干還原算法:Porter、Snowball(Porter算法的改進版)、Lovins

 

快速倒排表合並—跳表法

skip list: 時間復雜度O(m+n)的基本合並算法的優化

Image(4)

考慮問題:在什么位置上放置跳表指針?

這里存在一個指針個數和比較次數之間的折中問題。跳表指針越多意味着跳躍的步長越短,那么在合並過程中跳躍的可能性也更大,但同時這也意味着需要更多的指針比較次數和更多的存儲空間。跳表指針越少意味着更少的指針比較次數,但同時也意味着更長的跳躍步長,也就是說意味着更少的跳躍機會。

簡單的啟發式策略:對於長度為P的倒排記錄表,每√P處放一個跳表指針,即均勻放置,均勻放置方法忽略了查詢詞項的分布情況

如果索引相對固定的話,均勻方式方法是一種很簡便的方法。但是如果倒排記錄表由於經常更新而發生變化,那么跳表指針的建立就比較困難。惡意的刪除策略可能會使跳表完全失效。

 

其他快速合並倒排表算法

對長度為N 和M 的有序數組,一般來說,在做歸並的時候,其時間復雜度為O(M+N)。在理想情況下(如M 和N 都很大時),O(M+N)應該是一個很小的復雜度。但搜索引擎的情況往往並不是這樣,很多時候都會遇到一個很小的有序數組(比如,由其他很多條件計算而來)和一個很大的有序數組之間的AND 運算。在這種情況下, O(M+N)的時間可能比O(M*logN)的時間要大(假設N>>M)

 

二分法

即采用二分查找的辦法比較元素。其時間復雜度為O(M*logN)。本方法僅適合純內存的2 個有序數組。當2 個數組長度差距很大的時候,本方法很適合,因為簡單方便。

跳躍和二分法結合
在跳躍失敗的時候,使用二分查找。其時間復雜度最差為O(M+N/k+M*logk)。本方法能夠改善跳躍法的最差時間復雜度。

Hash法

預先構建每個有序數組的快速hash 表,然后通過hash 查找的方式判斷值是否存在。其時間復雜度為O(M*s),這里s 表示查詢一次hash 的耗時。在內存足夠,以及數組長度差距很大的時候,本方法比二分法效率更高。但本方法消耗的額外內存一般會超過1 倍數組大小,而構建時間消耗更加嚴重。為了減少額外空間占用,有人采用bloom filter 的策略,這樣稍微犧牲一些精度,而減少大量的內存占用。
分治法
把第一個數組划分為2 個部分M1 和M2,把第二個數組划分為2 個部分N1 和N2,划分原則是:第一個數組對半分,第二個數組根據第一個數組的中值進行切分。然后比
較M1 和N1,比較M2 和N2。不斷的遞歸下去。時間復雜度,最好為O(M*log(N/M)),最壞為O(M*logN)。分治法只適合存內存數組。此方法的效果優於二分法,但程序比較復雜。
bitmap法
Bitmap 和hash 法策略差不多。它是用bitmap 來保存元素,在查詢的時候直接用bitmap 定位到位,判斷元素是否存在。Bitmap 的麻煩之處在於它內存占用。在一個單
程序千萬級數據的環境中,一個bitmap 的大小需要10M/8=1.25M 大小。所以bitmap 並不像hash 表那樣預先計算,而是在數組合並的時候計算。其時間復雜度為O(M+N),
如果預先計算bitmap,其時間復雜度為O(M)。雖然表面上看起來本方法和基本的歸並方式效率一樣,但實際上因為bitmap 的低常數值(即每次比較耗時很小)、能夠同時輕松支持AND 和OR 操作、在多個數組合並的時候效果更好(因為bitmap 相當於預先計算)以及bitmap 可以被cache 等,故很多時候bitmap 的效果要比普通歸並好。

 

短語查詢及位置索引

對於短語查詢,僅僅保存term +docIDs的倒排索引會顯得有些力不從心。

 

簡單的對短語查詢的支持方法:雙詞(Biword)索引 (二元詞索引)

文本 Friends, Romans, Countrymen 會產生如下的二元接續詞對(biword) : friends romans    romans countrymen
索引構建時,將每個詞對看成一個詞項放到詞典中
查詢 stanford university palo alto分成如下的布爾查詢: “stanford university” AND “university palo” AND “palo alto”

 

擴展的雙詞(Extended Biword)
對待索引文檔進行詞性標注,將詞項進行組塊,每個組塊包含名詞(N) 和冠詞/介詞(X),稱具有NX*N形式的詞項序列為擴展雙詞(extended biword),將這樣擴展詞對作為詞項放入詞典中
例子: catcher in the rye (書名: 麥田守望者)N X X N,將查詢也分析成N和X序列,將查詢切分成擴展雙詞,在索引中查找catcher rye

 

二元詞索引的問題:

如果不檢查文檔,無法確認滿足查詢表達式(如 stanford university palo alto)的文檔是否真正滿足上述短語查詢。很難避免偽正例的出現!

由於詞典中詞項數目劇增,導致索引空間也激增

雙詞索引方法並不是一個標准的做法(即倒排索引中一般不會全部采用雙詞索引方法),但是可以和其他方法混合使用

 

第二種對短語查詢的支持方法:帶位置信息的詞項(Term)索引    docId tf(position1,position2.......)

 

在合並操作中,同樣可以采用前面提到的各種技術來實現,但是這里不只是簡單地判斷兩個詞項是否出現在同一文檔中,而且還需要檢查它們出現的位置關系和查詢短語的一致性。這就需要計算出詞之間的偏移距離。很明顯,位置索引可以處理鄰近式查詢,而雙詞索引卻不能。

采用位置索引會大大增加倒排記錄表的存儲空間,即使對位置值或偏移值采用合適的壓縮方法也會明顯大於無位置信息的索引。實際上,采用位置索引會加深倒排記錄表合並操作的漸進復雜性,這是因為需要檢查的項的個數不再受限於文檔數目而是文檔集中出現的所有的詞條的個數 T。也就是說,布爾查詢的復雜度為O(T)而不是O(N)。然而,由於用戶往往期望能夠進行短語搜索(顯式和隱式)和鄰近搜索,所以實際中的大部分應用並沒有其他選擇而不得不采用這種做法。 

 

混合索引機制(二元詞索引和位置索引這兩種策略可以進行有效的合並)

假如用戶通常只查詢特定的短語,如Michael Jackson,那么基於位置索引的倒排記錄表合並方式效率很低。一個混合策略是:對某些查詢使用短語索引或只使用二元詞索引,而對其他短語查詢則采用位置索引。短語索引所收錄的那些較好的查詢可以根據用戶最近的訪問行為日志統計得到,也就是說,它們往往是那些高頻常見的查詢。當然,這並不是唯一的准則。處理開銷最大的短語查詢往往是這樣一些短語,它們中的每個詞都非常常見,但是組合起來卻相對很少見。將查詢Britney Spears 加入短語索引可能僅僅對該查詢提供一個大概 3 倍的加速效果,這是因為很多提到其中一個單詞的文檔都是相關文檔。 而如果將The Who加入短語索引那么會對這個查詢有 1000 的加速效果。 因此,實現中更期望將后者加入到短語索引中,盡管相對前者,其出現的頻率較低(也就是說這些短語都是非常見查詢) 。 

Williams等人 (2004) 評估了一個更復雜的混合索引機制,其中除了包含上面兩種形式的索引外,還在它們之間引入了一個部分后續詞索引(next word index) ,即對每個詞項,有個后續詞索引記錄了它在文檔中的下一個詞項。論文的結論是,雖然比僅僅使用位置索引增加了 26%的空間,但是面對典型的 Web 短語混合查詢,其完成時間大概是只使用位置索引的 1/4。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM