📌 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
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 推理)?