倒排索引的實現
https://blog.csdn.net/xn4545945/article/details/8791484
倒排索引(英語:Inverted index),也常被稱為反向索引、置入檔案或反向檔案,是一種索引方法,被用來儲存在全文搜尋下某個單詞在一個文件或者一組文件中的儲存位置的對映。它是文件檢索系統中最常用的資料結構。
倒排索引分析:
以英文為例,下面是要被索引的文字:
T0 = "it is what it is"
T1 = "what is it"
T2 = "it is a banana"
對相同的文字,我們得到後面這些完全反向索引,有文件數量和當前查詢的單詞結果組成的的成對資料。 同樣,文件數量和當前查詢的單詞結果都從零開始。所以,"banana": {(2, 3)} 就是說 "banana"在第三個文件裡(T2),而且在第三個文件的位置是第四個單詞(地址為 3)。
"a": {(2, 2)}
"banana": {(2, 3)}
"is": {(0, 1), (0, 4), (1, 1), (2, 1)}
"it": {(0, 0), (0, 3), (1, 2), (2, 0)}
"what": {(0, 2), (1, 0)}
如果我們執行短語搜尋"what is it" 我們得到這個短語的全部單詞各自的結果所在文件為文件0和文件1。但是這個短語檢索的連續的條件僅僅在文件1得到。
倒排索引的Python實現:
- #-------------------------------------------------------------------------------
- # Name: InvertedIndex
- # Purpose: 倒排索引
- # Created: 02/04/2013
- # Copyright: (c) neng 2013
- # Licence: <your licence>
- #-------------------------------------------------------------------------------
- import re
- import string
- #對199801.txt進行處理, 去除詞性標註以、日期及一些雜質. (保留段落結構)
- #輸入:199801.txt
- #輸出:199801_new.txt
- def pre_file(filename):
- print("讀取語料庫檔案%r....."%filename)
- src_data = open(filename).read()
- #去除詞性標註、‘19980101-01-001-001’、雜質如‘[’、‘]nt’
- des_data =re.compile(r'(\/\w+)|(\d+\-\S+)|()|()|(\S+)').sub(
- des_filename = "199801_new.txt"
- print("正在寫入檔案%r....."%des_filename)
- open(des_filename,'w').writelines(des_data)
- print("處理完成!")
- #建立倒排索引
- #輸入:199801_new.txt
- #輸出:my_index.txt 格式(從0開始): word (段落號,段落中位置) ..
- def create_inverted_index(filename):
- print("讀取檔案%r....."%filename)
- src_data = open(filename).read()
- #變數說明
- sub_list = [] #所有詞的list, 用來查詢去重等
- word = [] #詞表檔案
- result = {} #輸出結果 {單詞:index}
- #建立詞表
- sp_data = src_data.split()
- set_data = set(sp_data) #去重複
- word = list(set_data) #set轉換成list, 否則不能索引
- src_list = src_data.split("\n") #分割成單段話vv
- #建立索引
- for w in range(0,len(word)):
- index = [] #記錄段落及段落位置 [(段落號,位置),(段落號,位置)...]
- for i in range(0,len(src_list)): #遍歷所有段落
- #print(src_list[i])
- sub_list = src_list[i].split()
- #print(sub_list)
- for j in range(0,len(sub_list)): #遍歷段落中所有單詞
- #print(sub_list[j])
- if sub_list[j] == word[w]:
- index.append((i,j))
- result[word[w]] = index
- des_filename = "my_index.txt"
- print("正在寫入檔案%r....."%des_filename)
- #print(result)
- #print(word)
- #print(len(word))
- writefile = open(des_filename,'w')
- for k in result.keys():
- writefile.writelines(str(k)+str(result[k])+"\n")
- print("處理完成!")
- #主函式
- def main():
- #pre_file("199801.txt") #初步處理語料庫, 得到199801_new.txt
- #根據199801_new.txt建立索引, 得到myindex.txt(由於199801_new.txt太大, 建立索引時間太長, 因此只擷取一部分放入199801_test.txt)
- create_inverted_index("199801_test.txt")
- #執行
- if __name__ == '__main__':
- main()
輸入: 待建立索引的檔案(199801_test.txt)
輸出: 索引檔案(my_index.txt)
建立倒排索引的演算法採用全文搜尋,然後記錄其段落號與在段落中的位置。
199801_test.txt檔案:
my_index.txt檔案: