命名实体识别实例(BERT)

  • 一、背景
  • 二、数据预处理
  • 三、训练模型
  • 四、对预测结果进行转换

一、背景

本实例是当时参加第八届泰迪杯数据挖掘挑战赛C题的一部分,该赛题是智慧政务方面的,主要是根据群众的留言来了解民意


第二问是挖掘热点问题,为了先识别出问题发生的地点,涉及的任务以及问题本身,我们先对留言做了命名实体识别以支撑后续对热点问题的挖掘


所给的数据如下


下面我们要做的就是对留言主题和留言详情中的数据进行命名实体识别。
整个项目的代码如下:
链接:https://pan.baidu.com/s/1sFnYvIYuEx6CtNXrL9rYYQ
提取码:2sdk

二、数据预处理

首先需要构建训练需要的训练集,训练集是tmp目录下的source.txt和target.txt,另外验证集为dev.txt,dev-lable.txt,测试集为test1.txt,test_tgt.txt


其中source.txt为训练集中文如下:


target.txt为训练集的label如下:

这两个文件是对应的,label的标签如下,其中共设置了10个类别,PAD是当句子长度未达到max_seq_length时,补充0的类别,CLS是每个句首前加一个标志[CLS]的类别,SEP是句尾同理


在这里我们的目的是使用训练好的模型对上面所提到的excel数据进行预测,所以需要将数据处理成类似训练集的格式才能使用模型进行预测。
在data_process文件夹下的create_train_data.py将excel数据处理成相应格式

这里将留言主题和留言详情进行连接,然后将留言按照每两个字间隔一个空格的格式写入test1.txt中,test_tgt.txt是留言对应的标签,因为这就是我们想要得到的,而缺少这个文件模型不能正常运行,所以将标签都设置为O,数目与留言的字数对应即可

import pandas as pd
from sklearn.model_selection import train_test_splitdata = pd.read_excel("附件3.xlsx",usecols=[5, 4],)
data1 = pd.read_excel("附件3.xlsx",usecols=[2],)#将留言主题和留言详情合并
for i in range(len(data.留言详情)):data.留言详情[i]=''.join(data1.留言主题[i].split())+'。'+''.join(data.留言详情[i].split())with open('test_tgt.txt',"w",encoding = "utf8") as f1:  with open("test1.txt","w",encoding = "utf8") as f:for i in data.留言详情:for j in range(0,len(i)-1):f1.write("O ")f.write(i[j]+" ")f1.write("O\n")f.write(i[len(i)-1]+"\n")

处理后的数据

三、训练模型

首先需要下载BERT的中文预训练模型,这里我的项目代码里已经包括,无需再进行下载。
代码的整体框架是这样的,我将训练和预测的入口都写成了个两个脚本文件,分别为run.sh和predict.sh,只需要在这两个文件中进行配置后运行即可


下面看一下这两个配置文件:
run.sh
首先指定BERT预训练模型所在的目录,然后是训练数据所在的目录即tmp,因为是训练所以设置do_train为true,后面是将模型输出到BERT预训练模型的目录中

export BERT_BASE_DIR=chinese_L-12_H-768_A-12
export NER_DIR=tmp
python run_NER.py \--task_name=NER \--do_train=true \--do_eval=true \--data_dir=$NER_DIR/ \--vocab_file=$BERT_BASE_DIR/vocab.txt \--bert_config_file=$BERT_BASE_DIR/bert_config.json \--learning_rate=2e-5 \--train_batch_size=32 \--num_train_epochs=3 \--output_dir=$BERT_BASE_DIR/output \--init_checkpoint=$BERT_BASE_DIR/bert_model.ckpt \--max_seq_length=256 \

predict.sh
与训练不同的是不设置do_train并设置do_predict为true即可使用训练的模型对测试集进行预测并输出到BERT预训练模型目录下的output中

export BERT_BASE_DIR=chinese_L-12_H-768_A-12
export NER_DIR=tmp
python run_NER.py \--task_name=NER \--do_eval=true \--do_predict=true \--data_dir=$NER_DIR/ \--vocab_file=$BERT_BASE_DIR/vocab.txt \--bert_config_file=$BERT_BASE_DIR/bert_config.json \--learning_rate=2e-5 \--train_batch_size=32 \--num_train_epochs=3 \--output_dir=$BERT_BASE_DIR/output \--init_checkpoint=$BERT_BASE_DIR/bert_model.ckpt \--max_seq_length=512 \

其中test_prediction.txt即对我们的测试集进行预测得到的标签,eval_results.txt为对模型的评估结果


首先看一下test_prediction.txt:


eval_results.txt:可以看出模型的结果是很不错的

四、对预测结果进行转换

上面得到的test_prediction.txt只是测试集的标签,但是并没有将其转换为中文,所以我们需要使用一段代码对其进行转换。
在data_process目录下的process_predict.py中实现了转换功能。

# 将测试集与预测出的标签分别读到a和b中
with open("../tmp/test1.txt",encoding="utf8") as f1:a = []b = []with open("../chinese_L-12_H-768_A-12/output/test_prediction.txt") as f:for line in f1:a.append(line.split(" "))for line in f:b.append(line.split(" "))# 根据[SEP]对每一行的实体进行识别,并存入all中
all = []
for i in range(0,len(a)):tmp = []string = ""for j in range(0,len(a[i])):print(j)if b[i][j+1] != "O" and b[i][j+2] == "[SEP]\n":string = string+a[i][j]tmp.append(string)#all.append(tmp)string = ""breakelif b[i][j+1] != "O" and b[i][j+2] != "O":string = string+a[i][j]elif b[i][j+1] == "O" and b[i][j+2] == "[SEP]\n":breakelif b[i][j+1] != "O" and b[i][j+2] == "O":string = string+a[i][j]tmp.append(string)string = ""aa = set(tmp)tmp = list(aa)all.append(tmp)# 将识别的实体写入final.txt中
with open("final.txt","w",encoding = "utf8") as f:for i in all:if len(i)==0:f.write("\n")continuefor j in range(0,len(i)-1):#f.write(i[j].strip+' ')string = ""for k in i[j].strip():string = string+kf.write(string+' ')     f.write(i[len(i)-1].strip()+"\n")

下面是转换后的结果,可以看出整体的结果还是不错的

命名实体识别实战(BERT)相关推荐

  1. 【项目实战课】基于BiLSTM+CRF的命名实体识别实战

    欢迎大家来到我们的项目实战课,本期内容是<基于BiLSTM+CRF的命名实体识别实战>.所谓项目课,就是以简单的原理回顾+详细的项目实战的模式,针对具体的某一个主题,进行代码级的实战讲解. ...

  2. 【NLP实战系列】Tensorflow命名实体识别实战

    实战是学习一门技术最好的方式,也是深入了解一门技术唯一的方式.因此,NLP专栏计划推出一个实战专栏,让有兴趣的同学在看文章之余也可以自己动手试一试. 本篇介绍自然语言处理中一种非常重要的任务:命名实体 ...

  3. Bi-LSTM-CRF命名实体识别实战

    一.数据集介绍 本项目的数据集来自于天池--基于糖尿病临床指南和研究论文的实体标注构建(瑞金医院MMC人工智能辅助构建知识图谱大赛第一赛季).即提供与糖尿病相关的学术论文以及糖尿病临床指南,要求在学术 ...

  4. Bert实现命名实体识别

    Bert实现命名实体识别 用BERT模型实现对输入的文本,进行NER,具体代码如下: # -*- coding: utf-8 -*- # @Time : 2021-09-25 22:00 # @Aut ...

  5. BERT-BiLSTM-CRF基于BERT预训练的中文命名实体识别TensorFlow实现

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx Tensorflow solution of NER task Using BiLSTM-CR ...

  6. NLP实战:面向中文电子病历的命名实体识别

    一.前言 本篇文章是关于NLP中的中文命名实体识别(Named Entity Recognition,NER)的实战项目,该项目利用了大型预训练语言模型BERT和BiLSTM神经网络结构来进行NER任 ...

  7. 信息抽取实战:命名实体识别NER【ALBERT+Bi-LSTM模型 vs. ALBERT+Bi-LSTM+CRF模型】(附代码)

    实战:命名实体识别NER 目录 实战:命名实体识别NER 一.命名实体识别(NER) 二.BERT的应用 NLP基本任务 查找相似词语 提取文本中的实体 问答中的实体对齐 三.ALBERT ALBER ...

  8. 基于BERT预训练的中文命名实体识别TensorFlow实现

    BERT-BiLSMT-CRF-NER Tensorflow solution of NER task Using BiLSTM-CRF model with Google BERT Fine-tun ...

  9. NLP命名实体识别开源实战教程 | 深度应用

    作者 | 小宋是呢 来源 | CSDN博客 近几年来,基于神经网络的深度学习方法在计算机视觉.语音识别等领域取得了巨大成功,另外在自然语言处理领域也取得了不少进展.在NLP的关键性基础任务-命名实体识 ...

最新文章

  1. 为什么要关闭 MySQL Query Cache?
  2. Linux下的字符集问题
  3. mysql where过滤
  4. Pulsar:一款功能强大的可视化网络足迹扫描平台
  5. HtmlCleaner CleanerProperties 参数配置(转自macken博客,链接:http://macken.iteye.com/blog/1579809)...
  6. 如何使用pyspark
  7. python爬取网易云音乐_手把手教你用Python网络爬虫获取网易云音乐歌曲
  8. 动软代码生成器生成批量代码相关步骤
  9. 批量给pdf加水印,请用这个办法
  10. 金额转换,阿拉伯数字的金额转换成中国传统的形式
  11. mysql数据库应用试卷代号3868_实用数据库期末试卷B卷答题纸
  12. h2支持mysql函数,H2数据库用户自定义函数方法及范例
  13. 10天精读掌握:计算机组成与设计COAD:Patterson and Hennessy 第7天 2018/11.1
  14. mac不显示安装的程序
  15. HTML5 视频网站
  16. C语言班级财务管理系统
  17. 35 米色系网页设计
  18. sklearn中predict_proba用法(注意和predict的区别)
  19. ECCV2020:夜晚深度图估计
  20. GTX960M安装Anaconda+cuda9.0+cudnn v7.6.5+tensorflow-gpu1.8.0

热门文章

  1. 解决W11休眠一段时间后自动关机的问题
  2. 卡片笔记太多,回忆不起来?快用人工智能帮你自动找寻关联
  3. 二维数组或三维数组转换为一维数组
  4. hadoop2x-eclipse-plugin的下载地址
  5. Apache Kylin | 麒麟出没,必有祥瑞
  6. 从Q2财报看后疫情时代陌陌的正确打开方式
  7. EtherCAT偏移时间的理解
  8. 星舆科技:打造下一代定位技术 以高精度位置感知构筑AI+时代基础力量...
  9. C语言求 a+aa+aaa+aaaa+a....a 的值
  10. 基于 STM32G0 采用 USB type-C 的锂电池充电器