import nltk
from nltk.parse import ViterbiParser
def pcfg_chartparser(grammarfile):
f=open(grammarfile)
grammar=f.read()
f.close()
return nltk.PCFG.fromstring(grammar)
grammarp = pcfg_chartparser("wsjp.cfg")
VP = ViterbiParser(grammarp)
print VP
for w in sent:
for tree in VP.parse(nltk.word_tokenize(w)):
print tree
当我运行上面的代码时,它会为句子“关闭灯光”生成以下输出-
(S (VP (VB turn) (PRT (RP off)) (NP (DT the) (NNS lights)))) (p=2.53851e-14)
但是,它对“请关灯”这句话提出了以下错误-
ValueError: Grammar does not cover some of the input words: u"'please'"
我正在构建一个ViterbiParser,它提供了一个概率上下文无关的语法。它能很好地分析那些已经在语法规则中的单词的句子。它无法解析语法规则中没有看到单词的句子。如何绕过这个限制?
我指的是这个assignment。在
首先,尝试使用(i)名称空间和(ii)明确的变量名称,例如:
如果我们看看语法:
^{pr2}$要解决未知单词问题,有几个选项:
使用
wildcard
非终端节点替换未知单词。找到一些方法将语法中没有从check_coverage()
中覆盖的单词替换为wildcard
,然后用通配符解析这个句子返回到您的语法生成文件,在使用^{} 创建学习PCFG之前,在终端生成中添加所有可能的单词。
将未知单词添加到pcfg语法中,然后重新规范化权重,为未知单词指定非常小的权重(您也可以尝试更智能的平滑/插值技术)
因为这是一个家庭作业问题,我不会用完整的代码给出答案。但上述暗示应该足以解决问题。在
相关问题 更多 >
编程相关推荐