2012-04-20 3 views
0

を使用してファイルにBツリーを書き込み、それは私がドキュメントを読んで、彼らが表示され、どの位置にどの文書で保存することにより、単語や、インデックス、それらを抽出する必要があるということです。当初、私は別のファイルを作成していた各単語に対してインデックスを作成するためにいくつかのドキュメントがありますのpython

。 2つの文書を考えてみましょう:

文書1つの

The Problem of Programming Communication with 

文書2

Programming of Arithmetic Operations 

だから、8ユニークな10個の言葉があるでしょう。だから私は8つのファイルを作成します。

問題 のiは、それらが現れる文書に格納し、どの位置する各ファイルに 通信 算術演算と

をプログラミングします。私が実装している実際の構造はもっと多くの情報を持っていますが、この基本構造が目的を果たします。

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

問題1 2

通信1~5

をプログラミングします

と1

算術2 3

操作2 4

意味します。単語は第1の文書 - 第3の位置および第2の文書 - 第2の位置に配置される。最初のインデックスが行われた後

私は、単一のインデックスファイルにすべてのファイルを連結し、別のファイルに私は特定の単語が発見される場所のオフセットを格納します。

インデックスファイル:

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 

で、15位に(除く)私は、ファイルの後藤13位とは点で最大読み込みますコミュニケーションのインデックス情報が必要な場合言い換えれば、次の単語のオフセット。

これは、静的索引のためのすべての罰金です。しかし、単一のインデックスを変更すると、ファイル全体を書き直す必要があります。私は動的にファイルの内容を変更し、何とかオフセットを更新できるように、私は、インデックスファイルの構造としてBツリーを使用することはできますか?もしそうなら、誰かがこれがどのように機能するか、いくつかのチュートリアルやライブラリに私を導くか、私はこれを実装する方法について少し説明することができますか?

このような長い記事を読んでいただきありがとうございます。

EDIT:私はBツリーとバイナリツリーの違いを認識していませんでした。だから私は元々二分木を使って質問しました。今は修正されています。

+3

sqlite 3とリレーショナルプログラミングをストレージフォーマットとして使用する方がよいでしょうか?私は10年前にプログラミングを始めたときにそれを持っていたことを願っています... – dsign

+0

私はこの1つで2番目のdsignに行きます。これには、軽量リレーショナルデータベースを使用する必要があります。単語の表、ファイルの表、および2つの間のリレーショナル表( 'file_word')を単純に持つことができます。カウントは集計クエリになります。 – syrion

答えて

1

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

ここではないことをサンプルコードです:私のポイントがある

>>> 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)]} 

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() 

その後、あなたは、この(とあなたが同じ戦略を使用して、それを修正することができる)のような保存されたオブジェクトを見ることができますが、一度これをビルドすると、他のコードが実行されている間に辞書としてメモリにshelveオブジェクトを持ち、それを動的に変更することができます。

あなたに合っていない場合は、軽量であるため、特にsqlite3というデータベースの使用をサポートします。

0

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

関連する問題