Python倒排索引

倒排索引(Inverted index),也常被称为反向索引,是一种索引方法,用来存储某个单词存在于哪些文档之中。是信息检索系统中最常用的数据结构。通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。
本作业主要完成以下四个功能:
(1). 建立索引:首先输入100行字符串,用于构建倒排索引,每行字符串由若干不含标点符号的、全部小写字母组成的单词构成,每个单词之间以空格分隔。依次读入每个单词,并组成一个由<单词, 每个单词出现的行号集合>构成的字典,其中行号从1开始计数。
(2). 打印索引:按照字母表顺序依次输出每个单词及其出现的位置,每个单词出现的位置则按行号升序输出。例如,如果“created”出现在第3, 20行,“dead”分别出现在14, 20, 22行。则输出结果如下(冒号和逗号后面都有一个空格,行号不重复):
…created: 3, 20dead: 14, 20, 22…
(3). 检索:接下来输入查询(Query)字符串,每行包含一个查询,每个查询由若干关键字(Keywords)组成,每个关键字用空格分隔且全部为小写字母单词。要求输出包含全部单词行的行号(升序排列),每个查询输出一行。若某一关键字在全部行中从没出现过或没有一行字符串包含全部关键字,则输出“None”。遇到空行表示查询输入结束。如对于上面创建的索引,当查询为“created”时,输出为“3, 20”;当查询为“created dead”时,输出为“20”;当查询为“abcde dead”时,输出为“None”;
(4). 高级检索:当输入的Query以“AND: ”开始,则执行“与”检索,即要求输出包含全部关键字的行;如果输入的Query以“OR:”开始,则执行“或”检索,即某行只要出现了一个关键字就满足条件。默认情况(不以“AND: ”或“OR: ”开始),执行“与”检索。
输入格式:
首先输入100行字符串,每行字符串由若干不含标点符号的、全部小写字母组成的单词构成,每个单词之间以空格分隔。若干个查询,每个查询占一行,既可能是普通检索,也可能是高级检索。
输出格式:
首先打印索引,然后将每个查询的结果输出到一行。
时间限制:500ms内存限制:32000k



dic = {}  
  
for i in range(100):  
    sentence = raw_input()  
    words = sentence.split()  
    for word in words:  
        if word not in dic:  
            dic[word]=set()  
        dic[word].add(i+1)  
              
  
  
  
rank =  sorted(dic.items(), key = lambda x: x[0], reverse = False)  
  
  
for word in rank:  
    lst = list(word[1])  
    lst.sort()  
    print word[0]+': '+', '.join(map(str,lst))  
  
  
while True:  
    f = 0  
    dic1={}  
    texts = raw_input()  
    if not texts:  
        break  
    if 'OR:'in texts:  
        texts = texts[3:]  
        f=1  
    if 'AND:'in texts:  
        texts = texts[4:]  
    text = texts.split()  
    for word in text:  
        if word in dic.keys():  
            dic1[word]=dic[word]  
        else:  
            dic1[word]=set()  
    answer = set()  
    if f:  
        for a in dic1.keys():  
            answer = answer|dic1[a]  
    else:  
        for i in range(99):  
            answer.add(i+1)  
        for a in dic1.keys():  
            answer = answer&dic1[a]  
    if not answer:  
        print 'None'  
    else:  
        l=list(answer)  
        l.sort()  
        print ', '.join(map(str,l))  
			


  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值