如何用Python SpaCy纯模式实现:匹配‘ptu’但排除‘ptu switch’?
解决方案
要实现匹配ptu但排除ptu switch搭配的需求,可借助SpaCy Matcher的否定属性约束和可选token规则,无需硬编码判断语句,纯通过匹配模式完成:
import spacy from spacy.matcher import Matcher nlp = spacy.load("en_core_web_sm") matcher = Matcher(nlp.vocab) # 定义两个模式,覆盖所有符合要求的场景 patterns = [ # 模式1:ptu是句子/片段的最后一个词(后面无其他token) [{"LOWER": "ptu"}, {"OP": "!"}], # 模式2:ptu后面跟随的token不是switch [{"LOWER": "ptu"}, {"LOWER": {"NOT_IN": ["switch"]}}] ] # 添加模式到匹配器 matcher.add("PTU_EXCLUDE_SWITCH", patterns) # 测试不同文本 test_cases = [ "ptu switch was replaced", "ptu was replaced", "check the ptu", "PTU test completed", "switch ptu" ] for text in test_cases: doc = nlp(text) matches = matcher(doc) print(f"文本: {text}") if matches: for match_id, start, end in matches: span = doc[start:end] print(f"匹配结果: {span.text}") else: print("无符合要求的匹配") print("---")
模式说明
- 模式1:
{"OP": "!"}表示该位置不存在任何token,确保单独出现的ptu(作为片段最后一个词)能被匹配。 - 模式2:
{"LOWER": {"NOT_IN": ["switch"]}}明确约束ptu后面的token不能是switch(大小写不敏感),覆盖ptu后跟其他词汇的场景。
运行效果
- 含
ptu switch的文本不会触发匹配 - 单独的
ptu或ptu后跟非switch词汇的文本会正常匹配
内容的提问来源于stack exchange,提问作者Hassan
相关产品推荐
相关产品推荐

