5

チョムスキー標準形 (CNF) を抽出しようとしています - 構文木から文の文法生成:

(ROOT
  (S
    (NP (DT the) (NNS kids))
    (VP (VBD opened)
      (NP (DT the) (NN box))
      (PP (IN on)
        (NP (DT the) (NN floor)))))) 

ツリー全体を S という名前の文字列に入れてから、次のようにします。

tree = Tree.fromstring(S)
tree.chomsky_normal_form()
for p in tree.productions():
    print p

出力は

(1) NN -> 'box'
(2) PP -> IN NP
(3) DT -> 'the'
(4) ROOT -> S
(5) NP -> DT NN
(6) VBD -> 'opened'
(7) VP|<NP-PP> -> NP PP
(8) VP -> VBD VP|<NP-PP>
(9) NP -> DT NNS
(10) NN -> 'floor'
(11) IN -> 'on'
(12) NNS -> 'kids'
(13) S -> NP VP

しかし、一部の作品 (7 番と 8 番) は CNF ではないようです! 何が問題ですか?

4

1 に答える 1

4

VP|<NP-PP>1 つの非終端記号です。縦棒は、従来の意味での複数のオプションを意味するものではありません。むしろ、NLTK は、ルールがどこから派生したかを示すためにそこに配置します。つまり、「この新しい非終端記号は、VP と NP-PP の組み合わせから派生したものです」。これは、文法をチョムスキー標準形に変換するために NLTK が作成した新しい生成規則です。

CNF の前のツリーの生成を見てみましょう。

ROOT -> S
S -> NP VP
NP -> DT NNS
DT -> 'the'
NNS -> 'kids'
VP -> VBD NP PP ***
VBD -> 'opened'
NP -> DT NN
DT -> 'the'
NN -> 'box'
PP -> IN NP
IN -> 'on'
NP -> DT NN
DT -> 'the'
NN -> 'floor'

具体的にVP -> VBD NP PPは、CNF にない rule を見てください (すべてのプロダクション ルールの RHS にちょうど 2 つの非終端記号がなければなりません)。

質問の 2 つのルール (7):VP|<NP-PP> -> NP PPと (8):VP -> VBD VP|<NP-PP>は、より一般的なルールと機能的に同等VP -> VBD NP PPです。

VP検出されると、ルールの適用結果は次のようになります。

VBD VP|<NP-PP>

そして、VP|<NP-PP>作成された生産ルールの LHS は次のようになります。

VBD NP PP

具体的には、ルール自体を分離する場合は、特定の記号 (実際には単数形) を調べることができます。

>>> tree.chomsky_normal_form()
>>> prod = tree.productions()
>>> x = prod[7]  # VP|<NP-PP> -> NP PP
>>> x.lhs().symbol()  # Singular!
u'VP|<NP-PP>'
于 2014-11-14T02:39:33.600 に答える