1

ネストされた 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 コメント.... ありがとうございます。

4

3 に答える 3

3

ここから始めましょう:

doc_has_word = [ (index[word].keys(),word) for word in wordlist ]

これにより、(単語、ドキュメント) ペアのリストが作成されます。各ドキュメントは何度も出現するため、それから簡単に辞書を作成することはできません。

しかし

from collections import defaultdict
doc_words = defaultdict(list)
for d, w in doc_has_word:
    doc_words[tuple(d.items())].append(w)

役立つかもしれません。

于 2010-10-15T19:01:26.023 に答える
0
import itertools

index = {...}

def query(*args):
    result = []

    doc_count = [(doc, len(index[word][doc])) for word in args for doc in index[word]]
    doc_group = itertools.groupby(doc_count, key=lambda doc: doc[0])

    for doc, group in doc_group:
        result.append((doc, sum([elem[1] for elem in group])))

    return sorted(result, key=lambda x:x[1])[::-1]
于 2010-10-15T19:54:30.080 に答える
0

同様のドキュメントを見つけるための解決策は次のとおりです (最も難しい部分)。

wordList = ['spam','eggs','toast'] # our list of words to query for
wordMatches = [index.get(word, {}) for word in wordList]
similarDocs = reduce(set.intersection, [set(docMatch.keys()) for docMatch in wordMatches])

wordMatches各要素が一致する単語の 1 つに一致するドキュメントの辞書であるリストを取得します。

similarDocsクエリ対象のすべての単語を含むドキュメントのセットです。これは、リスト内の各辞書から文書名だけを取り出し、wordMatchesこれらの文書名のリストをセットとして表し、セットを交差させて共通の文書名を見つけることによって検出されます。

類似したドキュメントを見つけたら、(S. Lott の回答に示されているように) defaultdict を使用して、各単語と各ドキュメントに一致するすべてのリストを一緒に追加できるはずです。

関連リンク:

于 2010-10-15T20:21:52.383 に答える