如何用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
相关产品推荐
相关产品推荐

