📌 BIO 标注格式:规则与具体做法 BIO(Begin-Inside-Outside)是一种用于**命名实体识别(NER)**任务的标注格式,广泛应用于 BERT、DistilBERT、SpanMarker、CRF 等模型的训练数据中。 📌 1. 什么是 BIO 标注格式? BIO 格式由三种标签组成: • B-(Begin) → 实体的开始(如 “环氧树脂” 中的 “环”) • I-(Inside) → 实体的内部(如 “环氧树脂” 中的 “氧树脂”) • O-(Outside) → 非实体的词 示例(识别“材料(MAT)”和“技术(TECH)”): 本 发 明 涉 及 一 种 环 氧 树 脂 制 备 方 法 。 O O O O O O O B-MAT I-MAT I-MAT I-MAT B-TECH I-TECH I-TECH I-TECH O 📌 2. BIO 规则 1. 实体开头必须是 B-(Begin) • 正确 ✅:["B-MAT", "I-MAT", "I-MAT"](“环氧树脂”) • 错误 ❌:["I-MAT", "I-MAT"](不能以 I- 开头) 2. 实体内部必须是 I-(Inside) • 正确 ✅:["B-TECH", "I-TECH", "I-TECH"](“制备方法”) • 错误 ❌:["B-TECH", "B-TECH", "I-TECH"](不连续的 B-) 3. 实体间可有 O(Outside) • 正确 ✅: ["B-MAT", "I-MAT", "I-MAT", "O", "B-TECH", "I-TECH"] • 错误 ❌: ["B-MAT", "I-MAT", "I-MAT", "I-TECH", "B-TECH"] (I-TECH 不能跟在 I-MAT 后面) 📌 3. BIO 标注具体做法 ✅ (1) 手动标注 使用 Label Studio、Prodigy、doccano 进行人工标注: • 输入: 本发明涉及一种环氧树脂制备方法。 • 标注结果: { "text": "本发明涉及一种环氧树脂制备方法。", "entities": [ {"start": 7, "end": 11, "label": "MAT"}, # "环氧树脂" {"start": 12, "end": 16, "label": "TECH"} # "制备方法" ] } ✅ (2) 规则匹配自动标注(适用于大规模数据) import re # 术语词典 materials = ["环氧树脂", "聚乙烯", "碳纳米管"] technologies = ["制备方法", "合成工艺", "涂层技术"] def annotate_bio(text): tokens = list(text) # 将文本按字拆分 labels = ["O"] * len(tokens) # 标注材料(MAT) for mat in materials: for match in re.finditer(mat, text): start, end = match.start(), match.end() labels[start] = "B-MAT" for i in range(start + 1, end): labels[i] = "I-MAT" # 标注技术(TECH) for tech in technologies: for match in re.finditer(tech, text): start, end = match.start(), match.end() labels[start] = "B-TECH" for i in range(start + 1, end): labels[i] = "I-TECH" return list(zip(tokens, labels)) # 测试 text = "本发明涉及一种环氧树脂制备方法。" for token, label in annotate_bio(text): print(token, label) ✅ 适用于大规模专利数据,可减少人工标注成本 🚀 ✅ (3) 转换为 BERT 训练格式 BERT/DistilBERT 需要 token_id + BIO 标签: from transformers import BertTokenizerFast # 加载 BERT Tokenizer tokenizer = BertTokenizerFast.from_pretrained("distilbert-base-multilingual-cased") # 示例文本 text = "本发明涉及一种环氧树脂制备方法。" labels = ["O", "O", "O", "O", "O", "O", "O", "B-MAT", "I-MAT", "I-MAT", "I-MAT", "B-TECH", "I-TECH", "I-TECH", "I-TECH", "O"] # 进行分词 encoding = tokenizer(text, truncation=True, padding="max_length", max_length=128, return_tensors="pt") # 显示结果 print("Token IDs:", encoding["input_ids"]) print("Labels:", labels) ✅ 适用于 BERT 训练数据格式 📌 4. BIO vs. 其他标注格式 标注格式 规则 适用场景 BIO B- 实体开头,I- 实体内部,O 非实体 NER 任务最常用 BILOU B- 开头,I- 内部,L- 结尾,U- 单字实体 适用于高精度 NER IOB I- 代替 B-,O 代表非实体 与 BIO 类似,较少使用 ✅ 推荐 BIO,兼容 BERT / DistilBERT 训练 🚀 📌 5. 终极 BIO 标注流程 1️⃣ 确定标注目标(如材料、技术、申请人等类别) 2️⃣ 使用人工工具(Label Studio、Prodigy)进行初步标注 3️⃣ 使用规则匹配 + 词典扩充 进行大规模半自动标注 4️⃣ 转换为 BIO 格式,适配 BERT/DistilBERT 训练 5️⃣ 训练 NER 模型,如 DistilBERT、SpanMarker、CRF 🚀 BIO 是命名实体识别的标准格式,掌握它能让你训练更精准的 NLP 模型! 📊 是否需要更进一步的优化(如使用 ONNX/TensorRT 加速 NER 推理)?