Python 具有枚举语义的NLTK语法
信息和代码 让Grammar.cfg作为我的语法文件(注释以获取信息): 如果我这样做,结果会是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(加拿大、美国、墨西哥、法国)) 我知
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'])