20

解析された文(スタンフォードパーサーを使用して解析された)の(大きな)リストがあります。たとえば、「今、あなたは楽しまれることができます」という文には、次のツリーがあります。

(ROOT
  (S
    (ADVP (RB Now))
    (, ,)
    (NP (PRP you))
    (VP (MD can)
      (VP (VB be)
        (VP (VBN entertained))))
    (. .)))

nltkを使用して文法を誘導するために、一連の文ツリーを使用しています。

import nltk

# ... for each sentence tree t, add its production to allProductions
allProductions += t.productions()

# Induce the grammar
S = nltk.Nonterminal('S')
grammar = nltk.induce_pcfg(S, allProductions)

grammar次に、を使用して新しいランダムな文を生成したいと思います。文法は特定の入力例のセットから学習されたので、生成された文は意味的に類似していることを願っています。nltkでこれを行うことはできますか?

nltkを使用してこれを行うことができない場合、(おそらく再フォーマットされた)grammar文を生成できる他のツールはありますか?

4

5 に答える 5

14

NLTK 2.0 では、 を使用して、特定の文法で可能なすべてのnltk.parse.generate文を生成できます。

このコードは、(P)CFG のプロダクション ルールに基づいて単一の文を生成する関数を定義します。

# This example uses choice to choose from possible expansions
from random import choice
# This function is based on _generate_all() in nltk.parse.generate
# It therefore assumes the same import environment otherwise.
def generate_sample(grammar, items=["S"]):
    frags = []
    if len(items) == 1:
        if isinstance(items[0], Nonterminal):
            for prod in grammar.productions(lhs=items[0]):
                frags.append(generate_sample(grammar, prod.rhs()))
        else:
            frags.append(items[0])
    else:
        # This is where we need to make our changes
        chosen_expansion = choice(items)
        frags.append(generate_sample,chosen_expansion)
    return frags

PCFG で重みを利用するにchoice()は、現在のノードのすべての展開が等確率であると暗黙的に仮定する よりも優れたサンプリング方法を使用する必要があることは明らかです。

于 2013-03-25T14:39:05.103 に答える
4

まず、ランダムな文を生成すると、意味的には正しいかもしれませんが、意味を失う可能性があります。

(私には、MIT の学生が科学論文を自動生成するSCIgen プログラムで行ったように思えます。ところで、非常に興味深いです。)

とにかく、私は自分でやったことがありませんが、 nltk.bigrams で可能であるようです

現在のツリーのすべてのサブツリーを生成することもできますが、それがあなたが望むものかどうかはわかりません。

于 2013-03-23T22:31:05.413 に答える
2

nltk Textオブジェクトを使用すると、「generate()」を呼び出すことができ、「trigram 言語モデルを使用して生成されたランダムなテキストを出力する」ことができます。http://nltk.org/_modules/nltk/text.html

于 2013-03-23T22:39:35.907 に答える