0

インデックスを作成するドキュメントがいくつかあります。つまり、ドキュメントを読んで単語を抽出し、どのドキュメントのどの位置に表示されるかを保存してインデックスを作成する必要があります。

最初は単語ごとに個別のファイルを作成しています。2 つのドキュメントを検討してください。

ドキュメント 1

The Problem of Programming Communication with

ドキュメント 2

Programming of Arithmetic Operations

したがって、10 個の単語、8 個の固有の単語があります。だから私は8つのファイルを作成します。

算術演算によるプログラミング通信の問題

各ファイルで、どのドキュメントにどの位置に表示されるかを保存します。私が実装している実際の構造にはさらに多くの情報がありますが、この基本構造は目的に役立ちます。

ファイル名 ファイルの内容

1 1

問題 1 2

1 3 2 2 の

プログラミング 1 4 2 1

コミュニケーション 1 5

1 6で

算数 2 3

操作 2 4

意味。単語は、1 番目のドキュメントの 3 番目の位置と 2 番目のドキュメントの 2 番目の位置にあります。

最初のインデックスが完了したら、すべてのファイルを 1 つのインデックス ファイルに連結し、別のファイルに特定の単語が見つかるオフセットを保存します。

索引ファイル:

1 1 1 2 1 3 2 2 1 4 2 1 1 5 1 6 2 3 2 4

オフセット ファイル:

the 1 problem 3 of 5 programming 9 communications 13  with 15 arithmetic 17 operations 19

したがって、通信のインデックス情報が必要な場合は、ファイルの 13 番目の位置に移動し、(除く) 15 番目の位置、つまり次の単語のオフセットまで読み取ります。

これは、静的インデックス作成では問題ありません。しかし、1 つのインデックスを変更すると、ファイル全体を書き直す必要があります。ファイルの内容を動的に変更し、オフセットを何らかの方法で更新できるように、b ツリーをインデックス ファイルの構造として使用できますか? もしそうなら、誰かがこれがどのように機能するか、または私がこれをどのように実装できるかについていくつかのチュートリアルやライブラリに案内してくれますか?

このような長い記事をお読みいただき、誠にありがとうございます。

編集: B ツリーとバイナリ ツリーの違いを認識していませんでした。そこで、もともと二分木を使って質問しました。現在修正されています。

4

2 に答える 2

1

基本的に、逆索引を作成しようとしています。なぜそんなに多くのファイルを使用する必要があるのですか? 永続オブジェクトと辞書を使用して、その作業を行うことができます。後でインデックスが変更された場合は、永続オブジェクトをリロードし、特定のエントリを変更してオブジェクトを再保存するだけです。

これを行うコード例を次に示します。

import shelve

DOC1 = "The problem of Programming Communication with"
DOC2 = "Programming of Arithmetic Operations"

DOC1 = DOC1.lower()
DOC2 = DOC2.lower()

all_words = DOC1.split()
all_words.extend(DOC2.split())
all_words = set(all_words)

inverted_index = {}

def location(doc, word):
    return doc[:doc.find(word)].count(' ') + 1


for word in all_words:
    if word in DOC1:
        if word in inverted_index:
            inverted_index[word].append(('DOC1', location(DOC1, word)))
        else:
            inverted_index[word] = [('DOC1', location(DOC1, word))]
    if word in DOC2:
        if word in inverted_index:
            inverted_index[word].append(('DOC2', location(DOC2, word)))
        else:
            inverted_index[word] = [('DOC2', location(DOC2, word))]

# Saving to persistent object
inverted_index_file = shelve.open('temp.db')
inverted_index_file['1'] = inverted_index
inverted_index_file.close()

次に、保存されたオブジェクトを次のように表示できます (同じ戦略を使用して変更できます)。

>>> import shelve
>>> t = shelve.open('temp.db')['1']
>>> print t
{'operations': [('DOC2', 4)], 'of': [('DOC1', 3), ('DOC2', 2)], 'programming': [('DOC1',   4), ('DOC2', 1)], 'communication': [('DOC1', 5)], 'the': [('DOC1', 1)], 'with': [('DOC1', 6)], 'problem': [('DOC1', 2)], 'arithmetic': [('DOC2', 3)]}

私のポイントは、これを一度ビルドすると、他のコードが実行されている間に、shelveオブジェクトをメモリに辞書として保持し、動的に変更できるということです。

それがあなたに合わない場合は、特にsqlite3軽量であるため、データベースの使用をサポートします.

于 2012-04-21T16:23:10.837 に答える
0

1 つのオプションは、辞書を使用してデータを構造化し、cPickle を使用してファイルにダンプすることです。

于 2012-04-20T20:33:07.737 に答える