bio.md 4.4 KB

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