python逆インデックス

6700 ワード

一.実験の目的
1.リスト、集合と辞書の定義、値付け、使用などの基本操作を把握し、複雑なデータ型を処理する一般的な流れを熟知する.リスト、コレクション、辞書の一般的な関数とテクニックを熟知しています.テキストの柔軟な処理とソートアルゴリズムの運用を考察する
二.実験内容
    (Inverted index),         ,       ,                 。                。      ,                     。

本実験は主に以下の3つの機能を完成した.
(1).     :    100    ,        ,               、             ,           。        ,           ,     1    。

(2).     :                      ,                 。  ,  “created”    3, 20 ,“dead”     14, 20, 22 。       (             ,     ):

…

created: 3, 20

dead: 14, 20, 22

…

(3).   :       (Query)   ,        ,          (Keywords)  ,                    。              (    ),        。                               ,   “None”。            。          ,    “created” ,   “3, 20”;    “created dead” ,   “20”;    “abcde dead” ,   “None”;

(4).     :    Query “AND:”  ,   “ ”  ,              ;     Query “OR:”  ,   “ ”  ,                  。    (  “AND:” “OR:”  ),  “ ”  。

問題を解く構想.
                     :     100       ,      ,     。           :AND   OR  ,AND            ,OR        。    “(3).  ”  AND  。

具体的な実現と問題点
ディクショナリの作成:私はディクショナリというストレージ構造を使用しています.私は最初の100行のすべての単語をkeyとして使用しています.valuesは各単語の出現行数を格納する集合です.
辞書の印刷:辞書の順序に合致する辞書を出力するため、pythonが持参したソート関数を使用し、ソートの結果がlist(インデックス値はkey、インデックス結果はsetのリスト形式)であることに注意して、楽しく印刷できます.
クエリ:ANDクエリは集合の交差であり,ORクエリは集合の並列である.だから私は辞書を建てるとき、valuesとしてsetを賢く使いました.
境界の状況:クエリー時にスペース行があります.
問題:
         ,     set,dictionary……   list。
s = ‘  ’ s.split()    [ ] s.spilt(  )    [  ,  ]

コード:
# -*- coding: utf-8 -*-
"""
Created on Sat Nov 22 09:57:06 2014

@author: Liyu Fu
"""
'''Step one:New Dictionary'''
dict1 = {}
for i in range(100):
    sentence = raw_input()
    word_list = sentence.split()
    for word in word_list:
        if word not in dict1:
            dict1[word] = set()         #new word
        dict1[word].add(i+1)                             #update for dictionary

'''Step two:Print Index'''
answer_list = sorted(dict1.iteritems(),key=lambda d:d[0])#Sort by keyword of dictionary.
for word in answer_list:
    l = list(word[1])
    l.sort()
    print word[0]+': '+', '.join(map(str,l))             #Print Index

def print_answer(answer_set):                              #Output search results
    empty_set = set()                                   
    if empty_set == answer_set:                             #answer_set is empty
        print 'None'
    else:
        answer_list=list(answer_set)
        answer_list.sort()
        print ', '.join(map(str,answer_list))               #Print answer of Query

'''Step three:Retrieval'''       
while True:
    Query = raw_input() 
    if Query == '': break                                    #Exit condition
    answer_set = set()         
    if 'OR:' in Query:                                       #OR-Retrieval
        Query = Query[3:]
        Q_word_list = Query.split()
        for word in Q_word_list:
            if (word != '')and(word in dict1):
                answer_set = dict1[word]|answer_set          #set or
        print_answer(answer_set)
    else:                                                    #AND-Retrieval
        if 'AND:' in Query:Query = Query[4:]
        Q_word_list = Query.split()
        if Q_word_list!=[]:
            for i in range(1,101):answer_set.add(i)          
            for word in Q_word_list:
                if (word != ''):
                    if word in dict1:
                        answer_set = dict1[word]&answer_set #set and
                    else:answer_set = set()                 #wrong word
            print_answer(answer_set)                         
        else:print 'None'

pythonからインデックスを転載