NLTK fcfg sem 值很别扭
NLTK fcfg sem value is awkward
我用于这句话的 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'
我想解析出句子"I run a race"以及我用那个句子的时候
sent = 'I run a race'
parser = load_parser('grammar.fcfg')
for tree in parser.parse(sent.split()):
print (tree)
它return对于解析后的句子来说是一个看起来很尴尬的短语
S[SEM=<run(\P.P(I3),\P.P(race))>]
但是我想要代码 return
S[SEM=<run(I,race)>]
如何摆脱不应该属于那里的 \P.P
?
这是名词的正常形式:
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]
所以"a race"是:
\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]
所以"run a race"是:
\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]
所以"I run a race"是:
\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。
我的初始代码笨拙的原因 returns
S[SEM=<run(\P.P(I3),\P.P(race))>]
是因为类型提升。 I 和 race 是不同类型的,我被多次抚养。这就是为什么有一个
\P.P(I3)
所以要解决这个问题,I 需要是一个参数而不是更高类型。
我用于这句话的 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'
我想解析出句子"I run a race"以及我用那个句子的时候
sent = 'I run a race'
parser = load_parser('grammar.fcfg')
for tree in parser.parse(sent.split()):
print (tree)
它return对于解析后的句子来说是一个看起来很尴尬的短语
S[SEM=<run(\P.P(I3),\P.P(race))>]
但是我想要代码 return
S[SEM=<run(I,race)>]
如何摆脱不应该属于那里的 \P.P
?
这是名词的正常形式:
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]
所以"a race"是:
\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]
所以"run a race"是:
\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]
所以"I run a race"是:
\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。
我的初始代码笨拙的原因 returns
S[SEM=<run(\P.P(I3),\P.P(race))>]
是因为类型提升。 I 和 race 是不同类型的,我被多次抚养。这就是为什么有一个
\P.P(I3)
所以要解决这个问题,I 需要是一个参数而不是更高类型。