Suchmaschine: Einführung in gängige Methoden zum Abrufen von Informationen und Implementierung des invertierten Index (Python)

1. Methode zum Abrufen von Informationen

(1) Linearer Scan

Computer haben viele Möglichkeiten, Dokumentinhalte abzurufen, z. B. das direkte Durchlaufen von Anfang bis Ende und das Extrahieren von Inhalten gemäß den von uns eingegebenen Schlüsselwörtern.

Diese Art der Abrufmethode entspricht unseren menschlichen Lesegewohnheiten, ist also einfach zu implementieren und leicht zu akzeptieren.

Wenn Sie gefragt werden, ob der Ausdruck „Talk against Confucianism“ in „The Romance of the Three Kingdoms“ vorkommt, entscheiden wir uns oft dafür, den gesamten Text zu durchsuchen, um passende Wörter zu finden.



Und es wird nicht allzu lange dauern, Schlüsselwörter aus "The Romance of the Three Kingdoms" durch moderne Computer zu extrahieren;

Was aber, wenn das Ziel eine Sammlung von Weltliteratur ist? Was ist mit dem Jahresfinanzbericht des Unternehmens? Oder die größeren Sammlungen von Dokumenten, die von der modernen Informationswelt produziert werden.

Trotz der hohen Rechenleistung von Computern kann das Information-Retrieval-Verfahren des linearen Scannens nur für die Verarbeitung kleiner Texte eingesetzt werden.

(2) Begriff-Dokument-Zuordnungsmatrix

Als Ergebnis wurde die Term-Dokument-Korrelationsmatrix erstellt, und wir nutzten die ungenutzte Rechenleistung, um die Matrix im Voraus im Computer zu erstellen.

Drei Königreiche Traum von Roten Villen Gesetzlose der Marschen Reise in den Westen Wukong
Sonne Wukong 0 0 0 1 1
Jia Baoyu 0 1 0 0 0

Wenn wir das Schlüsselwort Sun Wukong eingeben, werden die beiden Dokumente „Journey to the West“ und „The Legend of Wukong“ als Ergebnisse zurückgegeben.

Diese Methode verbessert die Suchgeschwindigkeit erheblich

Begriffe sind die Einheit der Indizierung und Dokumente sind die zurückgegebenen Ergebnisse.

Aus Sicht der Zeile erhält man den Dokumentenvektor des entsprechenden Begriffs, aus Sicht der Spalte erhält man den Begriffsvektor des Dokuments.

Natürlich hat auch diese Methode große Schwächen: Wie die von mir oben beispielhaft dargestellte Tabelle zeigt, macht der 0-Wert in der Matrix einen sehr hohen Anteil aus.

Während es eine Belastung verursacht, verlangsamt es auch die Abrufgeschwindigkeit erheblich.

(3) Umgekehrter Index

Studenten, die sich mit Datenstrukturen beschäftigt haben, sollten bald in der Lage sein, an Optimierungsmethoden zu denken - Sparse Arrays.

Wir erstellen Begriffswörterbücher und Buchungslisten, um Dokumente effizient abzurufen.

Wörterbuch der Begriffe Beiträge
Sonne Wukong 4—>5
Jia Baoyu 2

Die beiden Teile des invertierten Index. Der Wörterbuchteil wird oft im Speicher platziert, während jede Posting-Liste, auf die durch einen Zeiger gezeigt wird, normalerweise auf einer Platte gespeichert wird.

2. Invertierte Indeximplementierung und allgemeine Korpusverarbeitungsmethoden

(1) Um das Ziel zu erreichen

Textdateien lesen, um verschiedene einzeilige Dokumente zu lemmatisieren und zu normalisieren,

Achten Sie auf die Filterung von Satzzeichen, die Filterung von Stoppwörtern und die Umwandlung von Groß- und Kleinschreibung.

Erstellen Sie ein invertiertes Index-/Begriffswörterbuch.

(2) Vollständiger Code

 import re
 import string
 from stop_words import get_stop_words
 from nltk.stem.porter import PorterStemmer
 
 
 # 列表去重
 def unique(word_list):
     return list(dict.fromkeys(word_list))
 
 
 # 移除停用词
 def stop_word(token):
     en_stop = get_stop_words('en')
     stopped_tokens = [i for i in token if i not in en_stop]
     return stopped_tokens
 
 
 # 词干提取
 def stem_extracting(stopped_tokens):
     p_stemmer = PorterStemmer()
     texts = [p_stemmer.stem(i) for i in stopped_tokens]
     return texts
 
 
 # Porter stemmer 并不是要把单词变为规范的那种原来的样子,
 # 它只是把很多基于这个单词的变种变为某一种形式!换句话说,
 # 它不能保证还原到单词的原本,也就是"created"不一定能还原到"create",
 # 但却可以使"create" 和 "created" ,都得到"creat" !
 
 def incidence_matrix(text, docID):
     # 目的:
     # 传入一段文本及其文档号
     # 获取其词项列表
 
     # 1.清除英文标点符号
     punctuation_string = string.punctuation
     lines = re.sub('[{}]'.format(punctuation_string), " ", text)
     # 2.将英文文本内容切片
     lsplit = lines.split()
     # 3.大小写转换
     for num in range(len(lsplit)):
         lsplit[num] = lsplit[num].lower()
     # 4.移除停用词 词干提取
     # lsplit = stem_extracting(stop_word(lsplit))
     # 5.去重并转字典
     lsplit_dic = dict.fromkeys(lsplit)
     # 6.记录文档号
     for word in lsplit_dic.keys():
         lsplit_dic[word] = [docID]
     return lsplit_dic
 
 
 def read_file(filename):
     result = {
    
    }
     count = 0
     with open(filename, 'r') as file_to_read:
         # 以只读形式打开该文件
         while True:
             # 以行为单位进行读取
             lines = file_to_read.readline()
             # 当某行内容为空时 停止读取
             if len(lines) == 0:
                 break
             count = count + 1
             lsplot = incidence_matrix(lines, count)
             result = dic_zip(result, lsplot)
     # 关闭文件读取
     file_to_read.close()
     return result
 
 
 def dic_sort(a_dic):
     b_dic = dict.fromkeys(sorted(a_dic))
     for word in b_dic.keys():
         b_dic[word] = a_dic[word]
     return b_dic
 
 
 # 不同文档字典 同一词项合并
 def dic_zip(a_dic, b_dic):
     # 将b_dic并入a_dic中
     for word in b_dic.keys():
         if a_dic.get(word, None):
             a_dic[word].extend(b_dic[word])
         else:
             a_dic[word] = b_dic[word]
     return a_dic
 
 
 def show_dic(a_dic):
     # 文档频率可用于做查询优化
     tplt = "{0:^10}\t{1:{3}^10}\t{2:^40}"
     print(tplt.format("词项", "文档频率", "倒排记录", chr(12288)))
     for word in a_dic.keys():
         print(tplt.format(word, len(a_dic[word]), str(a_dic[word]), chr(12288)))
 
 
 def main():
     # 读取filename下的英文文本文件 将每一行作为单独的文本
     # 建立倒排索引。
     filename = './Reverse_Index_Word2.txt'
     matrix = dic_sort(read_file(filename=filename))
     show_dic(matrix)
 
 
 if __name__ == '__main__':
     main()

(3) Laufergebnisse

Größere Dokumente können gelesen werden, und der kleine Text wird hier ausgewählt, um die Anzeige zu erleichtern.

Der Normalisierungsprozess wird von mir auskommentiert, und das #-Symbol kann bei Bedarf gelöscht werden.

 #读入的文档
 new home sales top forecasts
 home sales rise in july
 increase in home sales in july
 july new home sales rise
 
 # 运行结果
 "D:\Program Files\Python\python.exe" 
     词项        文档频率                     倒排记录                  
 forecasts       1                         [1]                   
    home         4                     [1, 2, 3, 4]              
     in          2                        [2, 3]                 
  increase       1                         [3]                   
    july         3                      [2, 3, 4]                
    new          2                        [1, 4]                 
    rise         2                        [2, 4]                 
   sales         4                     [1, 2, 3, 4]              
    top          1                         [1]                   
 
 Process finished with exit code 0
 

Supongo que te gusta

Origin blog.csdn.net/yt266666/article/details/127405088
Recomendado
Clasificación