以下代码是针对Python的NLTK的上下文无关语法。
%start S
#Feature based context-free grammar
#Base start is sentence
S[SEM=<?vp(?np)>] -> NP[NUM=?n, SEM=?np] VP[NUM=?n,SEM=?vp]
#Verb phrase expansion products
VP[NUM=?n,SEM=?v] -> LV[NUM=?n] NP[SEM=?v]
VP[NUM=?n,SEM=<?v(?obj)>] -> TV[NUM=?n,SEM=?v] NP[SEM=?obj]
#Noun phrase expansion products
NP[SEM=<?conj(?np1,?np2)>] -> NP[SEM=?np1] CC[SEM=?conj] NP[SEM=?np2]
NP[NUM=?n] -> Ger N[NUM=?n]
NP[NUM=?n, SEM=?np] -> N[NUM=?n, SEM=?np]
NP[NUM=?n, SEM=<?adj(?np)>] -> ADJ[SEM=?adj] N[NUM=?n, SEM=?np]
#Following expansion is shorthand for substantive adjective
NP[SEM=?np] -> Adj[SEM=?np]
#Lexical productions
Ger -> 'smoking'
N[NUM=sg, SEM=<\P.P(cocaine)>] -> 'gum'
N[NUM=sg, SEM=<\P.P(sh$%)>] -> 'bad'
LV[NUM=sg] -> 'is'
LV[NUM=pl] -> 'are'
ADJ[SEM=<\x.pretty(x)>] -> 'pretty'
此代码成功解析句子&#34;口香糖是坏的&#34;并且&#34;牙龈很漂亮&#34;但我想要做的就是解析句子&#34;口香糖很糟糕&#34;。它无法解析这句话,我无法弄清楚原因。我觉得这是由于
NP[NUM=?n, SEM=<?adj(?np)>] -> ADJ[SEM=?adj] N[NUM=?n, SEM=?np]
答案 0 :(得分:0)
不确定你的问题在这里。我将你的语法粘贴到SOgrammar.fcfg
代码:
from nltk import load_parser
cp = load_parser('SOgrammar.fcfg')
sentences = ['gum is pretty', 'gum is bad', 'gum is pretty bad']
for sentence in sentences:
tokens = sentence.split()
print("tokens:", tokens)
for tree in cp.parse(tokens):
print("tree;", tree)
输出:
tokens: ['gum', 'is', 'pretty']
tokens: ['gum', 'is', 'bad']
tree; (S[SEM=<sh$%(cocaine)>]
(NP[NUM='sg', SEM=<\P.P(cocaine)>]
(N[NUM='sg', SEM=<\P.P(cocaine)>] gum))
(VP[NUM='sg', SEM=<\P.P(sh$%)>]
(LV[NUM='sg'] is)
(NP[NUM='sg', SEM=<\P.P(sh$%)>]
(N[NUM='sg', SEM=<\P.P(sh$%)>] bad))))
tokens: ['gum', 'is', 'pretty', 'bad']
tree; (S[SEM=<pretty(\P.P(sh$%),\P.P(cocaine))>]
(NP[NUM='sg', SEM=<\P.P(cocaine)>]
(N[NUM='sg', SEM=<\P.P(cocaine)>] gum))
(VP[NUM='sg', SEM=<pretty(\P.P(sh$%))>]
(LV[NUM='sg'] is)
(NP[NUM='sg', SEM=<pretty(\P.P(sh$%))>]
(ADJ[SEM=<\x.pretty(x)>] pretty)
(N[NUM='sg', SEM=<\P.P(sh$%)>] bad))))
解析'口香糖是非常糟糕'。 它没有解析'口香糖很漂亮',因为漂亮被定义为形容词。根据你的语法,NP不能仅仅由形容词组成。
补充评论;从语言学的角度来看,“漂亮”并不是一个形容词。而'坏'并不是真正的名词。根据你想要实现的目标,这可能并不重要(如果你的语法/领域真的很小),但是当你开始编写更大的语法时,坚持使用更多/更好的单词类型是个好主意语言动机。