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

如何用Python SpaCy Pattern基于子串标记完整单词为UNIT实体?

解决SpaCy中基于子串匹配标记UNIT实体的问题

你之前用lemma匹配liter无法命中kiloliters,核心原因是**kiloliters的lemma是kiloliter,和liter并非同一基本形式**,所以直接匹配lemma行不通。

以下是两种可行的解决方案:

方案1:使用正则匹配文本子串

通过TEXT属性的REGEX规则,匹配包含目标子串的单词(支持不区分大小写):

import spacy
from spacy.matcher import Matcher

nlp = spacy.load("en_core_web_sm")

# 定义UNIT实体的匹配模式
terms = [
    {
        "ent": "UNIT",
        "patterns": [
            [{"TEXT": {"REGEX": r".*liter.*"}}]  # 匹配任意包含liter的单词,不区分大小写
        ]
    }
]

# 初始化Matcher并加载模式
matcher = Matcher(nlp.vocab)
for term in terms:
    matcher.add(term["ent"], term["patterns"])

text = "There were 46 kiloliters of juice available"
doc = nlp(text)

# 执行匹配并输出结果
matches = matcher(doc)
for match_id, start, end in matches:
    entity_label = nlp.vocab.strings[match_id]
    print(f"匹配到实体: {doc[start:end].text},类型: {entity_label}")

方案2:使用小写文本包含匹配

如果不需要正则的复杂规则,直接用LOWER属性的CONTAINS条件,匹配小写形式包含目标子串的单词:

terms = [
    {
        "ent": "UNIT",
        "patterns": [
            [{"LOWER": {"CONTAINS": "liter"}}]
        ]
    }
]

这种方式更简洁,自动忽略大小写差异,能匹配kiloliters、Milliliters等各种大小写变体。

如果需要更精准的匹配(比如只匹配以liter结尾的单位),可以调整正则为r".*liter(s)?$",这样既能匹配单数的kiloliter,也能匹配复数的kiloliters。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 20:15:12