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

如何使用Spacy Matcher匹配含双连字符的复合词?

解决Spacy Matcher匹配双连字符词汇的问题

问题出在Spacy的分词逻辑上:当处理nice-word-also这类双连字符词汇时,它会被拆成5个独立token:nice、-、word、-、also。你之前的匹配pattern只加了一个{"IS_PUNCT": True},漏掉了第二个连字符的匹配项,所以无法成功匹配。

修正后的代码

只需在pattern里补充第二个标点匹配项即可:

import spacy
from spacy.matcher import Matcher

nlp = spacy.load("en_core_web_sm")
matcher = Matcher(nlp.vocab)
# 补充第二个{"IS_PUNCT": True}匹配第二个连字符
pattern = [{"LOWER": "nice"}, {"IS_PUNCT": True}, {"LOWER": "word"}, {"IS_PUNCT": True}, {"LOWER": "also"}]
matcher.add("nice-word-also", [pattern])

doc = nlp("This is a nice-word-also? Why is this a nice word")
matches = matcher(doc)
for match_id, start, end in matches:
    string_id = nlp.vocab.strings[match_id]  
    span = doc[start:end] 
    print(match_id, string_id, start, end, span.text)

输出结果

3367763786334420497 nice-word-also 3 8 nice-word-also

通用技巧(可选)

如果需要匹配任意数量连字符连接的同类词汇,可以用Spacy Matcher的量词语法。比如要匹配nice-xxx-xxx这类结构,可写成:

pattern = [
    {"LOWER": "nice"},
    {"IS_PUNCT": True, "OP": "+"},  # 匹配至少一个连字符
    {"LOWER": {"IN": ["word", "also", "test"]}, "OP": "+"}  # 匹配至少一个指定词汇
]

不过这种方式会匹配更宽泛的内容,根据你的实际需求调整即可。

内容的提问来源于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:00:20