Spacy规则匹配意外匹配到‘I’,如何排除该无关匹配?
解决Spacy规则匹配中出现无关"I"匹配的问题
问题原因
你的代码里缺少了Matcher实例的初始化步骤,如果是在交互式环境(比如Jupyter Notebook、Python shell)中运行,会复用之前会话里残留的matcher对象——这个旧对象里可能包含了匹配单个"I"的规则,才导致出现无关匹配。
修正后的完整代码
添加matcher = Matcher(nlp.vocab)创建全新的Matcher实例,就能得到预期的匹配结果:
import spacy from spacy.matcher import Matcher nlp = spacy.load("en_core_web_md") # 初始化Matcher实例,这一步不能少! matcher = Matcher(nlp.vocab) doc = nlp("Good morning, I'm here. I'll say good evening!!") pattern = [{"LOWER": "good"},{"LOWER": {"IN": ["morning", "evening"]}},{"IS_PUNCT": True}] matcher.add("greetings", [pattern]) matches = matcher(doc) for mid, start, end in matches: print(start, end, doc[start:end])
优化(可选)
如果想匹配带多个标点的问候语(比如示例里的good evening!!),可以把标点规则改成匹配一个或多个标点,调整后的pattern如下:
pattern = [ {"LOWER": "good"}, {"LOWER": {"IN": ["morning", "evening"]}}, {"IS_PUNCT": True, "OP": "+"} # "+"表示匹配1次或多次 ]
这样就能完整匹配good evening!!(输出10 14 good evening!!)。
内容的提问来源于stack exchange,提问作者Aureon
相关产品推荐
相关产品推荐

