共计 1846 个字符,预计需要花费 5 分钟才能阅读完成。
为什么 NER 任务需要 BiLSTM-CRF?
命名实体识别(NER/Named Entity Recognition)就像是给文本中的关键词贴标签的智能便签——它能自动识别出『北京』是地点、『张三』是人名。在医疗病历分析、金融合同解析等场景中,NER 准确率直接决定下游任务效果。
相比纯 CRF(条件随机场)模型,BiLSTM-CRF 通过双向 LSTM 捕捉上下文特征,再用 CRF 修正标签序列的合理性。实验显示,在相同数据量下,BiLSTM-CRF 比纯 CRF 的 F1 值高 6 -12%,比纯 Transformer 模型更适合处理医疗文本中的长实体(如『冠状动脉粥样硬化性心脏病』)。
数据集标注规范:从理论到实践
标签体系选型:IOB 还是 IOBES?
- IOB:最基础的标注方案
- B-XXX:实体开头
- I-XXX:实体中间 / 结尾
- O:非实体
- IOBES:增加单字实体和结束标记
- S-XXX:单字实体
- E-XXX:实体结尾
医疗文本推荐 IOBES 体系,尤其适合处理『Ⅲ期』(单个肿瘤分期标签)这类短实体。标注示例:
患 O
者 O
主 O
诉 O
头 B-SYMPTOM
痛 E-SYMPTOM
3 B-DURATION
天 E-DURATION
特殊字符处理三原则
- 保留原始符号:病历中的『+』『→』可能具有临床意义
- 统一全半角:将『%』统一转为『%』
- 分段处理:化验值『12.5mmol/L』整体标注为 TEST 实体
BRAT 标注工具实战
-
安装 BRAT(推荐 Docker 版)
docker pull brat-image docker run -d -p 8001:80 -v /data/brat:/bratdata brat-image -
创建标注规范(annotation.conf):
[entities] DISEASE # 疾病 SYMPTOM # 症状 [relations] CAUSE_OF Disease|Symptoms # 病因关系 -
标注示例截图(模拟真实病历):

CRF 特征工程实战
使用 sklearn-crfsuite 添加多层次特征:
from sklearn_crfsuite import CRF
# 特征模板示例
def word2features(sent, i):
word = sent[i][0]
features = {
'bias': 1.0,
'word.lower()': word.lower(),
'word[-3:]': word[-3:], # 字符 n -gram
'word.isdigit()': word.isdigit(),
'pos': sent[i][1], # 词性标注
}
if i > 0:
prev_word = sent[i-1][0]
features.update({'prev_word': prev_word})
return features
# 加载预训练字向量
char_embedding = load_embeddings() # 假设已有 embedding 层
crf = CRF(
algorithm='lbfgs',
c1=0.1, # L1 正则
c2=0.1, # L2 正则
max_iterations=100,
all_possible_transitions=True # 允许所有转移特征
)
生产环境避坑指南
标签不一致检测脚本
import pandas as pd
def check_annotation(df):
error_log = []
for _, row in df.iterrows():
tags = row['tags'].split()
# 检查 B - I 连续性问题
for i in range(1, len(tags)):
if tags[i].startswith('I-') and not tags[i-1].startswith(('B-', 'I-')):
error_log.append(f"行{row.id}:孤立 I 标签")
return error_log
嵌套实体解决方案
- 分层标注:先标疾病『糖尿病』,再标其属性『Ⅱ型』
- 概率投票:训练两个模型分别识别不同层级实体
小样本增强技巧
- 同义词替换:『心梗』→『心肌梗死』
- 实体边界扰动:『右上腹疼痛』→『上腹部右侧疼痛』
- 语法结构变换:『否认高血压病史』→『没有高血压的病史』
开放讨论
- 当标注预算有限时,应该优先标注哪些类型的文本样本?
- 从临床病历迁移到医保单据时,是否需要新增『保险编号』这类标签?
- 如何评估半监督算法自动标注结果的可信度?
实战建议:在标注 200 份病历后,先用 CRF 模型快速验证标签体系合理性,再迭代到 BiLSTM-CRF 模型。我们项目中的 F1 值从 0.76 提升到 0.83 的关键,正是修正了『药物剂量』与『用药频次』的标签混淆问题。
正文完
发表至: 自然语言处理
近两天内

