NLTK CFG递归深度

2024-04-27 03:24:02 发布

您现在位置:Python中文网/ 问答频道 /正文

import nltk   
from nltk.parse.generate import generate,demo_grammar   
from nltk import CFG   
grammar = CFG.fromstring("""   
ROOT -> S
S -> NP VP
NP -> NP PP
NP -> DT NN
DT -> 'The'
NN -> 'work'
PP -> IN NP
IN -> 'of'
NP -> DT NN
DT -> 'the'
NN -> 'painter'
VP -> VBZ ADJP
VBZ -> 'is'
ADJP -> JJ
JJ -> 'good'
""")    
print(grammar)   
for sentence in generate(grammar, n=100):   
   print(' '.join(sentence))

一个错误

^{pr2}$

试图在函数工具.py,还是同样的问题。在


Tags: infromimportnpdtnncfggenerate
2条回答

我试图对重复出现的NP-NN-DT等进行编号,它似乎解决了由于唯一识别(我猜想)而造成的问题。让我感到奇怪的是,它本来应该是这样的,也就是说,被抛出的树的作品应该连载了词类。在

import nltk   
from nltk.parse.generate import generate,demo_grammar   
from nltk import CFG   
grammar = CFG.fromstring("""
ROOT -> S   
S -> NP VP
NP -> NP1 PP
NP1 -> DT1 NN1
DT1 -> 'The'
NN1 -> 'work'
PP -> IN NP2
IN -> 'of'
NP2 -> DT2 NN2
DT2 -> 'the'
NN2 -> 'painter'
VP -> VBZ ADJP
VBZ -> 'is'
ADJP -> JJ
JJ -> 'good'
""")    
print(grammar)   
for sentence in generate(grammar, n=100):   
   print(' '.join(sentence))

函数generate,正如它的docstring所说,“从CFG生成所有句子的迭代器。”显然,它是通过按照语法中列出的顺序选择替代扩展来实现的。所以,第一次是看到一个NP,它用规则NP -> NP PP来扩展它。它现在有另一个NP要展开,它也使用相同的规则进行扩展。。。以此类推,直到超过python的限制。在

要解决您提供的语法问题,只需重新排列前两个NP规则,使递归规则不是第一个遇到的规则:

grammar = CFG.fromstring("""   
ROOT -> S
S -> NP VP
NP -> DT NN
NP -> NP PP
DT -> 'The'
...
""")

这样做,生成器将生成许多完整的句子供您检查。请注意,更正的语法仍然是递归的,因此是无限的;如果生成足够多的句子,最终将达到相同的递归深度限制。在

相关问题 更多 >