1. 程式人生 > >《introduction to information retrieval》資訊檢索學習筆記3 詞典和容錯式檢索

《introduction to information retrieval》資訊檢索學習筆記3 詞典和容錯式檢索

第3章 詞典和容錯式檢索

3.1 用於詞典的搜尋結構

給定一個反向索引和一個查詢,我們的第一個任務是確定每個查詢詞是否存在於詞彙表中,如果是,則返回指向相應倒排記錄表的指標。涉及在資料結構中定位詞項。

資料結構:字典(dictionary ) 兩個解決方案:雜湊表和搜尋樹(hashing and search trees.)

1.雜湊表:在查詢時,我們分別對每個查詢詞進行雜湊操作,並返回一個指向相應倒排記錄表的指標,並考慮解決雜湊衝突。

√ 每個詞項(鍵)被對映到一個整數上,在一個足夠大的目標空間中,雜湊結果的衝突可能性會減小;衝突可以通過輔助結構來解決,而輔助結構可以要求維護。 √ 優點:定位速度優於樹的定位速度,時間複雜度為常數 √ 缺點: (1)不能查詢詞項的變形(比如像resume這樣的單詞的重音和無重音的版本),因為它們可以被雜湊對映成不同的整數。 (2)不能尋找帶字首的詞項。 (3)隨詞彙量不斷增長,為當前需求而設計的雜湊函式在幾年內可能還不夠。

2.搜尋樹:與雜湊不同,搜尋樹要求文件集合中使用的字元有規定的順序

(1)二叉樹(binary tree):每個內部節點都有兩個子節點。有效的搜尋取決於樹是否平衡:任何節點的兩個子樹下的詞項的數量相等或是相差1。主要問題是再平衡,當從二叉搜尋樹中插入或刪除詞項時,需要重新平衡,以便保持平衡屬性。為了減少再平衡,一種方法是允許內部節點下的子樹的數量在一個固定的時間間隔內變化。 (2)B樹(B-tree):B樹被看作是將二叉樹的多個層次摺疊成一個,當某些字典是磁碟常駐時尤其有利。 √ 優點:支援字首查詢 √ 缺點:搜尋速度低於雜湊表,平衡樹時間複雜度為O(log M),M為詞彙表大小。

解決方案(雜湊表或搜尋樹)的選擇需要考慮如下: (1)可能擁有多少個詞項? (2)詞項數目會保持不變還是改變?在變化的情況下,只插入新的詞項還是在字典中刪除一些詞項? (3)各種詞項的相對頻率是多少?

3.2萬用字元查詢(Wildcard queries)

在下列任何情況下使用萬用字元查詢: (1)不確定查詢詞的拼寫(e.g., Sydney vs. Sidney, which leads to the wildcard query S*dney); (2)拼寫一個詞項的多種變形,並尋找包含任何變形的文件(e.g., color vs. colour); (3)使用者尋找包含有可能被阻止的詞項的變形的文件,但不確定搜尋引擎是否執行了阻止 (e.g., judicial vs. judiciary, leading to the wildcard query judicia*); (4)使用者不確定正確的外來詞或短語的翻譯 (e.g., the query Universit* Stuttgart)。

·後萬用字元查詢(trailing wildcard query):mon*形式的查詢,遍歷B樹,列舉一組詞典中以mon為字首的詞項的集合W,使用反向索引檢索包含W中任何詞項的所有文件。 ·前萬用字元查詢(leading wildcard queries):*mon形式的查詢,遍歷反向b樹,反向b樹的每一個根到葉的路徑對應於在字典中倒寫的一個詞項,沿著反向的b樹遍歷,然後列出詞彙表中滿足字首的所有詞項R。 ·一般萬用字元查詢:se*mon形式的查詢,使用常規的b-樹列舉以se為字首和一個非空字尾的詞項集合W,然後反向b-樹列舉以後綴mon結束的詞項集R。把兩個集合W和R進行交集,得到以字首se開始與以後綴mon結束的詞項集。最後使用標準的反向索引檢索包含這個交集中任何詞項的所有文件。

1.通用萬用字元查詢(General wildcard queries)

處理一般萬用字元查詢的技術策略:在一個特殊構造的索引上,將給定的萬用字元查詢q表示為布林查詢Q,使布林答案是一個匹配q的詞彙詞項的超集。

·輪排索引:一種反向索引。在字符集中引入一個特殊的符號$,以標記一個詞項的結束。構建一個輪排索引,在這個索引中,每個詞項的各種旋轉(增加$)都連線到原始的詞彙表詞項。(如hello的輪排索引: hello$,ello$h,llo$he,lo$hel,o$hell)。

·輪排詞彙表(permuterm vocabulary):permuterm索引中旋轉的詞項的集合。

√ 基本思想: (1)考慮萬用字元查詢m*n,關鍵是要旋轉萬用字元查詢,以便*符號出現在字串的末尾。因此,旋轉萬用字元查詢變成了n$m*。接下來,在輪排索引中查詢這個字串,尋找n$m*(通過搜尋樹)會等價於詞項man和moron的旋轉結果。因此可以用一個*符號來處理任何萬用字元查詢。 (2)考慮fi*mo*er查詢,首先列舉字典中的詞項,這些詞項在er$fi*的輪排索引中。並不是所有的字典詞項都有字串mo,通過詳盡的列舉過濾它們,檢查每個候選者是否包含mo。在這個例子中,“fishmonger”這個詞項會在過濾中留下,而filibuster不會。然後通過標準的反向索引來查詢倖存的詞項,用於文件檢索。

√ 缺點:它的字典變得非常大,包括每個詞項的所有旋轉。

√ 輪排索引使我們能夠識別與萬用字元查詢匹配的原始詞彙表,我們在標準的反向索引中查詢這些詞項,以檢索匹配的文件。

√ B樹和輪排索引之間密切相互作用。事實上,該結構應該被看作是一種“一棵樹”。而我們遵循傳統的詞項描述輪排索引,它與B樹不同,它允許我們用給定的字首來選擇旋轉。

2.k-gram的萬用字元查詢索引( k-Gram indexes for wildcard queries)

儘管輪排索引很簡單,但它可能導致每一項的旋轉次數大幅增加,另一種技術稱為k-gram索引,用於處理萬用字元查詢。

·k-gram:是k個字元的序列。因此,cas、ast和stl都是在castle的3-gram。使用一個特殊字元$來表示一個詞項的開始或結束,所以為castle生成的3-gram的完整集合是:$ca,cas,ast,stl,tle,le$。

√ 在k-gram索引中,字典中包含了所有在詞彙表中出現的k-grams。每個倒排記錄表從k-gram指向包含k-gram的所有詞彙表。例如,3-gram etr:

在這裡插入圖片描述

圖3.1 一個3-gram索引的倒排記錄表的例子。匹配的詞彙表是在倒排記錄表中按字母順序排列的。

√ 基本思想: 考慮萬用字元查詢re*ve,尋找包含任何以re開頭以ve結尾的詞項的文件。因此,執行布林查詢$re AND VE$。這是在3-gram索引中查詢的,並生成一個匹配的詞項列表,如relive、remove和retrieve。然後,在標準的反向索引中查詢每一個匹配的詞項,以生成匹配查詢的文件。

√ 後置濾波(postfiltering): 使用k-gram索引處理有一個問題。考慮使用3-gram索引描述的查詢red*。首先進行布林查詢$re AND RED。這就導致瞭如“retired”的詞項匹配,它包含了兩個3-grams $re and red 的連線,但與原來的萬用字元查詢red*不匹配。 為解決這個問題,引入後置濾波,在3-gram索引上的布林查詢所列舉的詞項將單獨檢查原始查詢red*。這是一個簡單的字串匹配操作,並且淘汰了與原始查詢不匹配的詞項如retired。然後在標準的反向索引中搜索上下的詞項。

√ 一個萬用字元查詢可以導致多個詞項被列舉,每一個詞項都成為標準反向索引的單項查詢。允許使用布林運算子的萬用字元查詢的組合,例如,re*d AND fe*ri這樣的查詢的恰當解釋是,一個析取的連線:尋找所有包含任何匹配re*d和任何匹配的fe*ri的詞項的文件。

*即使沒有萬用字元查詢的布林組合,萬用字元查詢的處理也可能相當昂貴,因為在特殊索引、過濾和最終標準的反向索引中增加了查詢。搜尋引擎可能支援這樣豐富的功能,但最常見的是,該功能隱藏在大多數使用者從未使用過的介面(比如高階查詢介面)後面。在搜尋介面中公開這些功能通常會鼓勵使用者在不需要的時候呼叫它(比如,通過輸入查詢的字首a*),增加搜尋引擎的處理負載。

3.3拼寫校正(Spelling correction)

大多數拼寫校正演算法兩個基本原則: (1)選擇與拼寫錯誤最接近的詞項 (2)當兩個正確拼寫的查詢被繫結時,選擇一個更常見的查詢。最簡單的是考慮集合中詞項的出現次數,許多搜尋引擎中(如web)更常見的是使用在其他使用者輸入的查詢中最常見的進行更正。

拼寫校正的方法:

1.詞獨立法( isolated-term ):糾正單個查詢詞。

基本思想:使用k-gram索引列舉一組可能修正的q的候選詞彙表詞項。然後計算從q到這組集合的每一項的編輯距離,從對於q小編輯距離的集合中選擇詞項。

兩種處理技術:編輯距離(edit distance )和k-gram重和度(k-gram overlap)

(1)編輯距離(Edit distance)

·編輯距離:給定二個字串s1和s2,它們之間的編輯距離是將s1轉換為s2所需的編輯操作的最小數量。也稱為Levenshtein距離。

√ 允許的編輯操作:

  • 將一個字元插入一個字串
  • 從一個字串中刪除一個字元
  • 用另一個字元替換字串的字元;

√ 動態規劃演算法,虛擬碼:

在這裡插入圖片描述

圖3.2 計算字串s1和s2之間的編輯距離的動態規劃演算法

√ C++程式碼:

在這裡插入圖片描述 √ 給定詞項詞彙表V和查詢字串q,尋找V中與q具有最小編輯距離的字串,得到候選的“正確”單詞詞彙表。 (1)最明顯的方法是在選擇最小編輯距離的字串之前,計算從q到V中的每個字串的編輯距離。這種搜尋成本非常高。 (2)最簡單的啟發式方法:將搜尋限制在字典詞項中,以與查詢字串相同的字母開頭(希望查詢的第一個字元不出現拼寫錯誤)。 (3)這種啟發式更復雜變形:使用一個版本的輪排索引,在索引中省略了單詞尾符號$。考慮查詢字串的所有旋轉q。對於每一個旋轉r,遍歷b - tree進入輪排索引,從而檢索所有以r開頭的詞項。 (4)旋轉方案改進: 如果q是mase,考慮旋轉r =sema,將檢索詞項如sematic和semaphore等,沒有一個小的編輯距離問。不幸的是,我們會錯過更多的相關的詞項如mare和mane。 為了解決這個問題,對於每次旋轉,在執行b樹遍歷之前省略l字元的字尾。確保從字典中檢索到的集合R中的每一項都包含一個與q相同的長子串(l的值取決於q的長度,也可以將它設定為一個固定不變的常量,比如2)。

(2)K-gram重合度(k-gram overlap)

為進一步限制計算編輯距離後的詞彙詞項集大小,呼叫k-gram索引來協助檢索與查詢q編輯距離較低的詞項。

√ 檢索過程:本質上是單一掃描查詢字串q中的k-grams的倒排記錄表。

Eg. 圖3.3中的2-gram索引顯示了查詢bord中三個雙字母組的倒排記錄表。假設想要檢索至少包含這些三個字母組中的兩個的詞彙表。對這些倒排記錄表進行單一掃描,可以列舉出所有詞項,如圖將列舉出aboard、boardroom和border。

在這裡插入圖片描述 圖3.3查詢bord中三個雙字母組的倒排記錄表

√ 簡單地要求從查詢q中包含一個固定數量的k-grams匹配詞彙表的缺點是像boardroom這樣的詞項被列舉。因此需要更微妙的詞項和q之間的k-grams中的重疊測量。

·Jaccard係數(Jaccard coefficient ):定義為|A ᴖ B| /|A ᴗ B|,我們考慮的這兩個集合是查詢q中的k-grams,以及詞彙表中的k-grams集合。

√ 基本思想:隨著掃描的進行,我們從一個詞彙表t開始,到下一個詞彙表,在q和t之間計算Jaccard係數,如果係數超過了預設的閾值,我們就把t加到輸出中;如果沒有,我們將繼續下一詞項的倒排記錄表。

*計算Jaccard係數,只需要t的長度。以圖3.3為例,考慮當倒排記錄表掃描查詢q=bord,t =boardroom。如果這些倒排記錄表儲存boardroom中bigrams的數量(即8),就有了需要的所有資訊計算Jaccard係數:2/(8+3-2)(分子是從倒排記錄表數獲得的(2來自bo和rd);分母是bord和boardroom中bigrams的數量的總和。)

2.上下文敏感法(Context-sensitive):考慮上下文單詞。

詞獨立法將無法糾正如flew form Heathrow的輸入錯誤,三個查詢詞的拼寫都是正確的。當這樣的短語檢索出很少的文件時,搜尋引擎可能會提供flew from Heathrow的修正查詢。 (1)最簡單的方法是即使每個查詢詞都拼寫正確,仍列舉三個查詢詞中的每一個的修正,然後嘗試替換短語中的每一個詞項。從flew form Heathrow的例子中可列舉了一些如fled form Heathrow 和 flew fore Heathrow的短語。對於每一個這樣的替代短語,搜尋引擎執行查詢並確定匹配結果的數量。 (2)如果我們查詢單個詞項的許多修正,這個列舉成本可能很大;我們可能會遇到大量的替代方案。一些啟發式方法被用來減小解空間:只保留集合中最常見的組合或者在查詢日誌中使用者以前的查詢。(使用使用者發出的查詢日誌將包括帶有拼寫錯誤的查詢。)

3.4語音校正(Phonetic correction)

由於使用者輸入的查詢聽起來像目標項,所以出現了拼寫錯誤。這種演算法尤其適用於對人名的搜尋。 √ 主要思想:為每個詞項生成一個語音對映(phonetic hash),以便類似的詞項對映到相同的值。

·soundex演算法: (1)原始的soundex演算法方案:

  • 將每一項都轉換成一個四字元(soundex指數)的簡化形式,從這些簡化的形式構建一個反向索引到原始的詞項。
  • 對查詢詞項執行相同的操作。
  • 當查詢需要一個soundex匹配時,搜尋這個soundex索引。 (2)soundex演算法的變化: 與將詞項轉換為四字元形式有關。常用的轉換結果是一個四字元的程式碼,第一個字元是字母表中的字母,另外三個是0到9之間的數字。
  • 保留詞項的第一個字母。
  • 將下列字母的所有出現更改為0(零):A、E、I、O、U、H、W和Y。
  • 將字母改為數字如下: B,F,P,V -> 1 C,G,J,K,Q,S,X,Z -> 2 D,T -> 3 L -> 4 N -> 5 R -> 6
  • 反覆地從每一對連續相同的數字中取出一個。
  • 從產生的字串中刪除所有的0。用後面的0填充結果字串,並返回前四個位置,包含一個字母和三個數字。

√ 對於一個soundex對映(soundex map)的例子,赫爾曼對映(Hermann maps)到H655。給定一個查詢(比如Herman),計算它的soundex code,然後從soundex索引中檢索所有與soundex code匹配的詞彙表,然後在標準的反向索引上執行結果查詢。 √ 基於演算法的一些觀察結果: (1)在轉錄名稱時,母音被視為可互換的; (2)發音相似的子音(如D,T)被放入等價類,導致相關的名稱通常有相同soundex程式碼。