CLUENER细粒度命名实体识别,附完整代码
CLUENER 细粒度命名实体识别
⽂章⽬录
⼀、任务说明:
1. 最开始是参考知乎⽂章,github项⽬地址:
2. 任务介绍:本任务是中⽂语⾔理解测评基准(CLUE)任务之⼀:。
3. 数据来源:本数据是在清华⼤学开源的⽂本分类数据集THUCTC基础上,选出部分数据进⾏细粒度命名实体标注,原数据来源于Sina
News RSS.
4. 平台github任务详情:
5.
6. BERT-base-X部分的代码编写思路参考
7. 参考⽂章
⼆、数据集介绍:
cluener下载链接:
2.1 数据集划分和数据内容
训练集:10748
验证集:1343
测试集(⽆标签):1345
原始数据存储在json⽂件中。⽂件中的每⼀⾏是⼀条单独的数据,⼀条数据包括⼀个原始句⼦以及其上的标签,具体形式如下:
{"text":"浙商银⾏企业信贷部叶⽼桂博⼠则从另⼀个⾓度对五道门槛进⾏了解读。叶⽼桂认为,对⽬前国内商业银⾏⽽⾔,","label":{"name":{"叶⽼桂":[[9,11] ]},"company":{"浙商银⾏":[[0,3]]}}}
{"text":"⽣⽣不息CSOL⽣化狂潮让你填弹狂扫","label":{"game":{"CSOL":[[4,7]]}}}
展开看就是:
{
"text":"浙商银⾏企业信贷部叶⽼桂博⼠则从另⼀个⾓度对五道门槛进⾏了解读。叶⽼桂认为,对⽬前国内商业银⾏⽽⾔,",
"label":{
中国交通银行信用卡"name":{
"叶⽼桂":[
[9,11],
张梓琳资料[32,34]
]
},
"company":{
"浙商银⾏":[
[0,3]
]
}
}
}
数据字段解释:
以train.json为例,数据分为两列:text & label,其中text列代表⽂本,label列代表⽂本中出现的所有包含在10个类别中的实体。例如:
text:"北京勘察设计协会副会长兼秘书长周荫如"
label:{"organization":{"北京勘察设计协会":[[0,7]]},"name":{"周荫如":[[15,17]]},"position":{"副会长":[[8,10]],"秘书长":[[12,14]]}}
其中,organization,name,position代表实体类别,
"organization":{"北京勘察设计协会":[[0,7]]}:表⽰原text中,"北京勘察设计协会"是类别为"组织机构(organization)"的实体,并且start_index为0,end_in dex为7(注:下标从0开始计数)
"name":{"周荫如":[[15,17]]}:表⽰原text中,"周荫如"是类别为"姓名(name)"的实体,并且start_index为15,end_index为17
"position":{"副会长":[[8,10]],"秘书长":[[12,14]]}:表⽰原text中,"副会长"是类别为"职位(position)"的实体,并且start_index为8,end_index为10,同时,"秘书长"也是类别为"职位(position)"的实体,
并且start_index为12,end_index为14
2.2 标签类别和定义:
数据分为10个标签类别,分别为:地址(address),书名(book),公司(company),游戏(game),政府(goverment),电影(movie),姓名(nam e),组织机构(organization),职位(position),景点(scene)
标签定义与规则:
地址(address):**省**市**区**街**号,**路,**街道,**村等(如单独出现也标记),注意:地址需要标记完全,标记到最细。陈静门事件完整照片
书名(book):⼩说,杂志,习题集,教科书,教辅,地图册,⾷谱,书店⾥能买到的⼀类书籍,包含电⼦书。
公司(company):**公司,**集团,**银⾏(央⾏,中国⼈民银⾏除外,⼆者属于政府机构),如:新东⽅,包含新华⽹/中国军⽹等。
游戏(game):常见的游戏,注意有⼀些从⼩说,电视剧改编的游戏,要分析具体场景到底是不是游戏。
政府(goverment):包括中央⾏政机关和地⽅⾏政机关两级。中央⾏政机关有国务院、国务院组成部门(包括各部、委员会、中国⼈民银⾏和审计署)、国务院直属机构(如海关、税务、⼯商、环保总局等),军队等。
电影(movie):电影,也包括拍的⼀些在电影院上映的纪录⽚,如果是根据书名改编成电影,要根据场景上下⽂着重区分下是电影名字还是书名。
姓名(name):⼀般指⼈名,也包括⼩说⾥⾯的⼈物,宋江,武松,郭靖,⼩说⾥⾯的⼈物绰号:及
时⾬,花和尚,著名⼈物的别称,通过这个别称能对应到某个具体⼈物。聘任合同
组织机构(organization):篮球队,⾜球队,乐团,社团等,另外包含⼩说⾥⾯的帮派如:少林寺,丐帮,铁掌帮,武当,峨眉等。
职位(position):古时候的职称:巡抚,知州,国师等。现代的总经理,记者,总裁,艺术家,收藏家等。
景点(scene):常见旅游景点如:长沙公园,深圳动物园,海洋馆,植物园,黄河,长江等。
2.3 数据分布
训练集:10748 验证集:1343
按照不同标签类别统计,训练集数据分布如下(注:⼀条数据中出现的所有实体都进⾏标注,如果⼀条数据出现两个地址(address)实体,那么统计地址(address)类别数据的时候,算两条数据):
【训练集】标签数据分布如下:
地址(address):2829
书名(book):1131
公司(company):2897
游戏(game):2325
政府(government):1797
电影(movie):1109
姓名(name):3661
组织机构(organization):3075
职位(position):3052
景点(scene):1462
【验证集】标签数据分布如下:
地址(address):364
书名(book):152
公司(company):366
游戏(game):287
政府(government):244
电影(movie):150
姓名(name):451
组织机构(organization):344
职位(position):425
景点(scene):199
平台测试结果:
Roberta指的chinese_roberta_wwm_large模型。(roberta-wwm-large-ext)
模型 BiLSTM+CRF bert-base-chinese Roberta+Softmax Roberta+CRF Roberta+BiLSTM+CRF
overall 70/6778.8275.9080.4/79.379.64
可见,Roberta+lstm和Roberta模型差别不⼤。
官⽅处理⽅法:softmax、crf和span,模型本体和运⾏代码见: | 。
为什么使⽤CRF提升这么⼤呢? softmax最终分类,只能通过输⼊判断输出,但是 CRF 可以通过学习转移矩阵,看前后的输出来判断当前的输出。这样就能学到⼀些规律(⽐如“O 后⾯不能直接接 I”“B-brand 后⾯不可能接 I-color”),这些规律在有时会起到⾄关重要的作⽤。
例如下⾯的例⼦,A 是没加 CRF 的输出结果,B 是加了 CRF 的输出结果,⼀看就懂不细说了
三、处理json⽂件,转成BIOS标注
本⽂选取Roberta+lstm+lstm,标注⽅法选择BIOS。
“B”:(实体开始的token)前缀
“I” :(实体中间的token)前缀
“O”:⽆特别实体(no special entity)
“S”: 即Single,“S-X”表⽰该字单独标记为X标签
另外还有BIO、BIOE(“E-X”表⽰该字是标签X的词⽚段末尾的终⽌字)等。
3.1 分词和标签预处理
陆川 汤灿NER作为序列标注任务,输出需要确定实体边界和类型。如果预先进⾏了分词处理,由于分词⼯具原本就⽆法保证绝对正确的分词⽅案,势必会产⽣错误的分词结果,⽽这将进⼀步影响序列标注结果。因此,我们不进⾏分词,在字层⾯进⾏BIOS标注。
我们采⽤BIOS标注对原始标签进⾏转换。范例:
{"text":"浙商银⾏企业信贷部叶⽼桂博⼠则从另⼀个⾓度对五道门槛进⾏了解读。叶⽼桂认为,对⽬前国内商业银⾏⽽⾔,",
"label":{"name":{"叶⽼桂":[[9,11],[32,34]]},"company":{"浙商银⾏":[[0,3]]}}}
转换结果为:
['B-company','I-company','I-company','I-company','O','O','O','O','O','B-name','I-name','I-name','O','O','O','O','O','O','O','O','O','O','O','O','O','O ','O','O','O','O','O','O','B-name','I-name','I-name','O','O','O','O','O','O','O','O','O','O','O','O','O','O','O']
这部分处理代码参考
1. 定义config⽂件:
import os
import torch
data_dir='./data/'
train_dir=data_dir+'train.npz'
test_dir=data_dir+'test.npz'
files=['train','test']
bert_model='bert-base-chinese'
roberta_model='hfl/chinese-roberta-wwm-ext-large'
case_wd()+'/case/'
# 训练集、验证集划分⽐例
dev_split_size=0.1
# 是否加载训练好的NER模型
load_before =False
# 是否对整个BERT进⾏fine tuning
full_fine_tuning =True
# hyper-parameter
learning_rate =3e-5
weight_decay =0.01
clip_grad =5
batch_size =32
epoch_num =50
min_epoch_num =5
patience =0.0002
patience_num =10
gpu ='1'
if gpu !='':
device = torch.device(f"cuda:{gpu}")
else:
else:
device = torch.device("cpu")
labels =['address','book','company','game','government', 'movie','name','organization','position','scene']
label2id ={
伊能静为什么被封杀"O":0,
"B-address":1,
"B-book":2,
"B-company":3,
'B-game':4,
'B-government':5,
'B-movie':6,
'B-name':7,
'B-organization':8,
'B-position':9,
'B-scene':10,
"I-address":11,
"I-book":12,
"I-company":13,
'I-game':14,
'I-government':15,
'I-movie':16,
'I-name':17,
'I-organization':18,
'I-position':19,
'I-scene':20,
"S-address":21,
"S-book":22,
"S-company":23,
'S-game':24,
'S-government':25,
'S-movie':26,
'S-name':27,
'S-organization':28,
'S-position':29,
'S-scene':30
}
id2label ={_id: _label for _label, _id in list(label2id.items())} 2. 导⼊config包,然后进⾏json⽂件处理。
import os
import json
import logging
import numpy as np
import pandas as pd
import config
del_selection import train_test_split
from torch.utils.data import DataLoader
发布评论