これはSOに関する私の最初の投稿であり、私の質問が少し些細なものであることが判明した場合は、事前に謝罪します。プログラミングの世界は比較的新しいので、最初の「深刻な」OOP言語としてPythonを選択しました。SOアーカイブを検索しましたが、自分に完全に関連する質問は見つかりませんでした。さて、簡単に言えば、ここに問題があります:
私は転置インデックスに取り組んでいます。ネット上で従うべきチュートリアルとヒントをいくつか見つけ、次のことを行いました。
単語をステミングし、finditer関数のおかげで開始位置と終了位置でそれらを返すためのクラスドキュメント。
ドキュメントのコレクション(リスト内のリスト)を取得し、それらをトークン化して、次の形式で転置インデックスに配置するクラスInverted_Index
{'word':{document_id:(start_pos, end_pos)}}
のように
{'cloud': {0: [(5, 10)]}, 'document': {1: [(11, 19)], 2: [(22, 30)]} ...}
。(私はSOトピックの助けを借りてdocument_idを実行し、ドキュメントの列挙されたコレクションを繰り返しました。ネストされた辞書については、次のように素人っぽく作成しました。
if nested_dict not in existing_dict:
existing_dict[nested_dict] = {}
スタックowerflowを読んでいるときに、「defaultdict」データ型がそれを行うための非常に優れた方法であることに気付きましたが、「collections」モジュールをまだ理解していません。)
軌道に戻る:Inverted_Indexの内部で文字列をクエリとして受け取るQueryメソッド(OR演算子のバージョンのみ)を実行し、その文字列が転置インデックスのキー/用語と一致する場合、開始点と終了点が次のような用語:
[(1, [(0, 4), (11, 19)]), ...]
そしてその後、私は...立ち往生しました。ドキュメント内で見つかった単語をその環境とともに出力するクエリ出力を作成したいのですが、クエリメソッド(開始位置と終了位置を持つdocument_id)と転置インデックスの結果を接続する方法がわかりません。彼女の環境内で一致したクエリを強調表示する方法の手がかりがあります。そのため、開始点と終了点を作成しましたが、Pythonでそれを強調する方法がわかりませんか?大胆に?
私は次のような結果を考えました:
###################
クエリ:「チョコレートプディング」
結果:
########
IDが1のドキュメントの場合:1
yaddi yaddi yadda Chocolate bla bla blaプリン
ホコレートブラブラブラプディングヤッディヤッディヤッダブラ
つまり、 http://docs.python.org/2/library/string.html#string.centerを読んでいて、見つかった単語やクエリを同じ列に並べるとうまくいくと思っていました。しかし、そこにたどり着く方法がわからないので、Pythonの背後にあるロジックを理解することに固執しているので、プログラムに固執していないので、どんな種類のヒントも素晴らしいでしょう。その場合、チュートリアルはしません。正義。(はい、私はいくつかのPythonの本を手に入れましたが、おそらく初心者向けではないことを考慮して、この種の問題へのアプローチを拡張しましたが、どこから始めればよいのか、どのプログラムを使用できるのかわかりません。問題は、私たちは大学で言語理論とIR理論を学びますが、実際にはいくつかのことを行います。)
ありがとう!
そして、この私の人生の物語の終わりについて申し訳ありません:D
このトピックを曖昧にしないためのコードを忘れました:
class inverted_index(dict):
def __init__(self,collection_of_docs):
for doc_id,document in enumerate(collection_of_docs):
for word,start,end in document.tokenize(): #form: [('sky', 0, 4)]
if word not in self:
self[word]={}
if doc_id not in self[word]:
self[word][doc_id]=[]
self[word][doc_id].append((start,end))
def query(self,query_string):
result={}
for query_term in re.findall(r'\w+',query_string.lower(),re.UNICODE):
for doc_id in self.get(query_term,{}):
if doc_id not in result:
result[doc_id]=self[query_term][doc_id]
else:
result[doc_id]=result[doc_id]+self[query_term][doc_id]
return sorted(result.items(),key=lambda e:-len(e[1]))