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

