Python 具有枚举语义的NLTK语法

Python 具有枚举语义的NLTK语法,python,nltk,grammar,enumeration,semantics,Python,Nltk,Grammar,Enumeration,Semantics,信息和代码 让Grammar.cfg作为我的语法文件(注释以获取信息): 如果我这样做,结果会是eat(john) 问题 如果我想在我的句子中支持枚举(并提取其语义),我将如何进行,例如: 约翰、鲍勃和萨姆吃饭 考虑到所有的单词都会出现在语法中。 我在找类似这样的东西: GN[SEM=]->NP[SEM=?s1]NP[SEM=?s2]。。。NP[SEM=?sn] 要进行类似的分析,请执行以下操作: eat(list(约翰、鲍勃、山姆))或go(鲍勃、list(加拿大、美国、墨西哥、法国)) 我知

信息和代码

让Grammar.cfg作为我的语法文件(注释以获取信息):

如果我这样做,结果会是
eat(john)

问题

如果我想在我的句子中支持枚举(并提取其语义),我将如何进行,例如:

约翰、鲍勃和萨姆吃饭

考虑到所有的单词都会出现在语法中。 我在找类似这样的东西:

GN[SEM=]->NP[SEM=?s1]NP[SEM=?s2]。。。NP[SEM=?sn]

要进行类似的分析,请执行以下操作:

eat(list(约翰、鲍勃、山姆))
go(鲍勃、list(加拿大、美国、墨西哥、法国))

我知道连续的
NP[SEM=?s]
组将使用递归模式进行处理,这只是为了说明我试图实现的目标

// Rules
S[SEM = <app(?vp, ?suj)>] -> GN[SEM = ?suj] VP[SEM = ?vp] // This is the important line really.
GN[SEM = ?suj] -> NP[SEM = ?suj]
VP[SEM = ?v] -> V[SEM = ?v]
NP[SEM = ?n] -> Nprop[SEM = ?n]

// Words
Nprop[SEM = <john>] -> 'john'
V[SEM = <\x.eat (x)>] -> 'eats'
import nltk
from nltk import *

with open ("Grammar.cfg", "r") as myfile:
    grammarText = myfile.read()

grammar = grammar.FeatureGrammar.fromstring(grammarText)
parser = nltk.ChartParser(grammar)
stemmer = SnowballStemmer("english")

tokenizer = RegexpTokenizer(r'\w+')
tokens = tokenizer.tokenize("John eats.".lower())

stemmedTokens = []
for token in tokens:
    stemmedTokens.append(stemmer.stem(token))

parser = parse.FeatureEarleyChartParser(grammar)
trees = parser.parse(tokens)
for tree in trees:
    print(tree)
    nltk.draw.tree.draw_trees(tree)
    print(tree.label()['SEM'])