首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >独家 | 轻松上手,通过微调Transformers完成命名实体识别任务

独家 | 轻松上手,通过微调Transformers完成命名实体识别任务

作者头像
数据派THU
发布于 2021-04-07 02:12:55
发布于 2021-04-07 02:12:55
1.2K00
代码可运行
举报
文章被收录于专栏:数据派THU数据派THU
运行总次数:0
代码可运行

作者:Lars Kjeldgaard 翻译:王闯(Chuck)校对:和中华 本文约2500字,建议阅读7分钟本文基于丹麦团队研发的Python开源包NERDA演示了如何通过简单微调BERT Transformer来处理NER任务。

照片源自Pixabay,作者vinsky2002

在本文中,我们将介绍如何通过简单微调(fine-tune)任意预训练的(pretrained)自然语言处理transformer,来完成任意语言中的命名实体识别(Named-Entity Recognition, NER)任务。

为什么这个话题值得你关注?因为NER是一项强大的自然语言处理任务,在诸多领域都有实际应用,在Towards Data Science之前的帖子中已有详细介绍。然而要想得到不错的NER模型效果,通常需要基于预训练的transformer对NER模型进行特定语言或领域的微调,这在计算资源有限的情况下,是比较可行的办法,而且能看到实际效果。

为了展示如何做到,我们使用python的NERDA包调用BERT transformer对NER模型进行微调。

NERDA是一套通用的NER系统,可用于以最少的代码量对任意语言的NER任务和任意transformer进行微调。

命名实体识别简介

如果你还不熟悉NER,请查看维基百科上的定义:

命名实体识别(也称(命名)实体标识,实体片取或实体提取)是用于信息提取的自然语言处理子任务,旨在将非结构化文本中提到的命名实体定位并分到预定义的类别,例如人名,组织机构名,地名,医疗代码,时间,数量,货币值,百分比等。

我们可以通过一个NER任务的例子来作进一步解释。

任务:在文本中标识人名和组织机构名:

Jim bought 300 shares of Acme Corp.

解答:人名:'Jim',组织机构名:'Acme Corp.'

若你想获得本文中提到的其他概念和技术的介绍,请移步文末“参考资料”部分,那里我们列了许多Towards Data Science先前的帖子。

工具箱

现在,我们要实际上手为NER微调transformer了。

无论你选择哪一种transformer和目标语言,我们这里介绍的步骤都是通用的。

我们将利用python的NERDA包来完成这项工作。

“NERDA” Python包的官方徽标,由Ekstra Bladet新闻提供

NERDA拥有为NER任务进行transformers微调的易用接口。它基于流行的机器学习框架PyTorch和Hugging Face transformers。

NERDA是开源的,可在Python Package Index(PyPI)上获得。它可通过如下方式安装:

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

数据集

我们将使用带有NER标注的CoNLL-2003英文数据集来训练和验证我们的模型。

首先,我们下载数据集并加载预定义且拆分过的训练数据和验证数据。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from NERDA.datasets import get_conll_data, download_conll_data download_conll_data()
training = get_conll_data('train')
validation = get_conll_data('valid')

CoNLL-2003使用以下类型的命名实体(相当标准的类别)进行操作:

1. 人名(PER)

2. 组织机构名(ORG)

3. 地名(LOC)

4. 其他(MISC)

5. 未命名实体(O)

CoNLL-2003数据集中的每一条观测值都是一个经过分词的句子,每个分词都带有一个命名实体标签。

下面,你将看到CoNLL数据集中随机取出的一个句子示例,同时列出了其分词与对应的命名实体标签([标签])。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Germany [B-LOC]
's [O]
representative [O]
to [O]
 the [O]European [B-ORG]
 Union [I-ORG]
 's [O]
veterinary [O]
 committee [O
]Werner [B-PER]
 Zwingmann [I-PER]
said [O]
on [O]
 Wednesday [O]
...

数据集采用了IOB标注方式。

IOB标注法的意思是,以'B-'标记命名实体开头的单词,以'I-'标记命名实体中间的单词。

在上面的示例中,“Germany”标记为地名(LOC),“European Union”标记为组织机构名(ORG),“ Werner Zwingmann”标识为人名(PER)。

建模

第一步,我们为任务指定可用的NER标签(不包括特殊的O(Outside,表示不在短语中)标签)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tag_scheme = [ 
'B-PER''I-PER''B-ORG''I-ORG''B-LOC''I-LOC''B-MISC''I-MISC' 
]

接下来,我们必须做出选择,要微调Hugging Face上众多transformers中的哪一个。这里我们以uncased multilingual BERT transformer为例(常见选择之一)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
transformer = 'bert-base-multilingual-uncased'

同时,我们为网络层及模型训练本身提供一套基本的超参数配置。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# hyperparameters for network
dropout = 0.1
# hyperparameters for trainingtraining
hyperparameters = {
'epochs' : 4,
'warmup_steps' : 500,
'train_batch_size': 13,
'learning_rate': 0.0001
}

整合

现在,使用NERDA模型接口将各个部分整合到一个完整的模型配置中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from NERDA.models import NERDA
model = NERDA(
dataset_training = training,
dataset_validation = validation,
tag_scheme = tag_scheme, 
tag_outside = 'O',
transformer = transformer,
dropout = dropout,
hyperparameters = training_hyperparameters
)

在底层NERDA实现了一个torch神经网络,该神经网络建立在所选的transformer(在本例中为BERT)上。默认情况下,网络架构将类似于Hvingelby等人2020年发表的论文中提出的模型之一。(如果你愿意,也可以提出自己的网络架构)。

为了训练模型并微调BERT transformer,接下来唯一要做的就是调用train方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model.train()

注意:这将花上一些时间,具体取决于特征的维度(如果你想略过模型训练,则可以直接使用NERDA中提供的预训练模型)。

到这就大功告成了。现在,我们已经为NER微调了属于自己的一个基于BERT的最优效果 (state-of-the-art)模型。

让我们看看该模型在独立测试集上的表现(通过F1得分评估)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> test = get_conll_data('test'>>> model.evaluate_performance(test)
级别F1-分数
B-PER 0.963 
I-PER 0.987 
B-ORG 0.887
 I-ORG 0.866 
B-LOC 0.922
 I-LOC 0.817
 B- MISC 0.823 
I-MISC 0.680
 AVG_MICRO 0.907

“ AVG_MICRO”:跨实体标签的F1分数的微平均值(micro-averaged F1-score)。

如你所见,模型表现看起来很棒。

现在,我们可以使用该模型来识别新文本中的命名实体,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> model.predict_text('Cristiano Ronaldo plays for Juventus FC')
([['Cristian', 'Ronaldo', 'plays', 'for', 'Juventus', 'FC']], 
[['B-PER', 'I-PER', 'O', 'O', 'B-ORG', 'I-ORG']])

该模型(正确地)将“ Cristiano Ronaldo”(足球运动员)标识为人名,并将“ Juventus FC”(足球俱乐部)标识为组织机构名。

微调任意Transformer

Hugging Face上目前已提供了超过5000种transformer模型。那么你应该微调哪一个呢?我们不想让你失望,但答案是:这要视情况而定。天下没有免费的午餐。Transformer模型都有各自的优缺点。此外,当你挑选transformer的时候,也要相应照顾到到计算资源的预算,和节能环保的意识。

如前所述,BERT通常是一个不错的选择。但是,与BERT相比,后起之秀ELECTRA则轻巧许多,计算效率更高,并且在NER任务上仍然表现出色。

无论你选择哪种transformer,NERDA都提供支持。在上面的代码示例中,如果想要把transformer从BERT改成ELECTRA,只需要更改transformer参数,即:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model = NERDA(
...,
transformer = 'google/electra-small-discriminator',
...
)

微调任意语言

NERDA可以用于微调任意语言的transformer,比如使用你自己的数据集。为了微调NER中丹麦语的transformer,我们可以利用DaNE数据集,该数据集由带有NER注释的丹麦语句子组成。

为实现此目的,你只需要在前一个代码示例中做出非常简单的改变:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from NERDA.datasets import get_dane_data
model = NERDA(
...,
dataset_training = get_dane_data('train')
,dataset_validation = get_dane_data('dev'),
...
)

如果你没有任何(或是还不够)所需语言的经过NER标注的训练数据,那么你可以利用doccano之类的工具来批量标注新文本。

出乎意料的是,NERDA对特定语言的微调并不需要你想像那么多的带标注的数据,因为NERDA可以利用transformer中已经存在的知识。例如,丹麦NER数据集DaNE包含的句子虽不超过5500个,却足以训练NERDA模型,性能还不错。

关于NERDA

NERDA是丹麦小报Ekstra Bladet在“新闻智能平台(PIN)”开发活动中的一部分成果。PIN是一个业界研究项目,合作方包括丹麦技术大学,哥本哈根大学和哥本哈根商学院,获得了丹麦创新基金的资助。该项目的起止时间为2020年至2023年,用于研发新闻发布的推荐系统和自然语言处理系统,其部分研究成果已开源,如NERDA。

原文标题:

Easy Fine-Tuning of Transformers for Named-Entity Recognition

原文链接:

https://towardsdatascience.com/easy-fine-tuning-of-transformers-for-named-entity-recognition-d72f2b5340e3

参考资料:

https://github.com/ebanalyse/NERDA

https://huggingface.co/

https://pytorch.org/

https://github.com/google-research/bert

“DaNE: A Named Entity Ressource for Danish”, Hvingelby et. al (2020):http://www.lrec-conf.org/proceedings/lrec2020/pdf/2020.lrec-1.565.pdf

https://github.com/google-research/electra

https://towardsdatascience.com/what-are-transformers-and-how-can-you-use-them-f7ccd546071a

https://towardsdatascience.com/bert-explained-state-of-the-art-language-model-for-nlp-f8b21a9b6270

https://towardsdatascience.com/understanding-electra-and-training-an-electra-language-model-3d33e3a9660d

编辑:于腾凯

校对:林亦霖

译者简介

王闯(Chuck),台湾清华大学资讯工程硕士。曾任奥浦诺管理咨询公司数据分析主管,现任尼尔森市场研究公司数据科学经理。很荣幸有机会通过数据派THU微信公众平台和各位老师、同学以及同行前辈们交流学习。

翻译组招募信息

工作内容:需要一颗细致的心,将选取好的外文文章翻译成流畅的中文。如果你是数据科学/统计学/计算机类的留学生,或在海外从事相关工作,或对自己外语水平有信心的朋友欢迎加入翻译小组。

你能得到:定期的翻译培训提高志愿者的翻译水平,提高对于数据科学前沿的认知,海外的朋友可以和国内技术应用发展保持联系,THU数据派产学研的背景为志愿者带来好的发展机遇。

其他福利:来自于名企的数据科学工作者,北大清华以及海外等名校学生他们都将成为你在翻译小组的伙伴。

转载须知

如需转载,请在开篇显著位置注明作者和出处(转自:数据派ID:DatapiTHU),并在文章结尾放置数据派醒目二维码。有原创标识文章,请发送【文章名称-待授权公众号名称及ID】至联系邮箱,申请白名单授权并按要求编辑。

发布后请将链接反馈至联系邮箱(见下方)。未经许可的转载以及改编者,我们将依法追究其法律责任。

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

本文分享自 数据派THU 微信公众号,前往查看

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

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

评论
登录后参与评论
1 条评论
热度
最新
你好,请问后来可以收到回调了吗?
你好,请问后来可以收到回调了吗?
回复回复点赞举报
推荐阅读
Android消息推送:第三方消息推送平台详细解析
其他推送方式还有:C2DM、轮询、SMS、MQTT协议、XMPP协议等等,相对于这些推送方式,第三方推送方式的特点分别是:
Carson.Ho
2019/02/22
10.2K1
Facebook第三方登录流程总结
一些国际的软件/网站支持的比较多的第三方登录是Google第三方登录、Facebook第三方登录等。这里记录下Facebook第三方登录的过程。下面是一个Facebook第三方登录流程示例:
DannyHoo
2020/04/24
32.1K3
Facebook第三方登录流程总结
第三方微信授权登录APP接入_使用第三方应用打开是什么意思
在微信开放平台 https://open.weixin.qq.com/ 注册成为开发者,具体步骤略
全栈程序员站长
2022/09/20
1.5K0
第三方微信授权登录APP接入_使用第三方应用打开是什么意思
基于OIDC实现单点登录SSO、第三方登录[通俗易懂]
认证(Authentication) 认证是指应用软件(身份信息使用方)通过采用某种方法来确认当前请求的用户是谁。基于密码的认证过程可以细分为三步: (1)认证服务器(身份信息提供方)从客户端获取用户账密。 (2)认证服务器将拿到的账密与数据库中保存的账密进行比较,确认正确后,生成用户身份信息。 (3)使用方从提供方处获取用户身份信息。
全栈程序员站长
2022/09/27
7.3K0
基于OIDC实现单点登录SSO、第三方登录[通俗易懂]
第三方登录:微信扫码登录(OAuth2.0
  OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。
朝雨忆轻尘
2019/06/18
60.4K1
网站接入第三方登录功能:Java开发QQ登录
QQ登录确实比自己注册账户登录要方便的多,所以就搞了个QQ登录。QQ互联开放平台为第三方网站提供了丰富的API。第三方网站接入QQ互联开放平台后,即可通过调用平台提供的API实现用户使用QQ帐号登录网站功能,且可以获取到腾讯QQ用户的相关信息。
sunonzj
2022/06/21
1.4K0
网站接入第三方登录功能:Java开发QQ登录
浅谈第三方 SDK 和自定义 crash 上报冲突问题
在开发 iOS 应用,解决 Crash 问题始终是一个难题。Crash 分为两种,一种是由 EXC_BAD_ACCESS 引起的,原因是访问了不属于本进程的内存地址,有可能是访问已被释放的内存;另一种是未被捕获的 Objective-C 异常,导致程序向自身发送了 UNIX 信号而崩溃。对于这两种 Crash 的捕获,精准高效的收集线上崩溃可以帮助我们更好的解决问题和提高用户体验,现在比较成熟的崩溃收集工具也比较多,比如:友盟统计,Crashlytics,腾讯的 bugly 等等。也可以通过自定义 crash 上报,来处理异常。
s_在路上
2018/09/30
2K0
怎么快速集成QQ微博等第三方授权登录功能?
日常项目中经常会用到QQ授权登录或者微信授权登录,方便了用户,否则需要手机验证码等等的操作,授权登录只需要一键操作
沈唁
2018/08/21
8360
怎么快速集成QQ微博等第三方授权登录功能?
云通信IM - 第三方回调简单接收配置
为了更好的管理和控制App,IM提供了第三方回调功能,配置使用后,即时通信IM会向App后台服务器发送请求,App后台可以根据收到的回调处理业务逻辑、数据处理存储、功能控制干预,比如禁止该消息下发、用户登录状态的实时变更等。即时通信 IM 目前支持的回调请参见 回调命令列表
liyao
2021/02/21
2.2K0
让你的typecho支持第三方登录
解压插件到Plugins目录; 在后台启用插件,并配置插件参数(方法见:参数配置 - 配置示例); 在当前使用主题的适当位置添加TeConnect_Plugin::show()方法
Gujiu
2022/09/16
6860
第三方登陆——QQ登陆详解
点击查看,有APP ID和APP Key就可以先测试使用,这样审核也不会浪费我们时间
思索
2024/08/16
1.1K0
第三方登陆——QQ登陆详解
【深度解析】嵌入式第三方集成的优势、挑战与实现方案(2025版)
嵌入式第三方集成,简单来说,就是将外部服务功能(如支付、聊天、分析等)以“原生体验”的方式嵌入到自身产品中,而不是跳转至外部系统或打开新窗口。这类集成通常通过API、SDK或插件实现,嵌入的内容对用户而言无缝可见,功能完整,仿佛是系统本身的一部分。
流淌的琴声
2025/07/08
920
iOS微信第三方登录实现
移动应用微信登录是基于 OAuth2.0协议标准 构建的微信OAuth2.0授权登录系统。
用户7108768
2021/10/29
3.2K0
一文搞定web微信第三方登录
1.1、申请微信开放平台账号(https://open.weixin.qq.com/):
猿码优创
2020/08/11
21.6K2
一文搞定web微信第三方登录
vue+drf+第三方滑动验证码的接入实现
近期在项目开发练习中用到了登录功能 + 验证码的需求,验证码一般分为三种类型:图片验证码、短信验证码、滑动验证码,相关实现思路如下
仙人技术
2021/02/04
1.5K0
第三方登录
大家经常被注册登录繁琐的步骤击退,经常进几个不同的网站要输入几次用户密码,特别繁琐
阿超
2022/08/16
1.1K0
第三方登录
一个企业微信第三方应用是怎么开放和上架的
好像大厂的同学最近都笼罩在不大好的氛围下。最近大家过得还好吗? 大伙还有保持学习的习惯吗?最近花叔也觉得环境让人窒息,也有浮躁的时候了。 找个东西学一下转一下注意力吧。 过去两周,研究了一下企业微信(以下简称企微)的第三方应用,可能也算是比较冷门的知识,也不知道对自己或对业务有多大的作用,反正就学一下吧。 企微应用是什么? 企业管理员在企业管理页里有一个“应用管理”,里面可以安装自带或第三方应用,安装完后,该企业的员工在使用企微时,就能在“工作台”找到相关的应用并使用,这些应用大多是流程或效率或协同
花叔
2022/07/12
6.6K1
一个企业微信第三方应用是怎么开放和上架的
第三方登录(3)---微博登录
我们在前面实现了使用QQ账号以及GitHub账号进行第三方登录。有兴趣的可以看看前两篇文章:
创译科技
2019/06/02
5.4K0
Flask 博客接入第三方登录
Flask不像Django一样有各种现成的组件可以选用,Flask的各种扩展也不那么「开箱即用」。在我的博客项目中,我选用的是Authlib,它是国内的一名Python资深开发者@lepture开发的一款全面完善的OAuth认证库。大家可能在别的教程里会看到用的是flask-oauthlib,它们的作者其实是同一人,而且在2019年的今天,我绝对会推荐你用Authlib而不是flask-oauthlib。
岂不美哉Frost
2019/12/02
2.1K0
Flask 博客接入第三方登录
1.第三方登陆
登录 javaweb中如何去维持登录状态 1.登录后 信息放入 session中 2.页面内验证session中是否有登录信息 3.如果有,不需要再次登录 4.如果没有,跳转登录页面 5.如果登录后点击注销,删除session中登录信息,并清除页面缓存(必要的) image.png javaweb中哪些情况我们的session会过期 1.过期-->很长时间没有去访问网站 2.主动关闭-->用处注销 3.切换浏览器 手机端如何维持登录状态 登录成功之后,在成功的结果里面会附加一个sessionKey/toke
六月的雨
2018/05/14
1.8K0
推荐阅读
相关推荐
Android消息推送:第三方消息推送平台详细解析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档