You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在spaCy Matcher中匹配含撇号的词汇(如doctor's)

解决spaCy Matcher匹配含撇号词汇的问题

问题出在spaCy的分词逻辑上:对于doctor's这类带撇号的词汇,默认的英文模型(比如en_core_web_sm)会把's作为一个单独的token,而不是拆成撇号(标点)+字母s两个token。你之前用IS_PUNCT: True匹配单独的撇号,自然找不到对应结果。

步骤1:先确认分词结果

先打印文本的分词细节,明确每个token的内容和属性:

import spacy
from spacy.matcher import Matcher

nlp = spacy.load("en_core_web_sm")
doc = nlp("The doctor's office is closed.")

for token in doc:
    print(f"文本: {token.text}, 是否标点: {token.is_punct}, 小写形式: {token.lower_}")

运行后你会看到doctor's被拆成两个token:doctor和's,其中's的is_punct属性是False——因为它被识别为收缩形式的词汇,而非单纯标点。

步骤2:调整Matcher规则匹配实际token

根据分词结果,修改匹配规则,直接匹配's这个token:

# 初始化Matcher
matcher = Matcher(nlp.vocab)

# 定义匹配规则:匹配"doctor" + "'s"
pattern = [
    {"LOWER": "doctor"},
    {"TEXT": "'s"}  # 也可以用{"LOWER": "'s"},根据需求选择
]

matcher.add("DOCTOR_POSSESSIVE", [pattern])
matches = matcher(doc)

# 输出匹配结果
for match_id, start, end in matches:
    span = doc[start:end]
    print(f"匹配到: {span.text}")

运行这段代码就能成功匹配到doctor's。

额外说明

如果需要匹配任意名词加's的所有所有格形式,可以把规则改成更通用的版本:

pattern = [
    {"POS": "NOUN"},  # 匹配任意名词
    {"TEXT": "'s"}
]

内容的提问来源于stack exchange,提问作者Quinten

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 04:19:59