ネストされた python 辞書の形で完全な逆インデックスがあります。その構造は次のとおりです。
{単語: {ドキュメント名: [場所リスト] } }
たとえば、辞書の名前を index とすると、「 spam 」という単語のエントリは次のようになります。
{ スパム: { doc1.txt: [102,300,399], doc5.txt: [200,587] } }
そのため、任意の単語を含むドキュメントはindex[word].keys()で指定でき、そのドキュメントの頻度はlen(index[word][document])で指定できます
ここで私の質問は、このインデックスで通常のクエリ検索をどのように実装するかです。つまり、たとえば 4 つの単語を含むクエリが与えられた場合、4 つすべての一致を含むドキュメントを検索し (出現頻度の合計でランク付け)、次に 3 つの一致を含むドキュメントなどを検索します ....
**
S. Lott の回答を使用して、このコードを追加しました。これは私が書いたコードです。私が望むとおりに動作しますが(出力のフォーマットが必要です)、改善できることはわかっています。
**
from collections import defaultdict
from operator import itemgetter
# Take input
query = input(" Enter the query : ")
# Some preprocessing
query = query.lower()
query = query.strip()
# now real work
wordlist = query.split()
search_words = [ x for x in wordlist if x in index ] # list of words that are present in index.
print "\nsearching for words ... : ", search_words, "\n"
doc_has_word = [ (index[word].keys(),word) for word in search_words ]
doc_words = defaultdict(list)
for d, w in doc_has_word:
for p in d:
doc_words[p].append(w)
# create a dictionary identifying matches for each document
result_set = {}
for i in doc_words.keys():
count = 0
matches = len(doc_words[i]) # number of matches
for w in doc_words[i]:
count += len(index[w][i]) # count total occurances
result_set[i] = (matches,count)
# Now print in sorted order
print " Document \t\t Words matched \t\t Total Frequency "
print '-'*40
for doc, (matches, count)) in sorted(result_set.items(), key = itemgetter(1), reverse = True):
print doc, "\t",doc_words[doc],"\t",count
Pls コメント.... ありがとうございます。