7

だから私は自然言語処理クラスを取っています.trigram言語モデルを作成して、サンプルデータに基づいてある程度「現実的」に見えるランダムテキストを生成する必要があります.

基本的に、さまざまな 3 文字の文法単語の組み合わせを保持するために「トライグラム」を作成する必要があります。私の教授は、これを使用して作成しようとした辞書の辞書の辞書を作成することで実行できることを示唆しています。

trigram = defaultdict( defaultdict(defaultdict(int)))

ただし、次のようなエラーが表示されます。

trigram = defaultdict( dict(dict(int)))
TypeError: 'type' object is not iterable

3 層のネストされた辞書または値の辞書の辞書の辞書を作成するにはどうすればintよいですか?

答え方がわからない場合、スタックオーバーフローに関する質問に反対票を投じる人がいると思います。喜んで助けてくれる人のために、質問をよりよく説明するために背景を追加します。

このトライグラムは、トリプル ワード パターンを追跡するために使用されます。はテキスト言語処理ソフトウェアで使用されており、自然言語処理のほぼすべての場所で「siri や google を考えてください」と使用されています。

辞書の 3 つのレベルをdict1 dict2 および dict3として指定すると、テキスト ファイルを解析して"The boy runs"ステートメントを読み取ると、次のようになります。

「the」のキーを持つ dict1。そのキーにアクセスすると、キー「boy」を含む dict2 が返されます。そのキーにアクセスすると、キー「実行」を含む最終的な dict3 が返され、そのキーにアクセスすると値 1 が返されます。

これは、このテキストに「少年が走る」が 1 回登場することを象徴しています。再度発生した場合は、同じプロセスに従い、1 を 2 に増やします。「the girl walks」に遭遇した場合、dict2 「the」キー ディクショナリには「girl」の別のキーが含まれます。このキーには、「walks」のキーと 1 の値などを持つ dict3 があります。最終的に、大量のテキストを解析した後 (そして単語数を追跡した後)、以前に解析されたテキストに出現する頻度に基づいて、3 つの単語の組み合わせにつながる特定の開始単語の可能性を判断できるトライグラムが得られます。 .

これは、言語を識別するための文法規則を作成するのに役立ちます。または、私の場合は、文法的な英語に非常によく似たランダムに生成されたテキストを作成するのに役立ちます。3 つの単語の組み合わせのどの位置にも、まったく異なる組み合わせのセットを作成できる別の単語が存在する可能性があるため、3 層の辞書が必要です。私はトリグラムとその背後にある目的をできる限り説明するために最善を尽くしました... 確かに、数週間前にクラスについて述べました.

今...すべてが言われています。基本辞書がPythonでint型の値を保持する辞書の辞書の辞書を作成するにはどうすればよいですか?

トリグラム = defaultdict( defaultdict(defaultdict(int)))

私にエラーをスローします

4

4 に答える 4

0

トリグラムを抽出して取得するだけの場合は、次の方法でこれを試してくださいNLTK

>>> import nltk
>>> sent = "this is a foo bar crazycoder"
>>> trigrams = nltk.ngrams(sent.split(), 3)
[('this', 'is', 'a'), ('is', 'a', 'foo'), ('a', 'foo', 'bar'), ('foo', 'bar', 'crazycoder')]
# token "a" in first element of trigram
>>> first_a = [i for i in trigrams if i[0] == "a"]
[('a', 'foo', 'bar')]
# token "a" in 2nd element of trigram
>>> second_a = [i for i in trigrams if i[1] == "a"]
[('is', 'a', 'foo')]
# token "a" in third element of trigram
>>> third = [i for i in trigrams if i[2] == "a"]
[('this', 'is', 'a')]
# look for 2gram in trigrams
>> two_foobar = [i for i in trigrams if "foo" in i and "bar" in i]
[('a', 'foo', 'bar'), ('foo', 'bar', 'crazycoder')]
# look for a perfect 3gram
>> perfect = [i fof i in trigrams if "foo bar crazycoder".split() == i]
[('foo', 'bar', 'crazycoder')]
于 2013-09-28T04:56:02.953 に答える