nltk 语义解析与协调

nltk semantic parsing with coordination

我正在尝试使用 python 的 NLTK 库并遵循 Neo-Davidsonian 事件表示来构建语义解析器。我已经建立了我的语法以包含可以正确解析的语义特征,但我正在努力处理协调的成分。例如,我的语法有:

PropN[SEM=<\P.P(Mary)>] -> 'Mary'
PropN[SEM=<\P.P(John)>] -> 'John'

IV[SEM=<\x.exists e.(drinks(e) & drinker(e, x))>] -> 'drinks'

NP[SEM=?np] -> PropN[SEM=?np]
VP[SEM=?v] -> IV[SEM=?v]
S[SEM=<?subj(?vp)>] -> NP[SEM=?subj] VP[SEM=?vp]

所以如果句子是 "John drinks",结果是:

exists e.(drinks(e) & drinker(e,John)).

但是如果我添加如下规则:

NP[SEM=<?p | ?q>] -> PropN[SEM=?p] CONJ PropN[SEM=?q]

如 "John or Mary",我最终得到这个:

(\P.P(John) | \P.P(Mary))(\x.exists e.(drinks(e) & drinker(e,x)))  

如,NP lambdas 没有被传递到动词的参数中。我试着环顾四周,但关于 nltk 语义解析协调的信息很少,更不用说将它与 lambdas 一起使用了。我知道这是可能的,因为一个同学显然得到了他的工作,但我不确定是什么把戏。

以防万一人们以后发现这个,我能够设置我的规则来为协调结构传递正确的 lambda 值:

NP[SEM=<?conj(?p, ?q)>] -> N[SEM=?p] CONJ[SEM=?conj] N[SEM=?q]
CONJ[SEM=<\Q \P \x.(Q(x) | P(x))>] -> 'or'

这应该适用于 NPs 和 VPs with lambdas。