NLTK自定义语法下RecursiveDescentParser无输出及recursion error问题
故障原因排查结论
是自定义CFG语法定义错误,和递归下降解析器本身无关,核心问题是现有语法规则完全无法匹配输入句子的完整结构,具体问题如下:
- 根节点
S的产生式规则错误:现有规则S -> NP | VP只能匹配单个名词短语或单个动词短语,无法匹配你输入的「主语(NP)+ 谓语(VP)」结构的完整6词句子。现有规则下S能匹配的最长序列只有3个词(Det Adj N结构的NP),远短于输入的6个词。 - 动词短语
VP的产生式规则错误:现有规则VP -> V P只能匹配2个词的动词+介词结构,而你输入中谓语部分是attracted by the touching story共5个词,缺少后续宾语NP的匹配规则。
修正后的可运行代码示例
import nltk sent = ["I'm", 'attracted', 'by', 'the', 'touching', 'story'] grammar = nltk.CFG.fromstring(""" # 修正S的产生式,支持NP+VP的完整主谓句 S -> NP VP NP -> "I'm" | Det Adj N # 修正VP的产生式,支持V+P+宾语NP的结构 VP -> V P NP V -> 'attracted' P -> 'by' Det -> 'the' Adj -> 'touching' N -> 'story' """) rd_parser = nltk.RecursiveDescentParser(grammar) for tree in rd_parser.parse(sent): print(tree)
运行后输出结果为:
(S (NP I'm) (VP (V attracted) (P by) (NP (Det the) (Adj touching) (N story))))
内容的提问来源于stack exchange,提问作者rodericktung
相关产品推荐
相关产品推荐

