在文章NLP(二十四)利用ALBERT实现命名实体识别中,笔者介绍了ALBERT+Bi-LSTM模型在命名实体识别方面的应用。
  在本文中,笔者将介绍如何实现ALBERT+Bi-LSTM+CRF模型,以及在人民日报NER数据集和CLUENER数据集上的表现。
  功能项目方面的介绍里面不再多介绍,笔者只介绍模型训练和模型预测部分的代码。项目方面的代码可以参考文章NLP(二十四)利用ALBERT实现命名实体识别,模型为ALBERT+Bi-LSTM+CRF,结构图如下:

模型训练的代码(albert_model_train.py)中新增导入keras-contrib模块中的CRF层:

from keras_contrib.layers import CRF
from keras_contrib.losses import crf_loss
from keras_contrib.metrics import crf_accuracy, crf_viterbi_accuracy

模型方面的代码如下:

# Build model
def build_model(max_para_length, n_tags):# Bert Embeddingsbert_output = Input(shape=(max_para_length, 312, ), name="bert_output")# LSTM modellstm = Bidirectional(LSTM(units=128, return_sequences=True), name="bi_lstm")(bert_output)drop = Dropout(0.1, name="dropout")(lstm)dense = TimeDistributed(Dense(n_tags, activation="softmax"), name="time_distributed")(drop)crf = CRF(n_tags)out = crf(dense)model = Model(inputs=bert_output, outputs=out)# model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])model.compile(loss=crf.loss_function, optimizer='adam', metrics=[crf.accuracy])# 模型结构总结model.summary()plot_model(model, to_file="albert_bi_lstm.png", show_shapes=True)return model

设置文本的最大长度MAX_SEQ_LEN = 128,训练10个epoch,在测试集上的F1值(利用seqeval模块评估)输出如下:

           precision    recall  f1-score   supportLOC     0.9766    0.9032    0.9385      3658ORG     0.9700    0.9465    0.9581      2185PER     0.9880    0.9721    0.9800      1864micro avg     0.9775    0.9321    0.9543      7707
macro avg     0.9775    0.9321    0.9541      7707

之前用ALBERT+Bi-LSTM模型得到的F1值为91.96%,而ALBERT+Bi-LSTM+CRF模型能达到95.43%,提升效果不错。
  模型预测代码(model_predict.py)如下:

# -*- coding: utf-8 -*-
# author: Jclian91
# place: Pudong Shanghai
# time: 2020-03-11 13:16
import json
import numpy as np
from keras_contrib.layers import CRF
from keras_contrib.losses import crf_loss
from keras_contrib.metrics import crf_accuracy, crf_viterbi_accuracy
from keras.models import load_model
from collections import defaultdict
from pprint import pprintfrom utils import MAX_SEQ_LEN, event_type
from albert_zh.extract_feature import BertVector# 读取label2id字典
with open("%s_label2id.json" % event_type, "r", encoding="utf-8") as h:label_id_dict = json.loads(h.read())id_label_dict = {v: k for k, v in label_id_dict.items()}# 利用ALBERT提取文本特征
bert_model = BertVector(pooling_strategy="NONE", max_seq_len=MAX_SEQ_LEN)
f = lambda text: bert_model.encode([text])["encodes"][0]# 载入模型
custom_objects = {'CRF': CRF, 'crf_loss': crf_loss, 'crf_viterbi_accuracy': crf_viterbi_accuracy}
ner_model = load_model("%s_ner.h5" % event_type, custom_objects=custom_objects)# 从预测的标签列表中获取实体
def get_entity(sent, tags_list):entity_dict = defaultdict(list)i = 0for char, tag in zip(sent, tags_list):if 'B-' in tag:entity = charj = i+1entity_type = tag.split('-')[-1]while j < min(len(sent), len(tags_list)) and 'I-%s' % entity_type in tags_list[j]:entity += sent[j]j += 1entity_dict[entity_type].append(entity)i += 1return dict(entity_dict)# 输入句子,进行预测
while 1:# 输入句子text = input("Please enter an sentence: ").replace(' ', '')# 利用训练好的模型进行预测train_x = np.array([f(text)])y = np.argmax(ner_model.predict(train_x), axis=2)y = [id_label_dict[_] for _ in y[0] if _]# 输出预测结果pprint(get_entity(text, y))

在网上找几条新闻,预测结果如下:

Please enter an sentence: 驴妈妈旅游网创始人洪清华近日接受媒体采访谈及驴妈妈的发展模式时表示:现在,电商有两种做法——小而美的电商追求盈利,大而全的电商钟情规模。
{'PER': ['洪清华']}
Please enter an sentence: EF英孚教育集团是全球最大的私人英语教育机构,主要致力于英语培训、留学旅游以及英语文化交流等方面。
{'ORG': ['EF英孚教育集团']}
Please enter an sentence: 宋元时期起,在台湾早期开发的过程中,中华文化传统已随着大陆垦民传入台湾。
{'LOC': ['台湾', '中华', '台湾']}
Please enter an sentence: 吸引了众多投资者来津发展,康师傅红烧牛肉面就是于1992年在天津诞生。
{'LOC': ['天津']}
Please enter an sentence: 经过激烈角逐,那英战队成功晋级16强的学员有实力非凡的姚贝娜、挚情感打动观众的朱克、音乐创作能力十分突出的侯磊。
{'PER': ['姚贝娜', '朱克', '侯磊']}

  接下来我们看看该模型在CLUENER数据集上的表现。CLUENER数据集是在清华大学开源的文本分类数据集THUCTC基础上,选出部分数据进行细粒度命名实体标注,原数据来源于Sina News RSS,实体有:地址(address),书名(book),公司(company),游戏(game),政府(goverment),电影(movie),姓名(name),组织机构(organization),职位(position),景点(scene),该数据集的介绍网站为:https://www.cluebenchmarks.com/introduce.html 。
  下载数据集,用脚本将其处理成模型支持的数据格式,因为缺少test数据集,故模型评测的时候用dev数据集代替。设置模型的文本最大长度MAX_SEQ_LEN = 128,训练10个epoch,在测试集上的F1值(利用seqeval模块评估)输出如下:

sentences length: 10748
last sentence:  艺术家也讨厌画廊的老板,内心恨他们,这样的话,你是在这样的状态下,两年都是一次性合作,甚至两年、
start ALBERT encding
end ALBERT encoding
sentences length: 1343
last sentence:  另外意大利的PlayGeneration杂志也刚刚给出了92%的高分。
start ALBERT encding
end ALBERT encoding
sentences length: 1343
last sentence:  另外意大利的PlayGeneration杂志也刚刚给出了92%的高分。
start ALBERT encding
end ALBERT encoding
......
.......precision    recall  f1-score   supportbook     0.9343    0.8421    0.8858       152position     0.9549    0.8965    0.9248       425government     0.9372    0.9180    0.9275       244game     0.6968    0.6725    0.6844       287
organization     0.8836    0.8605    0.8719       344company     0.8659    0.7760    0.8184       366address     0.8394    0.8187    0.8289       364movie     0.9217    0.7067    0.8000       150name     0.8771    0.8071    0.8406       451scene     0.9939    0.8191    0.8981       199micro avg     0.8817    0.8172    0.8482      2982macro avg     0.8835    0.8172    0.8482      2982

在网上找几条新闻,预测结果如下:

Please enter an sentence: 据中山外侨局消息,近日,秘鲁国会议员、祖籍中山市开发区的玛利亚·洪大女士在秘鲁国会大厦亲切会见了中山市人民政府副市长冯煜荣一行,对中山市友好代表团的来访表示热烈的欢迎。
{'address': ['中山市开发区', '秘鲁国会大厦'],'government': ['中山外侨局', '秘鲁国会', '中山市人民政府'],'name': ['玛利亚·洪大', '冯煜荣'],'position': ['议员', '副市长']}Please enter an sentence: “隔离结束回来,发现公司不见了”,网上的段子,真发生在了昆山达鑫电子有限公司员工身上。
{'company': ['昆山达鑫电子有限公司']}
Please enter an sentence: 由黄子韬、易烊千玺、胡冰卿、王子腾等一众青年演员主演的热血励志剧《热血同行》正在热播中。
{'game': ['《热血同行》'], 'name': ['黄子韬', '易烊千玺', '胡冰卿', '王子腾'], 'position': ['演员']}
Please enter an sentence: 近日,由作家出版社主办的韩作荣《天生我才——李白传》新书发布会在京举行
{'book': ['《天生我才——李白传》'], 'name': ['韩作荣'], 'organization': ['作家出版社']}

  本项目已经开源,Github网址为:https://github.com/percent4/ALBERT_NER_KERAS 。
  本文到此结束,感谢大家阅读,欢迎关注笔者的微信公众号:Python爬虫与算法。

NLP(二十五)实现ALBERT+Bi-LSTM+CRF模型相关推荐

  1. TensorFlow学习笔记(二十五)CNN的9大模型

    接触深度学习已经有半年了,从最开始的caffe到后来的keras,前面2个框架差不多就是配好环境,并没有做什么东西,后来google的tensorflow,我驻足在这里,决定多花点时间,写点demo, ...

  2. Python之精心整理的二十五个文本提取及NLP相关的处理案例

    一.提取 PDF 内容 # pip install PyPDF2 安装 PyPDF2 import PyPDF2 from PyPDF2 import PdfFileReader# Creating ...

  3. 二十五个深度学习相关公开数据集

    转 [干货]二十五个深度学习相关公开数据集 2018年04月18日 13:42:53 阅读数:758 (选自Analytics Vidhya:作者:Pranav Dar:磐石编译) 目录 介绍 图像处 ...

  4. 2021年大数据Hadoop(二十五):YARN通俗介绍和基本架构

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 YARN通俗介绍和基本架构 Yarn通俗介绍 Yarn基本 ...

  5. VMware vSphere 服务器虚拟化之二十五 桌面虚拟化之终端服务池

    VMware vSphere 服务器虚拟化之二十五 桌面虚拟化之终端服务池 终端服务池是指由一台或多台微软终端服务器提供服务的桌面源组成的池.终端服务器桌面源可交付多个桌面.它具有以下特征: 1.终端 ...

  6. 未处理异常和C++异常——Windows核心编程学习手札之二十五

    未处理异常和C++异常 --Windows核心编程学习手札之二十五 当一个异常过滤器返回EXCEPTION_CONTINUE_SEARCH标识符时是告诉系统继续上溯调用树,寻找另外的异常过滤器,但当每 ...

  7. linux exec 二程序,二十五、Linux 进程与信号---exec函数

    25.1 介绍 在用 fork 函数创建子进程后,子进程往往要调用一种 exec 函数以执行另一个程序 当进程调用一种 exec 函数时,该进程完全由新程序代换,替换原有进程的正文,而新程序则从其 m ...

  8. 二十五、求单点的最短路径

    二十五.求单点的最短路径 文章目录 二十五.求单点的最短路径 题目描述 解题思路 上机代码 题目描述 求从指定源点出发到各个顶点的最短路径. **假设:**图中结点名均为单个互不相同的字母,权值均&g ...

  9. SAP UI5 初学者教程之二十五 - 使用代理服务器解决 SAP UI5 应用访问远端 OData 服务的跨域问题试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 初学者教程之一:Hello World SAP UI5 初学者教程之二:SAP UI5 ...

  10. FreeSql (二十五)延时加载

    FreeSql 支持导航属性延时加载,即当我们需要用到的时候才进行加载(读取),支持1对1.多对1.1对多.多对多关系的导航属性. 当我们希望浏览某条订单信息的时候,才显示其对应的订单详细记录时,我们 ...

最新文章

  1. 有感于“政府傍大款”----谈中小企业融资问题
  2. python中isinstance(3、object)_Python中为什么推荐使用isinstance来进行类型判断?而不是type...
  3. 在某些输入上删除IE10的“清除字段”X按钮?
  4. WebService:设置服务器提供SOAP1.2的服务
  5. 科普向--详解JavaScript中的数据类型
  6. win7系统下载 ghost win7 Sp1 64位纯净3月版
  7. argument list too long 错误的处理
  8. java8与hibernate_如何在JPA和Hibernate中使用Java 8 LocalDateTime
  9. 【岗位详情】腾讯广告机制策略算法工程师(北京)
  10. mybatis plus 批量更新数据_Mybatis 多字段组合唯一 并批量添加不重复数据
  11. Js 跨域CORS报错 Response for preflight has invalid HTTP status code 405
  12. 解决windows系统无法对docker容器进行端口映射的问题
  13. Cocos2D-X2.2.3学习笔记9(处理重力感应事件,移植到Android加入两次返回退出游戏效果)...
  14. jfreeChart生成报表
  15. 玄幻小说收藏(偶尔带点科幻、都市)
  16. 事后诸葛亮分析(小小大佬带飞队)
  17. 当前疫情下火爆的直播应用,你了解背后的技术架构吗?
  18. vue文件下载及重命名
  19. 微信“商家转账到零钱“功能接入以及如何获得转账结果?
  20. java swing表格翻页_让Swing表格支持远程后台数据翻页

热门文章

  1. DelphiXE7操作sqlite数据库
  2. 数据库故障诊断(Troubleshooting)之性能问题导致的数据库严重故障案例之一
  3. passive-interface OSPF 的被动接口
  4. batch文件常用命令
  5. Kubernetes原生CI/CD构建框架Tekton详解
  6. modx注册码_MODX:您从未使用过的最佳CMS?
  7. 嵌入式Linux常用命令
  8. C语言 —— 数组(数组的声明、初始化、访问)与字符串指针
  9. 传统的招投标or在线招投标
  10. Java 获取当前年 、当前月