【大数据管理】Python实现带位置的倒排索引

本文档介绍如何使用Python实现带位置的倒排索引,以提高大规模文档检索效率。通过读取文本文件内容,进行语言学预处理,去除停用词和标点,构建类型-书名的倒排索引。举例说明,查询所有古典小说,返回结果为西游记、水浒传、三国演义。最后,将倒排索引保存为json文件。
摘要由CSDN通过智能技术生成

读取文本文件内容,根据内容构建 类型-书名 的倒排索引,文件内容如下

加分项:实现带位置的倒排索引
```
西游记 古典小说 浪漫主义
水浒传 古典小说 历史
三国演义 古典小说 历史
红高粱 现代小说 浪漫主义
史记 史书 历史 纪传体
资治通鉴 史书 历史 编年体
```

根据倒排索引实现某个标签的小说有哪些,例如查询所有古典小说,结果是西游记,水浒传,三国演义
 

倒排索引一般在大规模文档中使用以提高索引效率。在倒排索引中,每个词项都有一个记录出现该词项的所有文档的列表,该表中的每个元素记录的是词项在某文档中的一次出现信息,这个表中的每个元素通常称为倒排记录,每个词项对应的整个表称为倒排记录表,所有词项的倒排记录表一起构成全体倒排记录表。要建立倒排索引,首先要收集需要建立索引的文档,然后将每篇文档转换成一个个词条的列表,这个过程通常称为词条化;之后要进行语言学预处理,产生归一化的词条来作为词项;再对所有文档按照其中出现的词项来建立倒排索引,索引中包括一部词典和一个全体倒排记录表。

对于本题,我使用Python语言实现了带位置的倒排索引。首先获取dir文件夹下所有的txt文件,并将其存入file列表中;之后进行语言学的预处理,加载停用词,去除标点、数字等,将文本拆分成(词语,位置)的二元组形式,并将这些二元组存入word_list列表;之后建立一个词典inverted,其中key为词语,value为位置,循环所有文件建立最终的倒排索引,并将结果存入inverted.json中。

import re, os,  json
"""
建立带位置的倒排索引
"""
# 从文件夹中获取文件
def get_files(dir):
    files = []
    for file in os.listdir(dir):
        if file.endswith('txt'):
            files.append(file)
    return files

#将文本拆分为(位置、单词)
def word_split(text):
    stopwords = ['的', '了', '呢']
    word_list = []
    # 去除数字
    text = re.sub(pattern=r"\d", repl=r"", string=text)
    # 只包含单词和小写字母
    text = re.findall(r'\w+', text.lower())
    for index, word in enumerate(text):
        # 去除停用词
        if word not in stopwords:
            word_list.append((index, word))
    return word_list

# 建立一个字典,词语作为key,位置作为value
# 对一个文件
def inverted_index_single(text):
    inverted = {}
    for index, word in text:
        locations = inverted.setdefault(word, [])
        locations.append(index)
    return inverted

# 循环所有的文件建立最终的倒排索引
def inverted_index_all(inverted, doc_id, doc_inverted):
    for word, locations in doc_inverted.items():
        indices = inverted.setdefault(word, {})
        indices[doc_id] = locations
    return inverted

def inverted_index_from_folder(dir):
    # 得到文件
    files = get_files(dir)
    # 最终的倒排索引
    inverted_mul = {}
    for file in files:
        with open(dir + file, 'r') as myfile:
            # 字符串包含单个文件中的所有内容
            words = myfile.read().replace('\n', ' ')
            split_words = word_split(words)
            # 为单个文件创建反向索引
            inverted_single_file = inverted_index_single(split_words)
            # 创建最终的倒排索引
            inverted_index_all(inverted_mul, file, inverted_single_file)

    return inverted_mul

#将倒排索引保存到json文件
def save_index(inverted_index):
    with open('inverted_index.json', 'w') as fp:
        json.dump(inverted_index, fp,ensure_ascii=False)

def main():

    inverted_index = inverted_index_from_folder("D:/books/")
    save_index(inverted_index)

    print("已将倒排索引结果存入inverted.json!")

if __name__ == "__main__":
    main()

2f91f2edc5bc4404a85cfe899f3abb7e.png

08679f13e9e442d5be6cb80a0b1b3003.png

 

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WiIsonEdwards

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值