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

使用Spacy的PhraseMatcher或EntityRuler构建嵌套分类体系

解决方法

ISO标签匹配失败的原因

ISO标签匹配失败由以下三个问题导致:

  • 规则语法错误:你编写的ISO匹配规则[{"TEXT": "4014"}, {"TEXT": "4014-8.8"}]表示要求连续出现两个对应值的token,你的样本中不存在该结构,你需要匹配的是「4014」「4014-8.8」这类独立的取值,应拆分为独立规则或者用OR逻辑。
  • 大小写匹配冲突:你处理输入时统一调用了.lower()转小写,但ISO规则使用TEXT属性匹配原大小写,完全无法匹配到小写后的内容,应替换为LOWER属性。
  • 分词适配问题:默认空白分词下,样本中的4014-8.8-Geomet会被识别为一个完整的token,要匹配其中的ISO编号片段,需要用正则匹配token内部的内容。

别名归一化实现

要把Hex、Hexa这类别名统一识别为Hexagon,只需要给不同的匹配规则指定相同的id值即可,ent_id_会直接返回归一化后的结果。

修改后的完整代码

import spacy
nlp = spacy.blank('en')

ruler = nlp.add_pipe("entity_ruler")
patterns = [
    # 材料类型规则
    {"label": "MAT_TYPE", "pattern": [{"LOWER": "screw"}], "id": "Screw"},
    {"label": "MAT_TYPE", "pattern": [{"LOWER": "bolt"}], "id": "Bolt"},
    {"label": "MAT_TYPE", "pattern": [{"LOWER": "washer"}], "id": "Washer"},
    # 头部类型规则,别名统一归一为Hexagon
    {"label": "HEAD_TYPE", "pattern": [{"LOWER": "hex"}], "id": "Hexagon"},
    {"label": "HEAD_TYPE", "pattern": [{"LOWER": "hexa"}], "id": "Hexagon"},
    {"label": "HEAD_TYPE", "pattern": [{"LOWER": "hexagon"}], "id": "Hexagon"},
    # ISO编号匹配规则
    {"label": "ISO", "pattern": [{"LOWER": {"REGEX": ".*4014.*"}}], "id": "4014"},
    {"label": "ISO", "pattern": [{"LOWER": {"REGEX": ".*4017-8.8.*"}}], "id": "4017"},
    {"label": "ISO", "pattern": [{"LOWER": {"REGEX": ".*7040.*"}}], "id": "7040"},
    # Geomet类型匹配规则
    {"label": "GEOMET_TYPE", "pattern": [{"LOWER": {"REGEX": ".*321a\+vl.*"}}], "id": "321A+VL"},
    {"label": "GEOMET_TYPE", "pattern": [{"LOWER": {"REGEX": ".*321a.*"}}], "id": "321A"},
    {"label": "GEOMET_TYPE", "pattern": [{"LOWER": {"REGEX": ".*500a.*"}}], "id": "500A"},
]
ruler.add_patterns(patterns)

with open('./sample_list.txt', 'r') as infile:
    data = infile.readlines()
    for i in data:
        i = i.strip()
        if not i:
            continue
        print(i)
        doc = nlp(i.lower())
        print([(ent.text, ent.label_, ent.ent_id_) for ent in doc.ents])

运行效果示例

针对样本Hexagon head bolt M12x90 ISO 4014-8.8-Geomet 321A+VL的输出为:

[('hexagon', 'HEAD_TYPE', 'Hexagon'), ('bolt', 'MAT_TYPE', 'Bolt'), ('4014-8.8-geomet', 'ISO', '4014'), ('321a+vl', 'GEOMET_TYPE', '321A+VL')]

如果需要提取更干净的匹配文本,可以调整正则的匹配范围,或者自定义分词规则拆分4014-8.8-Geomet为多个独立token。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 04:06:05