Spacy模式匹配中使用自定义扩展属性识别匹配Token问题咨询
问题根因
你当前的匹配逻辑存在顺序倒置:你定义的pattern要求匹配的Token已经预先被赋值了TYPE为ARRIVAL/DEPARTURE,但你初始化扩展属性时设置的默认值是空字符串,自然不存在符合匹配条件的Token,也就无法命中任何结果。你的实际需求应该是先匹配到符合特征的目标Token序列,再给对应位置的Token设置TYPE属性,而非反过来用还没赋值的属性做匹配条件。
基于spaCy Matcher的可行实现方案
第一步:调整匹配规则,先定位目标词汇序列
你可以先匹配「两个连续的专有名词+交通类名词」的典型句式结构,pattern定义如下:
import spacy from spacy.matcher import Matcher # 匹配规则:连续两个专有名词 + 交通方式名词 pattern = [ {"POS": "PROPN"}, # 第一个专有名词:出发地 {"POS": "PROPN"}, # 第二个专有名词:目的地 {"LOWER": {"in": ["train", "flight", "bus", "coach"]}} # 后置的交通方式标识词 ]
第二步:初始化Matcher和自定义属性
# 加载英文模型 nlp = spacy.load("en_core_web_sm") # 注册自定义TYPE扩展属性 Token.set_extension('TYPE', default="", force=True) # 初始化Matcher并添加规则 matcher = Matcher(nlp.vocab) matcher.add("ROUTE_EXTRACT", [pattern])
第三步:匹配后给对应Token赋值属性
doc = nlp("I would like a London Paris train") matches = matcher(doc) for match_id, start, end in matches: # 第一个专有名词设为出发地 doc[start]._.TYPE = "DEPARTURE" # 第二个专有名词设为目的地 doc[start+1]._.TYPE = "ARRIVAL" # 验证结果 print(f"{doc[4].text}: {doc[4]._.TYPE}") # 输出 London: DEPARTURE print(f"{doc[5].text}: {doc[5]._.TYPE}") # 输出 Paris: ARRIVAL
多场景适配优化
如果你的输入还包含from A to B这类句式,可以同时添加多套匹配规则适配不同表达:
- 匹配
from [出发地] to [目的地]结构的规则示例:
pattern_from_to = [ {"LOWER": "from"}, {"POS": "PROPN"}, {"LOWER": "to"}, {"POS": "PROPN"} ]
匹配到后通过索引定位出发地和目的地的位置,再赋值TYPE属性即可覆盖更多输入场景。
内容的提问来源于stack exchange,提问作者asa
相关产品推荐
相关产品推荐

