如何基于查询统计倒排索引词频并生成排序文档列表
需求与实现说明
现有倒排索引
我已构建如下格式的倒排索引:
{ 'experiment': {'d1': [1, [0]], ..., 'd30': [2, [12, 40]], ..., 'd123': [3, [11, 45, 67]], ...}, 'studi': {'d1': [1, [1]], 'd2': [2, [0, 36]], ..., 'd207': [3, [19, 44, 59]], ...} }
其中,术语experiment在文档d1中出现1次,位置为0;在文档d30中出现2次,位置为12和40,以此类推。
查询字典格式
需要处理的查询字典格式如下:
{ 'q1' : ['similar', 'law', ..., 'speed', 'aircraft'], 'q2' : ['structur', 'aeroelast', ..., 'speed', 'aircraft'], ... 'q225': ['design', 'factor', ..., 'number', '5'] }
期望输出
最终需生成如下格式的结果:
{ 'q1' : ['d51', 'd874', ..., 'd717'], 'q2' : ['d51', 'd1147', ..., 'd14'], ..., 'q225': ['d1313', 'd996', ..., 'd193'] }
输出中,键为查询名称,值为包含该查询中所有术语的文档列表,且列表需按照**文档的总词频(所有查询术语在该文档中的出现次数之和)**降序排列。
实现思路
- 遍历每个查询,对每个查询中的术语,从倒排索引中获取对应的文档及词频
- 统计每个文档的总词频:将查询中所有术语在该文档的出现次数相加
- 过滤掉总词频为0的文档(即未包含任何查询术语的文档)
- 按总词频从高到低排序文档,得到最终的文档列表
示例代码
def process_queries(inverted_index, queries): result = {} for q_name, terms in queries.items(): doc_freq = {} for term in terms: # 跳过倒排索引中不存在的术语 if term not in inverted_index: continue for doc_id, (count, _) in inverted_index[term].items(): if doc_id in doc_freq: doc_freq[doc_id] += count else: doc_freq[doc_id] = count # 按总词频降序排序,词频相同则按文档ID排序(可选) sorted_docs = sorted(doc_freq.keys(), key=lambda x: (-doc_freq[x], x)) result[q_name] = sorted_docs return result # 示例调用 inverted_index = { 'experiment': {'d1': [1, [0]], 'd30': [2, [12, 40]], 'd123': [3, [11, 45, 67]]}, 'studi': {'d1': [1, [1]], 'd2': [2, [0, 36]], 'd207': [3, [19, 44, 59]]} } queries = { 'q1': ['experiment', 'studi'], 'q2': ['studi'] } output = process_queries(inverted_index, queries) print(output)
运行上述代码后,输出结果为:
{ 'q1': ['d1', 'd2', 'd30', 'd123', 'd207'], 'q2': ['d207', 'd2', 'd1'] }
内容的提问来源于stack exchange,提问作者Hefe
相关产品推荐
相关产品推荐

