斯坦福大學-自然語言處理入門 筆記 第十七課 信息檢索(information retrieval)

一、介紹

  • 信息檢索(information retrieval)是從海量集合體(一般是存儲在計算機中的文本)中找到滿足信息需求(information need)的材料(一般是文檔)
  • 信息檢索的應用領域:網頁搜索,郵件搜索,電腦內部搜索,法律信息檢索等等
  • 信息檢索的基本假設:
    • 集合體(collection):一組假設爲靜態(static)的文檔
    • 目標:抽取和用戶信息需求相關的文檔,並幫助他們完成任務
  • 一個經典的搜索模型
    在這裏插入圖片描述
  • 模型評估
    • precision:檢索的文檔與用戶的信息需求(注意這裏不是請求)相關的比例
    • recall:在集合體中相關的文檔被檢索到的比例

二、項-文檔關聯矩陣(Term-document incidence matrices)

  • 假設我們現在面臨一個任務:找到莎士比亞戲劇之中,含有Brutus和Caesar但是卻沒有Calpurnia的那部。
  • 方法一:直接全文搜索含有Brutus和Caesar的戲劇,然後去掉沒有Calpurnia的那一部
    • 存在的問題
      • 對於一個更大的語料集合體而言,這個計算的速度會很慢,特別是對於判斷沒有Calpurnia的任務而言(因爲這個任務必須必須要掃描全文)
      • 對於其他的操作而言,比如找countrymen邊上的Romans,這種方法不夠靈活
      • 不能進行檢索排名
  • 方法二:構建一個項-文檔關聯矩陣:行表示單詞,列表示文檔;如果單詞在這個文檔中出現了,就標1;如果沒有出現,就標0。
    在這裏插入圖片描述運算方法:位運算:Brutus行 AND Caesar行 AND (NOT Calpurnia)
  • 上面兩種方法對於集合體更大的情況是不適用的,因爲這個時候矩陣的規模已經大到不能接受了。但是這個矩陣的一個特徵是非常稀疏,因此我們可以只記錄1的位置。

三、倒排索引(Inverted Index)

  • 對文檔進行索引,對於每個項(term)t,我們存儲那些有這個項的文檔的索引。
  • 我們需要可變大小的倒排表(posting lists)
    • 我們一般不會用固定大小的數組來存儲,因爲會面臨溢出的問題
    • 在內存中的話,倒排表一般會使用鏈表或者可變長度的數組
    • 在硬盤中的話,就需要一個連續運作(continuous run)的倒排表
      在這裏插入圖片描述
  • 倒排索引的流程
    在這裏插入圖片描述
  • 倒排索引前的預處理
    在這裏插入圖片描述
  • 索引流程
    • 先把調整後的token展開成序列
      在這裏插入圖片描述
    • 先根據token本身,然後根據文檔ID進行排序
      在這裏插入圖片描述
    • 把同一個文檔中相同的term進行合併,如caesar
    • 拆分成字典和倒排表
    • 加入文檔頻率信息
      在這裏插入圖片描述
    • 對於一個信息檢索系統而言,它的存儲是由這些組成的:項和對應的頻率構成的字典,包含文檔序號的鏈表以及鏈表和字典元素之間的指針。所以一個信息檢索系統比較關注的兩個問題是:我們怎麼有效地進行檢索?我們需要多少存儲空間?

四、在倒排表中如何處理請求

  • 這裏講一下對AND的請求的處理
    比如我們要找同時含有Brutus和Caesar的文檔。我們的處理方法是在字典中找到Brutus和Caesar的位置,然後找到兩者對應的鏈表,對這兩個鏈表進行合併。
    在這裏插入圖片描述
    合併的主要想法是找兩個指針從這兩個鏈表的頭節點開始向後進行循環,如果兩者指針指向的空間的值相同則存儲該索引,兩個指針都前進一個指針;如果兩個指針指向的空間的值不同,就讓小的那個指針前進一步,然後進行比較;如此循環,知道一個指針指向了鏈表的尾巴爲止。這種算法的時間複雜度是O(x+y),其中x和y分別表示兩條鏈表的長度。
    代碼如下:
    在這裏插入圖片描述

五、詞組請求與位置索引

  • 問題:如果我們想要處理一個詞組的請求應該如何處理?
  • 方法一:雙單詞索引
    • 對文檔中出現的連續單詞都進行雙單詞索引,比如出現friends,Romans,Countryman,就有兩個雙單詞:friends Romans以及Romans Countryman。接着對雙單詞構建倒排表和字典。這樣的話,我們就可以解決雙單詞的詞組的查找問題。如果是要查找三單詞的話,只需要找到對應的兩個雙單詞的倒排鏈表,然後在進行AND操作就可以了。
    • 這種方法可能存在的問題是:1)對於兩個以上的單詞詞組可能會搜索到含有對應的雙單詞,但是實際上這些雙單詞並不相連的問題。2)雙單詞會導致字典的規模很大
    • 因此,一般雙單詞索引不是這種問題的標準解決方法,但是可以作爲一種補充手段。
  • 方法二:位置索引(positional index)
    • 具體方法是在構建倒排表的時候不僅僅記錄項(term)出現的文檔序號,也記錄在對應文檔中的位置。
      在這裏插入圖片描述
    • 具體算法:上一節的算法的拓展,在比對到文檔的序號相同的時候,再進行一次類似的算法,判斷兩個指針指向的單詞位置是否是相鄰的。當然基於這個算法我們也可以進一步拓展到臨近請求(proximity queries),比如索引A在B的三個單詞距離內的文檔。
    • 空間複雜度:這種方法會大大增加存儲所需的空間,但是由於其對臨近請求與詞組請求的有效性,所以我們一般標準處理方法還是位置索引。索引的規模適合文檔的平均規模有關係的,平均網頁的項(term)個數小於1000,如果是書籍的話很容易就超過100000項(term)。假設每個項(term)出現頻率是0.1%,那麼對於有100000項(term)的文檔而言,位置索引就會導致倒排表比原來增加100倍。這裏有一個比較粗略的估算規則:在和英語比較類似的語言中,網頁的位置索引要比非位置索引大2-4倍,和原文檔的規模比起來大概是35%-50%。
  • 把上面兩種方法結合起來構成的信息搜索模型會更有效。對於一些特定的經常搜索的詞,比如“michael jackson”,採用位置索引的效率是很低的,我們可以直接採用雙單詞索引。其他的則使用位置索引。比如根據Williams et al(2004)的論文,他採用了這樣的算法,可以使得算法時間是原來純位置索引的1/4,但是空間需求只增加了26%。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章