NLTK ViterbiParser无法解析PCFG ru中不包含的单词

2024-10-02 00:40:48 发布

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

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。在


Tags: inimportforparse语法句子printnltk
1条回答
网友
1楼 · 发布于 2024-10-02 00:40:48

首先,尝试使用(i)名称空间和(ii)明确的变量名称,例如:

>>> from nltk import PCFG
>>> from nltk.parse import ViterbiParser
>>> import urllib.request
>>> response = urllib.request.urlopen('https://raw.githubusercontent.com/salmanahmad/6.863/master/Labs/Assignment5/Code/wsjp.cfg')
>>> wsjp = response.read().decode('utf8')
>>> grammar = PCFG.fromstring(wsjp)
>>> parser = ViterbiParser(grammar)
>>> list(parser.parse('turn off the lights'.split()))
[ProbabilisticTree('S', [ProbabilisticTree('VP', [ProbabilisticTree('VB', ['turn']) (p=0.002082678), ProbabilisticTree('PRT', [ProbabilisticTree('RP', ['off']) (p=0.1089101771)]) (p=0.10768769667270556), ProbabilisticTree('NP', [ProbabilisticTree('DT', ['the']) (p=0.7396712852), ProbabilisticTree('NNS', ['lights']) (p=4.61672e-05)]) (p=4.4236397464693323e-07)]) (p=1.0999324002161311e-13)]) (p=2.5385077255727538e-14)]

如果我们看看语法:

^{pr2}$

要解决未知单词问题,有几个选项

  • 使用wildcard非终端节点替换未知单词。找到一些方法将语法中没有从check_coverage()中覆盖的单词替换为wildcard,然后用通配符解析这个句子

    • 这通常会降低解析器的准确度,除非您使用处理未知单词的语法专门训练PCFG,并且通配符是未知单词的超集。在
  • 返回到您的语法生成文件,在使用^{}创建学习PCFG之前,在终端生成中添加所有可能的单词

  • 将未知单词添加到pcfg语法中,然后重新规范化权重,为未知单词指定非常小的权重(您也可以尝试更智能的平滑/插值技术)

因为这是一个家庭作业问题,我不会用完整的代码给出答案。但上述暗示应该足以解决问题。在

相关问题 更多 >

    热门问题