如何在spaCy中实现作者姓名匹配模式的重复匹配
解决spaCy作者姓名模式重复匹配的问题
要实现整个模式序列的重复匹配,你可以把需要重复的子模式打包成一个带pattern和OP参数的字典,用"OP": "+"指定这个子模式重复一次或多次。
另外你原来的模式可以优化下:把标点限制为逗号或分号,避免匹配到无关标点。调整后的完整代码示例如下:
import spacy from spacy.matcher import Matcher nlp = spacy.load("en_core_web_sm") matcher = Matcher(nlp.vocab) # 定义单个作者+分隔符的子模式:姓 + 名 + 逗号/分号 author_subpattern = [ {"IS_ALPHA": True}, {"IS_ALPHA": True}, {"ORTH": [",", ";"]} ] # 将子模式包装为可重复组,OP="+"表示匹配1次或多次 repeatable_pattern = [{"pattern": author_subpattern, "OP": "+"}] # 补充匹配最后一个不带分隔符的作者 final_author = [{"IS_ALPHA": True}, {"IS_ALPHA": True}] # 组合成完整的作者列表匹配模式 full_author_pattern = repeatable_pattern + [final_author] # 添加匹配规则 matcher.add("AUTHOR_LIST", [full_author_pattern]) # 测试示例文本 doc = nlp("Smith, John; Jones, Bob, Williams, Alice") matches = matcher(doc) for match_id, start, end in matches: print(f"匹配到的作者列表: {doc[start:end].text}")
- 用
{"pattern": 子模式, "OP": "+"}是spaCy实现整个序列重复匹配的核心方式,OP还可以设为*(0次或多次)、?(0次或1次),根据需求调整即可。 - 把标点限定为逗号和分号比单纯用
IS_PUNCT更精准,能避免误匹配句号、感叹号这类无关标点。 - 补充不带标点的作者模式,是因为实际文本里最后一个作者后面通常不会带分隔符,这样能覆盖更完整的场景。
内容的提问来源于stack exchange,提问作者Michael DeBellis
相关产品推荐
相关产品推荐

