1.简介
倒排索引(Inverted Index)是信息检索系统中最常用的数据结构之一,它用来存储在全文搜索下某个单词存在于哪些文档或数据记录中。与传统的正排索引(文档到关键词的映射)不同,倒排索引建立了从关键词到文档的映射,这大大提高了搜索查询的效率。
2.基本原理
倒排索引主要由两部分组成:单词词典(Lexicon)和倒排列表(Inverted List)。单词词典是所有文档的单词集合,每个单词都指向其对应的倒排列表。倒排列表记录了单词在哪些文档中出现,以及在该文档中的位置信息等。
3.构建过程
构建倒排索引的过程通常包括以下步骤:
- 文档分词:将每个文档分割成独立的单词或术语。
- 建立单词词典:收集所有文档中的唯一单词,并为每个单词分配一个唯一的标识符。
- 生成倒排列表:对于单词词典中的每个单词,找出包含该单词的所有文档,并记录单词在文档中的位置信息。
假设我们有三个文档:
Doc1: "The quick brown fox jumped over the lazy dog."
Doc2: "Quick foxes jump over lazy dogs in summer."
Doc3: "Lazy dogs don't jump high."
构建倒排索引的步骤如下:
分词:
- Doc1: the, quick, brown, fox, jumped, over, the, lazy, dog
- Doc2: quick, foxes, jump, over, lazy, dogs, in, summer
- Doc3: lazy, dogs, don’t, jump, high
建立单词词典:
- the, quick, brown, fox, jumped, over, lazy, dog, foxes, jump, dogs, in, summer, don’t, high
生成倒排列表:
- the: [Doc1(1, 8), Doc2(无)]
- quick: [Doc1(2), Doc2(1)]
- fox: [Doc1(4), Doc2(2)]
这里的数字表示单词在文档中的位置(通常是单词在文档中的序号,实际中可能更复杂,如偏移量等)。
3.1.代码示例
# 假设文档集已经分词
documents = { 'Doc1': ['the', 'quick', 'brown', 'fox', 'jumped', 'over', 'the', 'lazy', 'dog'], 'Doc2': ['quick', 'foxes', 'jump', 'over', 'lazy', 'dogs', 'in', 'summer'], 'Doc3': ['lazy', 'dogs', "don't", 'jump', 'high']
} # 构建倒排索引
inverted_index = {} for doc_name, words in documents.items(): for word in words: if word not in inverted_index: inverted_index[word] = [] # 记录单词在文档中的位置(这里简化为只记录文档名) inverted_index[word].append(doc_name) # 打印倒排索引
for word, doc_list in inverted_index.items(): print(f"{word}: {doc_list}")
这段代码会输出每个单词及其在哪些文档中出现。请注意,这只是一个基本示例,并没有处理单词的位置信息或文档权重等高级特性。在实际应用中,倒排索引的构建和查询会更加复杂和高效。
4.总结
倒排索引是一种高效、可扩展的查询数据结构,在搜索引擎和信息检索等领域具有广泛的应用前景。