Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >探秘Transformers:用Hugging Face预训练模型实现命名实体识别!

探秘Transformers:用Hugging Face预训练模型实现命名实体识别!

作者头像
Tom2Code
发布于 2024-03-02 02:07:07
发布于 2024-03-02 02:07:07
1.5K09
代码可运行
举报
文章被收录于专栏:TomTom
运行总次数:9
代码可运行

命名实体识别(NER)是自然语言处理中的一项关键任务,旨在从文本中识别并提取出具有特定意义的实体,如人名、地名、组织机构名等。通过NER,计算机可以更好地理解文本,帮助我们从海量文本数据中快速获取有用信息,是许多NLP应用的基础,如信息提取、问答系统等。

我们可以从huggingface上看一个医学实体命名的例子:

输入框里的文字是我们的输入,

点击computer按钮:

这就是我们的结果,可以这个模型成功的从我们的文本中推断出来了很多实体。例如识别出来了age,年龄。还有性别,sex。还有一些医学上的一些专业名称也成功的区分出来了,这就是命名实体识别的一个demo

那我们今天要做的demo是基于中文的命名实体识别。

首先介绍一下数据集:

可以在huggingface上直接搜索:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
peoples_daily_ner

是一个报纸上的一些新闻的文字数据。

再介绍一下我们使用的预训练模型:

也是可以直接从huggingface上搜索:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
hfl/chinese-macbert-base

稍微介绍一下这个模型:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MacBERT 是一种改进的 BERT,采用新颖的 MLM 作为校正预训练任务,从而减少了预训练和微调之间的差异。

在微调阶段,[MASK] 标记从未出现过,我们建议使用相似词来代替[MASK] 标记进行屏蔽。相似词通过同义词工具包(Wang 和 Hu,2017 年)获得,
该工具包基于 word2vec(Mikolov 等人,2013 年)相似性计算。
如果选择了一个 N-gram 作为掩码,我们将单独找出相似词。
在极少数情况下,如果没有相似词,我们将降级使用随机词替换。

然后就是从huggingface的镜像站上下载我们的模型:

具体的操作在上一篇我们已经介绍过:

点击图片即可进入上一篇文章

接下来废话不多说,直接开肝

1.首先是导包

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import evaluate
from datasets import load_dataset
from transformers import AutoTokenizer, AutoModelForTokenClassification, TrainingArguments, Trainer, DataCollatorForTokenClassification

2.加载数据集

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 如果加载失败 可以通过本地下载到磁盘然后再加载
ner_datasets = load_dataset("peoples_daily_ner", cache_dir="./data")

数据集截图:

随机打印1个数据集看看:

3.加载分词器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tokenizer = AutoTokenizer.from_pretrained("hfl/chinese-macbert-base")

还是一样,如果加载失败,可以通过先从镜像站下载到本地,然后再从本地加载分词器和模型

写一个函数,用来处理将原始文本数据中的标签(通常是实体名称或类型的标记)映射到经过标记化后的文本中的正确位置上,以便用于训练或评估模型。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def process_function(examples):
    tokenized_examples = tokenizer(examples["tokens"], max_length=128, truncation=True, is_split_into_words=True)
    labels = []
    for i, label in enumerate(examples["ner_tags"]):
        word_ids = tokenized_examples.word_ids(batch_index=i)
        label_ids = [-100 if word_id is None else label[word_id] for word_id in word_ids]
        labels.append(label_ids)
    tokenized_examples["labels"] = labels
    return tokenized_examples

这样数据就会变成我们想要的格式了:

4.创建模型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model = AutoModelForTokenClassification.from_pretrained("hfl/chinese-macbert-base", num_labels=len(label_list))

这里要制定我们的类别,使用list_labels来制定

5.创建评估函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
seqeval = evaluate.load("seqeval_metric.py")
seqeval

返回了很多用法

在写一个这次训练要用到的验证函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
from seqeval.metrics import f1_score

def eval_metric(pred, label_list):
    predictions, labels = pred
    predictions = np.argmax(predictions, axis=-1)

    true_predictions = [
        [label_list[p] for p, l in zip(prediction, label) if l != -100]
        for prediction, label in zip(predictions, labels)
    ]

    true_labels = [
        [label_list[l] for p, l in zip(prediction, label) if l != -100]
        for prediction, label in zip(predictions, labels)
    ]

    return {"f1": f1_score(true_labels, true_predictions)}

6.配置训练参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
args = TrainingArguments(
    output_dir="models_for_ner",
    per_device_train_batch_size=32,
    per_device_eval_batch_size=64,
    evaluation_strategy="epoch",
    save_strategy="epoch",
    metric_for_best_model="f1",
    load_best_model_at_end=True,
    logging_steps=50,
    num_train_epochs=1
)

7.创建训练器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
trainer = Trainer(
    model=model,
    args=args,
    train_dataset=tokenized_datasets["train"],
    eval_dataset=tokenized_datasets["validation"],
    compute_metrics=eval_metric,
    data_collator=DataCollatorForTokenClassification(tokenizer=tokenizer)
)

8.模型训练

由于时间原因只训练了一个epoch

9.使用验证集来测试模型

可以看到f1值很高,从侧面也能代表模型的准确率不低。

最后就是我们再来验证一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from transformers import pipeline
model.config.id2label = {idx: label for idx, label in enumerate(label_list)}
ner_pipe = pipeline("token-classification", model=model, tokenizer=tokenizer, device=0, aggregation_strategy="simple")

res = ner_pipe("汤姆在北京读研究生")
res

可以看到模型准确的识别出了两个实体

可以再分割一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 根据start和end取实际的结果
ner_result = {}
x = "汤姆在北京读研究生"
for r in res:
    if r["entity_group"] not in ner_result:
        ner_result[r["entity_group"]] = []
    ner_result[r["entity_group"]].append(x[r["start"]: r["end"]])

ner_result

可以看到person是汤姆,location是北京,说明我们的模型还是很不错的。

完,文章对您有用可以点个赞

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-02-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Tom的小院 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
transformers快速上手:实体识别和词性标注
大家好,我是多多,最近在学习整理预训练模型和transformers。这是本系列的第3篇。文字和代码较多,建议点赞、在看、收藏食用。
AI部落联盟
2021/05/11
2.9K0
transformers快速上手:实体识别和词性标注
Huggingface🤗NLP笔记8:使用PyTorch来微调模型「初级教程完结撒花ヽ(°▽°)ノ」
在Huggingface官方教程里提到,在使用pytorch的dataloader之前,我们需要做一些事情:
beyondGuo
2021/10/20
2.1K0
Transformers 4.37 中文文档(二)
除了🤗 Transformers 的 notebooks 之外,还有示例脚本演示如何使用PyTorch、TensorFlow或JAX/Flax训练模型的方法。
ApacheCN_飞龙
2024/06/26
7090
Transformers 4.37 中文文档(二)
Huggingface🤗NLP笔记7:使用Trainer API来微调模型
不得不说,这个Huggingface很贴心,这里的warning写的很清楚。这里我们使用的是带ForSequenceClassification这个Head的模型,但是我们的bert-baed-cased虽然它本身也有自身的Head,但跟我们这里的二分类任务不匹配,所以可以看到,它的Head被移除了,使用了一个随机初始化的ForSequenceClassificationHead。
beyondGuo
2021/10/08
8.8K0
使用 Transformers 在你自己的数据集上训练文本分类模型
最近实在是有点忙,没啥时间写博客了。趁着周末水一文,把最近用 huggingface transformers 训练文本分类模型时遇到的一个小问题说下。
Alan Lee
2021/12/07
2.5K0
Transformers 4.37 中文文档(一)
下表表示库中对这些模型的当前支持,它们是否有 Python 分词器(称为“slow”)。由🤗 Tokenizers 库支持的“fast”分词器,它们是否在 Jax(通过 Flax)、PyTorch 和/或 TensorFlow 中有支持。
ApacheCN_飞龙
2024/06/26
1.3K0
Transformers 4.37 中文文档(一)
Huggingface🤗NLP笔记6:数据集预处理,使用dynamic padding构造batch
从这一集,我们就正式开始使用Transformer来训练模型了。今天的部分是关于数据集预处理。
beyondGuo
2021/10/08
5.1K2
聊聊预训练模型的微调
翻译自:Fine-tuning a model with the Trainer API
Ryan_OVO
2023/10/19
5600
基于深度学习的NER(命名实体识别)教程 —— 识别文本中的编号
命名实体识别(Named Entity Recognition, NER)是自然语言处理(NLP)任务之一,用于识别文本中的特定类别的实体,如人名、地名、组织名、日期、编号等。
IT蜗壳-Tango
2025/03/18
1770
用BERT做命名实体识别任务
本质上NER是一个token classification任务, 需要把文本中的每一个token做一个分类。
lyhue1991
2023/09/05
7540
用BERT做命名实体识别任务
Transformers 4.37 中文文档(三)
www.youtube-nocookie.com/embed/ajPx5LwJD-I
ApacheCN_飞龙
2024/06/26
2620
实体识别(4) -基于Bert进行商品标题实体识别[很详细]
比赛数据下载地址:商品标题实体识别 https://www.heywhale.com/home/competition/620b34ed28270b0017b823ad
致Great
2023/08/25
4300
Transformer 模型实用介绍:BERT
在 NLP 中,Transformer 模型架构是一场革命,极大地增强了理解和生成文本信息的能力。
数据科学工厂
2023/08/10
5910
Transformer 模型实用介绍:BERT
在低配置电脑上使用TinyBERT训练并部署产品编号提取模型
虽然 TinyBERT 相比于 BERT 较小,但训练和推理过程中仍然依赖于计算资源。如果你的计算机没有 GPU,可以考虑使用 Google Colab 或 AWS 等云平台来提供 GPU 计算资源。
IT蜗壳-Tango
2025/03/22
2040
使用transformer BERT预训练模型进行文本分类 及Fine-tuning
Bert 全称为 Bidirectional Encoder Representations from Transformers(Bert)。和 ELMo 不同,BERT 通过在所有层联合调节左右两个上下文来预训练深层双向表示,此外还通过组装长句作为输入增强了对长程语义的理解。Bert 可以被微调以广泛用于各类任务,仅需额外添加一个输出层,无需进行针对任务的模型结构调整,就在文本分类,语义理解等一些任务上取得了 state-of-the-art 的成绩。
大鹅
2021/07/30
11K0
【AI大模型】Transformers大模型库(十一):Trainer训练类
这里的Transformers指的是huggingface开发的大模型库,为huggingface上数以万计的预训练大模型提供预测、训练等服务。
LDG_AGI
2024/08/13
1.1K0
Qwen2大模型微调入门实战-命名实体识别(NER)任务
以Qwen2作为基座大模型,通过指令微调的方式做高精度的命名实体识别(NER),是学习入门LLM微调、建立大模型认知的非常好的任务。
zenRRan
2024/07/04
2.1K0
Qwen2大模型微调入门实战-命名实体识别(NER)任务
5分钟NLP:使用 HuggingFace 微调BERT 并使用 TensorBoard 可视化
上篇文章我们已经介绍了Hugging Face的主要类,在本文中将介绍如何使用Hugging Face进行BERT的微调进行评论的分类。其中包含:AutoTokenizer、AutoModel、Trainer、TensorBoard、数据集和指标的使用方法。
deephub
2022/04/14
1.4K0
5分钟NLP:使用 HuggingFace 微调BERT 并使用 TensorBoard 可视化
Hugging Face模型训练步骤及开发示例
Hugging Face是一个非常活跃且重要的开源社区和技术平台,主要专注于自然语言处理(NLP)领域,并逐渐扩展到了计算机视觉和其他机器学习领域。
用户7353950
2024/11/23
4290
Hugging Face模型训练步骤及开发示例
科大讯飞 中文成语填空挑战赛baseline
中国文化博大精深源远流长,其中成语更是中国文化的精华。成语大多由四个字组成,一般都有典故或出处。有些成语从字面上不难理解,如“小题大做”、“后来居上”等。有些成语必须知道来源或典故才能懂得意思,如“朝三暮四”、“杯弓蛇影”等。
致Great
2021/11/24
5540
科大讯飞 中文成语填空挑战赛baseline
推荐阅读
相关推荐
transformers快速上手:实体识别和词性标注
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验