1. 程式人生 > >實用的一些倒排索引程式碼

實用的一些倒排索引程式碼

作用

倒排索引是為了加速搜尋過程。例如做問答系統的問題匹配時,資料庫過大,用傳統方法將所有問題與使用者輸入的問題一一做相似度匹配耗時很多。而倒排索引可以直接定位到與使用者輸入有相同詞彙的問題,甚至可以簡單地將詞語的重合度當成相似度來抽取對應答案,大大提高了效率。

例如,我有10萬條問答對,問句中只出現了100次“籃球”這個詞語,而使用者輸入中有“籃球”這個詞語,傳統方法需要一一匹配相似度10萬次,而倒排索引後的相似度匹配只需要100次。(細節方面還可以深究,例如缺詞匹配,近義詞匹配等,以後有時間再補上)

理論

程式碼

下面給出了倒排索引的生成程式碼,至於相似度匹配,方法太多,有時間再補。

gensim中的corpora能生成倒排索引

 from gensim import corpora
 dictionary = corpora.Dictionary(corpus)

其中corpus為一個list,corpus中的每一個元素為該文章單詞所組成的list。

若不想安裝gensim庫,以下提供一段不包含頻率的倒排索引生成程式碼

    import jieba
    import jieba.posseg as pseg
    listInvertedIndex = []
    invertedIndexDict = {}
    for i in range(0,len(corpus)):
        listWord = []
        for j in pseg.cut(corpus[i]):
            if j.word not in listInvertedIndex:
                listInvertedIndex.append(j.word)
                invertedIndexDict[j.word] = str(i)
                listWord.append(j.word)
            elif j.word not in listWord:
                invertedIndexDict[j.word] = invertedIndexDict[j.word]  + ',' + str(i)
                listWord.append(j.word)

    fl=open('dict.txt', 'w')
    for k, v in invertedIndexDict.items():
        fl.write(k + ':' + v)
        fl.write("\n")
    fl.close()

其中corpus為未分詞的原始文字組成的list。

pickle包將物件儲存到檔案

生成一個倒排索引包括corpus的生成(主要是分詞耗時間)倒排索引的生成需要較長的時間,為了方便複用,可以運用pickle包將生成好的倒排索引儲存到本地。

儲存物件程式碼如下:

    import pickle 
    class Bird(object): 
         have_feather = True 
         way_of_reproduction  = 'egg' 

    summer       = Bird()                        # construct an object 
    fn           = 'a.pkl' 
    with open(fn, 'w') as f:                     # open file with write-mode 
         picklestring = pickle.dump(summer, f)   # serialize and save object

讀取物件程式碼如下:

    import pickle 
    class Bird(object): 
         have_feather = True 
         way_of_reproduction  = 'egg' 

    fn     = 'a.pkl' 
    with open(fn, 'r') as f: 
         summer = pickle.load(f)   # read file and build object

注意在讀取之前需要先宣告class。