使用LEMMA属性的spaCy PhraseMatcher部分场景匹配失败原因求解
问题原因
导致匹配结果不一致的核心问题有两个:
- 调用
matcher.add时参数格式错误:该方法的第二个参数要求传入Doc对象组成的列表,你直接传入了单个nlp('colorful')返回的Doc对象,spaCy会错误地将该Doc遍历为Token序列处理为匹配模式,这是匹配结果随机的核心诱因。 - 重复添加lemmatizer组件:
en_core_web_sm模型的默认pipeline已经内置了lemmatizer,手动再次添加会导致词形还原逻辑执行两次,部分场景下会出现词元计算异常。
之前text1可以匹配、text2匹配失败属于异常运行下的随机结果,和参数错误导致的模式偏移有关,和词元、词性标注结果无关。
修复方案
修正后的可运行代码如下:
import spacy nlp = spacy.load('en_core_web_sm') from spacy.matcher import PhraseMatcher matcher = PhraseMatcher(nlp.vocab, attr="LEMMA") # 将匹配模式放入列表中传入 matcher.add('colorful', [nlp('colorful')]) text1 = "this is the most colorful of the four pieces" text2 = "colorful and bold" text1_matches = matcher(nlp(text1)) text2_matches = matcher(nlp(text2))
修正后两个文本中的colorful都可以被正常匹配。
内容的提问来源于stack exchange,提问作者O Winn
相关产品推荐
相关产品推荐

