Spacy DependencyMatcher匹配无输出排查:提取名词关联动词形容词
问题原因及解决方法
错误根源
你运行后无返回的核心原因是依存匹配规则与测试句的实际依存结构不匹配:
你定义的规则要求名词target的直接子节点同时包含一个动词和一个形容词(REL_OP: ">"表示左节点是右节点的直接父节点),但你测试的句子the bag that I bought is really beautiful的依存结构如下:
- 动词
bought的依存标签是relcl(定语从句修饰),父节点确实是bag,这部分规则是符合的 - 形容词
beautiful是系动词is的表语,父节点是is,而is的主语才是bag,所以beautiful不是bag的直接子节点,这部分规则不满足,导致整个匹配失败
调试方法
你可以先打印句子中所有token的依存信息,方便对齐规则:
for token in doc: print(f"文本:{token.text}, 词性:{token.pos_}, 依存标签:{token.dep_}, 父节点:{token.head.text}")
修正后的匹配规则(适配当前测试句)
我们调整形容词的匹配逻辑,增加中间的系动词节点匹配,就能拿到你要的结果:
import spacy from spacy.matcher import DependencyMatcher nlp = spacy.load("en_core_web_sm") pattern = [ { "RIGHT_ID": "target", "RIGHT_ATTRS": {"POS": "NOUN"} }, # 匹配修饰名词的定语从句动词 { "LEFT_ID": "target", "REL_OP": ">", "RIGHT_ID": "verb", "RIGHT_ATTRS": {"POS": "VERB"} }, # 匹配名词的系动词父节点 { "LEFT_ID": "cop", "REL_OP": ">", "RIGHT_ID": "target", "RIGHT_ATTRS": {"POS": "NOUN"} }, # 匹配系动词的表语形容词 { "LEFT_ID": "cop", "REL_OP": ">", "RIGHT_ID": "adj", "RIGHT_ATTRS": {"POS": "ADJ"} } ] matcher = DependencyMatcher(nlp.vocab) matcher.add("FOUNDED", [pattern]) text = "the bag that I bought is really beautiful" doc = nlp(text) for match_id, (target, verb, cop, adj) in matcher(doc): print(doc[target], doc[verb], doc[adj])
运行后输出结果为:bag bought beautiful,符合你的预期。
通用场景优化建议
如果你需要适配更多场景的名词关联动形容词提取,可以灵活调整依存算子:
- 用
>>代替>表示左节点是右节点的任意祖先节点,不需要直接父子关系 - 用
<表示左节点是右节点的直接子节点 - 用
<<表示左节点是右节点的任意后代节点
内容的提问来源于stack exchange,提问作者lookers
相关产品推荐
相关产品推荐

