0

自然言語処理のタグ付けモデルを構築しています。最初に、文の単語は品詞 (名詞の NN など) としてタグ付けされ、次にそれらをネストされたリストとして表されるツリーに分割するルールが適用されます。このプロセスは、最上位のノードを 1 つ取得するまで何度も繰り返されます。可能性のあるすべてのツリーのマスター リストがあり、重複するツリーを削除する必要があります。そうしないと、すべてがメモリ内で爆発します。以下は、リストの構成要素の小さなサンプルです。反復ごとに多くのブランチが作成されるため、リスト内の各リストが一意であることを確認する必要があります。

[[('NP', [('PRP', 'I')]), ('VBD', 'ate'), ('DT', 'a'), ('NN', 'steak'), ('IN', 'with'), ('DT', 'a'), ('NN', 'knife'), ('.', '.')]
[('PRP', 'I'), ('VP', [('VBD', 'ate')]), ('DT', 'a'), ('NN', 'steak'), ('IN', 'with'), ('DT', 'a'), ('NN', 'knife'), ('.', '.')]
[('PRP', 'I'), ('VBD', 'ate'), ('NP', [('DT', 'a')]), ('NN', 'steak'), ('IN', 'with'), ('DT', 'a'), ('NN', 'knife'), ('.', '.')]
...]

セットを使用することを考えましたが、リストはハッシュ可能ではありません。再帰を使用しようとしましたが、メモリが不足しています。リストを文字列に変換し、文字列を辞書のキーとして使用し、リストを値として使用してから、繰り返してリストに戻します(または辞書として保持しますか?)。ハックの少ないソリューションを持っている人はいますか? 私はPythonに比較的慣れていないので、ソリューションがどのように機能するかを説明してください。

明確にする必要があります。ネストされたリストは無限に深くなる可能性があります。ツリー構造は事前にわかりませんが、その場で構築されます。このようなものを構築しようとしています - http://jos.oxfordjournals.org/content/25/4/345/F23.large.jpgただし、ネストされたリストの形式です。

4

2 に答える 2

0

タプルをハッシュできます。これにより、問題の一部が解決される可能性があります(ただし、問題について少し混乱しています)これにより、既存のすべてのタプルをセット(一種のハッシュ可能なリスト)に保存できます。そうすれば、呼び出したばかりの新しいタプルを作成しようとするときに

if my_tuple in my_tuple_set:
    # the best way I could find to access the item in a tuple
    stored_tuple = my_tuple_set.pop(my_tuple) 
    my_tupple_set.add(stored_tuple)
    my_tuple = stored_tuple   # reset pointer to stored data

Python でメモリの問題に対処しなければならないのは興味深いことです。

于 2013-10-31T21:58:17.727 に答える