ner.md 8.8 KB

📌 DistilBERT 在专利摘要 NER 任务中的数据标注作用及方法

🚀 为什么数据标注对 NER 任务重要?

在 命名实体识别(NER) 任务中,模型需要学习识别 专利摘要中的特定实体类别,如 技术术语、化学物质、专利申请人 等。 数据标注的核心作用:

1.  提供监督信号:DistilBERT 是基于有监督学习训练的,需要标注数据才能学习正确的实体边界和分类。
2.  提高模型泛化能力:高质量标注数据可以减少误分类,提高模型在未见专利上的泛化能力。
3.  适应专利领域术语:专利摘要包含行业专有术语,需要准确标注以提高领域适配性。

📌 1. 数据标注格式

在 NER 任务中,最常用的标注格式有 BIO(Begin-Inside-Outside) 或 BILOU:

•   BIO(常用):

"本发明涉及一种环氧树脂制备方法。" ["O", "O", "O", "O", "B-MAT", "I-MAT", "B-TECH", "I-TECH", "I-TECH", "O"]

•   B-MAT = 材料(Material)的开始
•   I-MAT = 材料的中间部分
•   B-TECH = 技术(Technology)的开始
•   I-TECH = 技术的中间部分
•   O = 不是实体的词

•   BILOU(更精细化):

["O", "O", "O", "O", "B-MAT", "L-MAT", "B-TECH", "I-TECH", "L-TECH", "O"]

•   B = 实体的 开头
•   I = 实体的 中间
•   L = 实体的 结尾
•   O = 非实体

✅ 推荐使用 BIO,适用于 DistilBERT 训练。

📌 2. 如何对专利摘要进行标注?

✅ (1) 手动标注(适用于小规模数据)

使用工具 Label Studio、Prodigy 或 doccano 进行人工标注。

示例

本发明涉及一种环氧树脂制备方法。

人工标注:

{

"text": "本发明涉及一种环氧树脂制备方法。",
"entities": [
    {"start": 4, "end": 8, "label": "MAT"},  # "环氧树脂" 标注为材料
    {"start": 9, "end": 13, "label": "TECH"}  # "制备方法" 标注为技术
]

}

✅ (2) 规则匹配 + 词典扩充(适用于大规模数据)

对于大规模专利数据,可利用 规则匹配 + 术语词典 进行半自动标注:

import re

术语词典

materials = ["环氧树脂", "聚乙烯", "碳纳米管"] technologies = ["制备方法", "合成工艺", "涂层技术"]

def annotate_text(text):

annotations = []

# 标注材料
for mat in materials:
    for match in re.finditer(mat, text):
        annotations.append({"start": match.start(), "end": match.end(), "label": "MAT"})

# 标注技术
for tech in technologies:
    for match in re.finditer(tech, text):
        annotations.append({"start": match.start(), "end": match.end(), "label": "TECH"})

return {"text": text, "entities": annotations}

测试

text = "本发明涉及一种环氧树脂制备方法。" print(annotate_text(text))

✅ 适用于 大规模专利数据,可减少人工标注成本。

📌 3. 训练 DistilBERT 进行 NER

✅ (1) 加载 DistilBERT

from transformers import AutoTokenizer, AutoModelForTokenClassification

加载预训练的 DistilBERT 模型

model_name = "distilbert-base-multilingual-cased" tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForTokenClassification.from_pretrained(model_name, num_labels=7)

✅ (2) 处理数据集(BIO 格式)

from torch.utils.data import Dataset

训练数据示例

train_texts = ["本发明涉及一种环氧树脂制备方法。"] train_labels = [["O", "O", "O", "O", "B-MAT", "I-MAT", "B-TECH", "I-TECH", "I-TECH", "O"]]

class PatentNERDataset(Dataset):

def __init__(self, texts, labels, tokenizer, max_length=128):
    self.texts = texts
    self.labels = labels
    self.tokenizer = tokenizer
    self.max_length = max_length

def __len__(self):
    return len(self.texts)

def __getitem__(self, idx):
    text = self.texts[idx]
    labels = self.labels[idx]

    encoding = self.tokenizer(text, truncation=True, padding="max_length", max_length=self.max_length, return_tensors="pt")
    input_ids = encoding["input_ids"].squeeze()
    attention_mask = encoding["attention_mask"].squeeze()

    # 转换标签
    label_map = {"O": 0, "B-MAT": 1, "I-MAT": 2, "B-TECH": 3, "I-TECH": 4}
    label_ids = [label_map[label] for label in labels] + [0] * (self.max_length - len(labels))

    return {"input_ids": input_ids, "attention_mask": attention_mask, "labels": torch.tensor(label_ids)}

创建数据集

dataset = PatentNERDataset(train_texts, train_labels, tokenizer)

✅ (3) 训练 DistilBERT 进行 NER

import torch from torch.utils.data import DataLoader from transformers import AdamW

训练参数

device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model.to(device) optimizer = AdamW(model.parameters(), lr=5e-5) train_loader = DataLoader(dataset, batch_size=2, shuffle=True)

训练循环

for epoch in range(3):

for batch in train_loader:
    optimizer.zero_grad()
    input_ids, attention_mask, labels = batch["input_ids"].to(device), batch["attention_mask"].to(device), batch["labels"].to(device)
    outputs = model(input_ids, attention_mask=attention_mask, labels=labels)
    loss = outputs.loss
    loss.backward()
    optimizer.step()
    print(f"Epoch {epoch}, Loss: {loss.item()}")

✅ 使用 DistilBERT 进行高效训练,减少计算资源消耗。

📌 4. 总结

步骤 方法 作用 数据标注 手动(Label Studio)或 半自动(正则匹配+词典) 生成高质量 BIO 格式数据 数据格式 BIO 格式 适用于 Transformer 训练 模型选择 DistilBERT 速度快 60%,适用于大规模推理 训练方式 PyTorch + AdamW 适用于 GPU 训练

📌 5. 下一步

•   是否需要优化数据标注流程(如自动化 NER 标注)?
•   是否需要优化推理速度(如 ONNX 加速 DistilBERT)?
•   是否需要进一步扩展到超大规模专利数据?

🚀 我可以帮助你优化专利 NER 任务! 🚀

命名实体分类

在建筑行业的 命名实体识别(NER) 任务中,常见的实体类别通常可以分为以下几大类:

  1. 材料(Material)

指用于建筑施工的各种原材料和成品材料。 示例:

•   混凝土、钢筋、水泥、砖块、砂石、玻璃、铝合金
•   复合材料、保温材料、木材、防水涂料
  1. 施工技术(Construction Technique)

指在建筑过程中使用的施工方法、工艺和技术。 示例:

•   预制装配式、现浇混凝土、钢结构施工、深基坑支护
•   高性能混凝土技术、BIM(建筑信息建模)、3D 打印建筑
  1. 设备与机械(Equipment & Machinery)

指施工现场使用的各类设备、工具和机械。 示例:

•   塔吊、挖掘机、起重机、打桩机、搅拌站
•   模板支撑系统、脚手架、电焊机、喷涂设备
  1. 建筑结构(Building Structure)

指建筑物的结构类型和组成部分。 示例:

•   框架结构、剪力墙结构、装配式结构、钢结构
•   基础、梁、柱、板、楼梯、屋顶
  1. 建筑功能(Building Function)

指建筑的用途和功能类型。 示例:

•   住宅、商业综合体、写字楼、医院、学校、机场、地铁站
•   绿色建筑、被动房、智能建筑
  1. 规范与标准(Regulations & Standards)

指建筑行业相关的法律法规、设计标准和施工规范。 示例:

•   《建筑设计防火规范》(GB50016)、《混凝土结构设计规范》(GB50010)
•   LEED(绿色建筑认证)、BREEAM、ISO 9001
  1. 施工单位与角色(Organizations & Roles)

指建筑项目中涉及的公司、机构和人员角色。 示例:

•   建设单位、总承包商、分包商、监理单位、设计院
•   施工员、项目经理、安全员、造价工程师、监理工程师
  1. 施工阶段(Construction Phase)

指建筑项目的各个施工环节。 示例:

•   设计阶段、基础施工、主体结构施工、机电安装、装修阶段
•   竣工验收、交付运营
  1. 建筑风险与安全(Risk & Safety)

指建筑施工中的安全隐患、事故类型和安全防护措施。 示例:

•   高空坠落、模板塌陷、起重伤害、触电事故
•   安全帽、安全网、消防喷淋、应急预案

总结

类别 典型示例 材料(Material) 混凝土、钢筋、玻璃、保温材料 施工技术(Technique) 预制装配、BIM、3D 打印建筑 设备与机械(Equipment) 塔吊、挖掘机、脚手架 建筑结构(Structure) 框架结构、剪力墙、屋顶 建筑功能(Function) 住宅、医院、地铁站 规范与标准(Regulations) GB50016、LEED、ISO 9001 施工单位与角色(Roles) 施工员、监理单位、总承包商 施工阶段(Phase) 设计、基础施工、竣工验收 建筑风险与安全(Safety) 高空坠落、触电事故、安全帽

如果你要做 建筑行业的命名实体识别(NER),可以基于这些类别构建标注体系,并训练模型来自动提取相关实体! 🚀