如何在NLTK特征语法(FCFG)中为一个特征添加多个值?
在NLTK特征语法中为特征设置多个可选值的方法
嘿,这个问题我熟!在NLTK的特征语法里,要让一个特征支持多个可选值(比如你说的TYPE可以是name、organisation、location任意一个),其实有几种很实用的实现方式,我给你一步步讲清楚:
1. 直接使用析取符号 |(最常用)
NLTK的FeatureGrammar原生支持用竖线|来分隔特征的多个可选值,语法上直接写成NP[TYPE=name|organisation|location]就可以。这种写法表示该特征可以匹配竖线分隔的任意一个值。
举个完整的代码示例:
from nltk import FeatureGrammar, ChartParser # 定义支持多可选TYPE值的特征语法 grammar = FeatureGrammar.fromstring(""" S -> NP[TYPE=name|organisation|location] VP # 为不同TYPE的NP定义具体规则 NP[TYPE=name] -> "Alice" | "Bob" NP[TYPE=organisation] -> "Google" | "NASA" NP[TYPE=location] -> "Paris" | "Tokyo" VP -> "works" | "is located" """) parser = ChartParser(grammar) # 测试不同TYPE的NP都能匹配规则 for tree in parser.parse("Alice works".split()): print(tree) for tree in parser.parse("NASA is located".split()): print(tree) for tree in parser.parse("Tokyo works".split()): print(tree)
运行这段代码你会发现,不管NP的TYPE是name、organisation还是location,都能成功匹配S的规则。
2. 通过特征统一复用规则(适合复杂场景)
如果你的语法规则较多,不想重复写析取值,可以先为每个TYPE单独定义NP规则,然后在高层规则中用变量来匹配任意合法的TYPE值:
grammar = FeatureGrammar.fromstring(""" # 高层规则匹配任意TYPE的NP S -> NP[TYPE=?x] VP # 单独定义每个TYPE的NP NP[TYPE=name] -> "Alice" NP[TYPE=organisation] -> "Google" NP[TYPE=location] -> "Paris" VP -> "works" """)
这里的?x是一个变量,会自动和前面定义的合法TYPE值(name/organisation/location)进行统一,效果和析取写法一致,适合规则更复杂的场景。
注意:区分“可选值”和“多值集合”
如果你是想让特征同时拥有多个值(而不是二选一),可以直接把Python的列表/集合作为特征值:
NP[TYPE=['name', 'organisation']]
但这和你需求的“取任意一个值”是不同的场景,别搞混啦~
内容的提问来源于stack exchange,提问作者Aman Gill
相关产品推荐
相关产品推荐

