Python实现术语到对应倒排表映射的索引函数开发
基于Python的倒排表映射实现
描述中的疏漏修正
你列出的期望映射结构存在两处小问题:
- 重复书写了两次
"bread": [1],Python字典不支持同键重复定义,重复条目会被自动覆盖 - 原文档集合中的词汇
meat属于索引为1的文档,没有被包含在你给出的期望结果中
核心实现逻辑
生成这类术语-文档索引映射的流程非常直接:
- 遍历文档集合时,同步记录当前处理的文档索引位置
- 对单篇文档拆分得到的每个词汇,判断是否已经在结果字典中存在:存在就往对应的值列表里追加当前文档索引,不存在就新建键值对,将当前索引作为列表的初始值
可运行实现代码
def generate_inverted_map(collection): inverted_map = {} # 同步获取文档索引和文档原文 for doc_index, doc_text in enumerate(collection): terms = doc_text.split() for term in terms: if term not in inverted_map: inverted_map[term] = [] inverted_map[term].append(doc_index) return inverted_map # 测试输入 collection = ["apple orange milk" , "bread milk meat apple" , "apple orange"] inv_ls = generate_inverted_map(collection)
运行上述代码后得到的实际输出为:
{'apple': [0, 1, 2], 'orange': [0, 2], 'milk': [0, 1], 'bread': [1], 'meat': [1]}
可选优化点
如果你的倒排表只需要记录词汇所属的文档范围,不需要统计词汇在单文档内的出现次数,可以在遍历单文档词汇时先做去重处理,避免同一文档内重复出现的词汇被重复追加文档索引:
def generate_inverted_map(collection): inverted_map = {} for doc_index, doc_text in enumerate(collection): # 对单文档内的词汇先去重 for term in set(doc_text.split()): if term not in inverted_map: inverted_map[term] = [] inverted_map[term].append(doc_index) return inverted_map
内容的提问来源于stack exchange,提问作者user15874067
相关产品推荐
相关产品推荐

