我想从stanford解析器中重生的语法生成句子,但是NLTK无法解释PRP $。
from nltk.parse.stanford import StanfordParser
from nltk.grammar import CFG
from nltk.parse.generate import generate
sp=StanfordParser(model_path='/home/aman/stanford_resource/stanford-parser-full-2014-06-16/stanford-parser-3.4-models/edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz',path_to_jar='/home/aman/stanford_resource/stanford-parser-full-2014-06-16/stanford-parser.jar',path_to_models_jar='/home/aman/stanford_resource/stanford-postagger-full-2014-08-27/stanford-postagger-3.4.1.jar')
sent1='He killed the tiger in his pants'
parse_result=sp.raw_parse(sent1)
grammar_list=[]
for p in parse_result:
l=p.productions()
grammar_string='\n'.join(map(str,l))
grammar=CFG.fromstring(grammar_string)
#grammar_list.append(grammar)
#for s in generate(grammar,n=3):
# print s
ValueError: Unable to parse line 11: NP -> PRP$ NNS
Expected a nonterminal, found: $ NNS
如何工作。我应该特别指示nltk这些语法类别。
答案 0 :(得分:4)
ValueError:无法解析第11行:NP - > PRP $ NNS
预期非终结者,发现:$ NNS
我不知道你为什么要尝试将手工构建的CFG与斯坦福解析器的输出结合起来,但这里是解决这个问题的方法:
我快速检查nltk/grammar.py
表明$
不是非终端名称的合法字符。这可以通过修补模块来轻松纠正:
import nltk
import re
nltk.grammar._STANDARD_NONTERM_RE = re.compile('( [\w/][\w$/^<>-]* ) \s*', re.VERBOSE)
在上面我刚刚将$
添加到nltk/grammar.py
中找到的正则表达式中。然后,您可以创建和使用在其作品中具有$
的语法:
grammar = nltk.grammar.CFG.fromstring("NP -> PRP$ NNS")