Spacy Matcher无法匹配句点前Google I/O实体问题求助
问题根源
- 你使用的Matcher默认开启了贪婪匹配策略(
greedy="LONGEST"),该策略会优先保留最长的匹配序列,搭配模式末尾带OP="?"的可选规则时,会出现非重叠匹配的遗漏问题。 - 第二个测试场景匹配正常,是因为你用的是固定长度的模式,没有可选量词,不会触发贪婪匹配的过滤逻辑。
排查步骤
你可以先执行以下代码打印分词结果,确认所有Google I/O的分词都符合你模式中定义的Google、I、/、O4个独立token:
for idx, tok in enumerate(doc): print(idx, tok.text, tok.is_punct)
解决方案
方案1:关闭贪婪匹配
修改matcher.add的参数,关闭贪婪匹配即可匹配所有符合规则的序列:
matcher.add("Google", pattern, on_match = add_event_ent, greedy=None)
修改后会同时匹配带结尾标点和不带结尾标点的Google I/O。
方案2:简化匹配模式
如果你实际要提取的实体不包含后面的标点,可以直接去掉末尾的可选标点规则,使用固定长度的模式:
pattern = [[ {"TEXT": "Google"}, {"TEXT": "I"}, {"TEXT": "/"}, {"TEXT": "O"} ]]
该方案同样可以匹配到全部3处Google I/O实体。
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

