加载和编辑cfg文件以进行语法分析

时间:2019-04-20 06:20:06

标签: python parsing nlp nltk

我正在执行此处提到的步骤-http://www.nltk.org/book/ch10.html 使用cfg文件加载和解析数据。当我使用下面的代码时,我不会遇到任何问题。

cp = load_parser('grammars/book_grammars/sql0.fcfg')
query = 'What cities are located in China'
trees = list(cp.parse(query.split()))
answer = trees[0].label()['SEM']
answer = [s for s in answer if s]
q = ' '.join(answer)
print(q)

我想做的是取出sql0.fcfg,对其进行更改,然后再次将其加载到解析器中,以使用我自己的语句对其进行测试。我就是在这里遇到问题的。

我将sql0.fcg文件的内容复制到一个txt文件中,该文件存储在本地系统中,并将其重命名为.cfg,但是当我像下面那样对其进行解析时,出现了一个错误,提示nltk.download('C:' )。

cp = load_parser('C:/Users/212757677/Desktop/mygrammar.fcfg')

我尝试的第二种方法是从fcfg文件复制语法,并尝试以以下方式加载它。在这里,我收到一条错误消息:“无法解析第2行。期望的箭头”

import nltk
groucho_grammar = nltk.CFG.fromstring("""
S[SEM=(?np + WHERE + ?vp)] -> NP[SEM=?np] VP[SEM=?vp]
VP[SEM=(?v + ?pp)] -> IV[SEM=?v] PP[SEM=?pp]
VP[SEM=(?v + ?ap)] -> IV[SEM=?v] AP[SEM=?ap]
NP[SEM=(?det + ?n)] -> Det[SEM=?det] N[SEM=?n]
PP[SEM=(?p + ?np)] -> P[SEM=?p] NP[SEM=?np]
AP[SEM=?pp] -> A[SEM=?a] PP[SEM=?pp]
NP[SEM='Country="greece"'] -> 'Greece'
NP[SEM='Country="china"'] -> 'China'
Det[SEM='SELECT'] -> 'Which' | 'What'
N[SEM='City FROM city_table'] -> 'cities'
IV[SEM=''] -> 'are'
A[SEM=''] -> 'located'
P[SEM=''] -> 'in'
""")
cp = load_parser(groucho_grammar)
query = 'What cities are located in China'
trees = list(cp.parse(query.split()))
answer = trees[0].label()['SEM']
answer = [s for s in answer if s]
q = ' '.join(answer)
print(q)

ValueError: Unable to parse line 2: S[SEM=(?np + WHERE + ?vp)] -> NP[SEM=?np] VP[SEM=?vp]
Expected an arrow

我只想在sql0.fcfg中编辑现有语法并对其进行解析。有人可以建议如何解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

nltk.load_parser的原型是

  

nltk.load_parser(grammar_url, trace=0, parser=None, chart_class=None, beam_size=0, **load_args)

请注意,第一个参数是一个“ url”,而不仅仅是文件路径(有关非常简短的说明,请参见the data Module documentation)。 nltk URL以协议开头,后跟冒号,因此它将C:解释为协议。您可能应该明确:file:C:/Users/212757677/Desktop/mygrammar.fcfg。 (或者也许是file:///C:/Users/212757677/Desktop/mygrammar.fcfg -我没有Windows计算机可以对其进行测试。)

nltk.load_parser根据文件名扩展名猜测语法格式。在这种情况下,您正在加载要素语法(.fcfg),而不是简单的CFG。如果要手动创建解析器,则应遵循NLTK how-to on feature grammar parsing中的示例。