使用Flair项目训练生物医学命名实体识别(NER)模型教程
flair 项目地址: https://gitcode.com/gh_mirrors/fla/flair
前言
在自然语言处理(NLP)领域,命名实体识别(NER)是一项基础而重要的任务,特别是在生物医学领域,准确识别疾病、基因、化学物质等实体对后续分析至关重要。本文将详细介绍如何使用Flair项目训练生物医学领域的NER模型。
准备工作
在开始之前,请确保您已了解以下基础知识:
- Flair项目的基本数据类型
- Transformer词嵌入的工作原理
- 如何加载预处理的语料库
训练单一实体类型的生物医学NER模型
示例场景
假设我们需要训练一个专门识别"疾病"类别的NER模型,可以使用NCBI_DISEASE语料库进行训练。
代码实现
from flair.datasets import NCBI_DISEASE
# 1. 加载语料库
corpus = NCBI_DISEASE()
print(corpus)
# 2. 创建标签字典
tag_dictionary = corpus.make_label_dictionary(label_type="ner", add_unk=False)
# 3. 初始化词嵌入
from flair.embeddings import TransformerWordEmbeddings
embeddings = TransformerWordEmbeddings(
"michiyasunaga/BioLinkBERT-base", # 使用BioLinkBERT预训练模型
layers="-1", # 使用最后一层输出
subtoken_pooling="first", # 子词池化策略
fine_tune=True, # 微调模型
use_context=True, # 使用上下文
model_max_length=512, # 最大输入长度
)
# 4. 初始化序列标注器
from flair.models import SequenceTagger
tagger = SequenceTagger(
hidden_size=256,
embeddings=embeddings,
tag_dictionary=tag_dictionary,
tag_format="BIOES", # 使用BIOES标注格式
tag_type="ner",
use_crf=False,
use_rnn=False,
reproject_embeddings=False,
)
# 5. 初始化训练器并开始训练
from flair.trainers import ModelTrainer
trainer = ModelTrainer(tagger, corpus)
trainer.fine_tune(
base_path="taggers/ncbi-disease", # 模型保存路径
train_with_dev=False,
max_epochs=16,
learning_rate=2.0e-5,
mini_batch_size=16,
shuffle=False,
)
模型使用
训练完成后,可以这样使用模型进行预测:
# 加载训练好的模型
model = SequenceTagger.load("taggers/ncbi-disease/best-model.pt")
# 创建示例句子
from flair.data import Sentence
sentence = Sentence("吸烟女性患乳腺癌的风险是普通人的四倍。")
# 进行预测
model.predict(sentence)
print(sentence.to_tagged_string())
输出结果将正确标注"乳腺癌"为疾病实体。
训练多实体类型的生物医学NER模型
技术背景
在实际应用中,我们经常需要同时识别多种实体类型。Flair提供了PrefixedSequenceTagger
类,采用提示(Prompting)技术,通过在输入前添加前缀来指定需要识别的实体类型。
实现步骤
# 1. 加载多个语料库
from flair.datasets.biomedical import HUNER_ALL_CDR, HUNER_CHEMICAL_NLM_CHEM
corpora = (HUNER_ALL_CDR(), HUNER_CHEMICAL_NLM_CHEM())
# 2. 为每个语料库添加前缀
from flair.data import MultiCorpus
from flair.models.prefixed_tagger import EntityTypeTaskPromptAugmentationStrategy
# 定义实体类型映射
mapping = {
"cell_line": "细胞系",
"chemical": "化学物质",
"disease": "疾病",
"gene": "基因",
"species": "物种",
}
prefixed_corpora = []
all_entity_types = set()
for corpus in corpora:
# 获取当前语料库的实体类型并转换为中文描述
entity_types = [mapping[tag] for tag in corpus.get_entity_type_mapping().values()]
all_entity_types.update(set(entity_types))
# 创建前缀增强策略
augmentation_strategy = EntityTypeTaskPromptAugmentationStrategy(entity_types)
prefixed_corpora.append(augmentation_strategy.augment_corpus(corpus))
# 合并语料库
corpus = MultiCorpus(prefixed_corpora)
all_entity_types = sorted(all_entity_types)
# 3. 创建标签字典
tag_dictionary = corpus.make_label_dictionary(label_type="ner")
# 4. 初始化词嵌入和标注器
embeddings = TransformerWordEmbeddings(
"michiyasunaga/BioLinkBERT-base",
layers="-1",
subtoken_pooling="first",
fine_tune=True,
use_context=True,
model_max_length=512,
)
from flair.models.prefixed_tagger import PrefixedSequenceTagger
tagger = PrefixedSequenceTagger(
hidden_size=256,
embeddings=embeddings,
tag_dictionary=tag_dictionary,
tag_format="BIOES",
tag_type="ner",
use_crf=False,
use_rnn=False,
reproject_embeddings=False,
augmentation_strategy=EntityTypeTaskPromptAugmentationStrategy(all_entity_types),
)
# 5. 训练模型
trainer = ModelTrainer(tagger, corpus)
trainer.fine_tune(
base_path="taggers/multi-entity",
train_with_dev=False,
max_epochs=16,
learning_rate=2.0e-5,
mini_batch_size=16,
shuffle=False,
)
训练完整的HunFlair2模型
HunFlair2是Flair项目中一个强大的生物医学NER模型,它整合了多个生物医学语料库:
from flair.datasets.biomedical import (
HUNER_ALL_BIORED, HUNER_GENE_NLM_GENE,
HUNER_GENE_GNORMPLUS, HUNER_ALL_SCAI,
HUNER_CHEMICAL_NLM_CHEM, HUNER_SPECIES_LINNEAUS,
HUNER_SPECIES_S800, HUNER_DISEASE_NCBI
)
corpora = (
HUNER_ALL_BIORED(), HUNER_GENE_NLM_GENE(),
HUNER_GENE_GNORMPLUS(), HUNER_ALL_SCAI(),
HUNER_CHEMICAL_NLM_CHEM(), HUNER_SPECIES_LINNEAUS(),
HUNER_SPECIES_S800(), HUNER_DISEASE_NCBI()
)
技术要点解析
-
Transformer词嵌入:使用BioLinkBERT等预训练模型,能够捕捉丰富的生物医学语义信息。
-
BIOES标注格式:比传统的BIO格式更精细,包含:
- B:实体开始
- I:实体内部
- O:非实体
- E:实体结束
- S:单字实体
-
多实体类型处理:通过前缀提示技术,模型可以灵活处理不同组合的实体类型,这在生物医学领域尤为重要。
-
语料库整合:HunFlair2整合了多个权威生物医学语料库,覆盖疾病、基因、化学物质、物种等多种实体类型。
总结
本文详细介绍了使用Flair项目训练生物医学NER模型的方法,从单一实体类型到多实体类型的识别,再到构建完整的HunFlair2模型。这些技术可以帮助研究人员构建强大的生物医学文本分析工具,为后续的医学信息提取、知识图谱构建等任务奠定基础。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考