使用Flair项目训练生物医学命名实体识别(NER)模型教程

使用Flair项目训练生物医学命名实体识别(NER)模型教程

flair 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()
)

技术要点解析

  1. Transformer词嵌入:使用BioLinkBERT等预训练模型,能够捕捉丰富的生物医学语义信息。

  2. BIOES标注格式:比传统的BIO格式更精细,包含:

    • B:实体开始
    • I:实体内部
    • O:非实体
    • E:实体结束
    • S:单字实体
  3. 多实体类型处理:通过前缀提示技术,模型可以灵活处理不同组合的实体类型,这在生物医学领域尤为重要。

  4. 语料库整合:HunFlair2整合了多个权威生物医学语料库,覆盖疾病、基因、化学物质、物种等多种实体类型。

总结

本文详细介绍了使用Flair项目训练生物医学NER模型的方法,从单一实体类型到多实体类型的识别,再到构建完整的HunFlair2模型。这些技术可以帮助研究人员构建强大的生物医学文本分析工具,为后续的医学信息提取、知识图谱构建等任务奠定基础。

flair flair 项目地址: https://gitcode.com/gh_mirrors/fla/flair

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尚榕芯Noelle

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值