NLTK fcfg sem值很尴尬

时间:2015-03-15 03:50:11

标签: python nlp nltk context-free-grammar

我用于这句话的FCFG是

S[SEM=<?vp(?np)>] -> NP[NUM=?n, SEM=?np] VP[NUM=?n,SEM=?vp] 
VP[NUM=?n,SEM=<?v(?obj)>] -> TV[NUM=?n,SEM=?v] DET NP[SEM=?obj
NP[NUM=?n, SEM=?np] -> N[NUM=?n, SEM=?np] 
N[NUM=sg, SEM=<\P.P(I)>] -> 'I'
TV[NUM=sg,SEM=<\x y.(run(y,x))>] -> 'run'
DET -> "a"
N[NUM=sg, SEM=<\P.P(race)>] -> 'race'

我想解析句子&#34;我参加比赛&#34;当我用那句话时

sent = 'I run a race'
parser = load_parser('grammar.fcfg')

for tree in parser.parse(sent.split()):
    print (tree)

它为解析的句子返回一个非常难看的短语

S[SEM=<run(\P.P(I3),\P.P(race))>]

但是我希望代码返回

S[SEM=<run(I,race)>]

如何摆脱不属于那里的\P.P

2 个答案:

答案 0 :(得分:2)

这是名词的常规形式:

N[NUM=sg, SEM=<\x.race(x)>] -> 'race'

因此,例如,你可能有:

Det[NUM=sg, SEM=<\P.\Q.exists x.(P(x) & Q(x))>] -> 'a'
NP[NUM=?num, SEM=<?det(?n)>] -> Det[NUM=?num, SEM=?det] N[NUM=?num, SEM=?n]

这就是#34;一场比赛&#34;是:

\P.\Q.exists x.(P(x) & Q(x))(\x.race(x)) = \Q.exists x.(\y.race(y)(x) & Q(x)))
                                           \Q.exists x.(race(x) & Q(x)))

如果你有:

TV[NUM=sg, SEM=<\X.\y.X(\x.run(y,x))>] -> 'run'
VP[NUM=?num, SEM=<?tv(?obj)>] -> TV[NUM=?num, SEM=?tv] NP[NUM=?num, SEM=?obj]

所以&#34;参加比赛&#34;是:

\X.\y.X(\z.run(y,z))(\Q.exists x.(race(x) & Q(x))))
                                = \y.(\Q.exists x.(race(x) & Q(x)))(\z.run(y,z)))
                                = \y.exists x.(race(x) & \z.run(y,z)(x)))
                                = \y.exists x.(race(x) & run(y,x)))

然后你有:

NP[NUM=sg, SEM=<\P.P(I)>] -> 'I'
S[NUM=?num, SEM=<?subj(?vp)>] -> NP[NUM=?num, SEM=?subj] VP[NUM=?num, SEM=?vp] 

所以&#34;我参加比赛&#34;是:

\P.P(I)(\y.exists x.(race(x) & run(y,x)))) = \y.exists x.(race(x) & run(y,x)))(I)
                                           = exists x.(race(x) & run(I,x)))

查看this

答案 1 :(得分:0)

我的初始代码很尴尬并返回

的原因
S[SEM=<run(\P.P(I3),\P.P(race))>]

是因为提升类型。我和种族是不同类型的,我多次被抚养。这就是为什么有一个

\P.P(I3)

所以要解决这个问题,我需要成为一个不是更高类型的论点。