基于keras实现的中文实体识别
1、简介
NER(Named Entity Recognition,命名实体识别)又称作专名识别,是自然语言处理中常见的一项任务,使用的范围非常广。命名实体通常指的是文本中具有特别意义或者指代性非常强的实体,通常包括人名、地名、机构名、时间、专有名词等。NER系统就是从非结构化的文本中抽取出上述实体,并且可以按照业务需求识别出更多类别的实体,比如产品名称、型号、价格等。
命名实体识别是信息提取、问答系统、句法分析、机器翻译等应用领域的重要基础工具,作为结构化信息提取的重要步骤。
2、常见算法
2.1、基于规则和词典的方法
基于规则和词典的方法是命名实体识别中最早使用的方法,多采用语言学专家构造规则模板,选用特征包括统计信息、标点符号、关键字、指示词和方向词、位置词、中心词等方法,以模式和字符串相匹配为主要手段,这类系统大多依赖于知识库和词典的建立。
2.2、基于统计的方法
基于统计机器学习的方法主要包括:隐马尔可夫模型、最大熵、支持向量机、条件随机场等。
在这4种学习方法中,最大熵模型结构紧凑,具有较好的通用性,主要缺点是训练时间复杂性非常高,有时甚至导致训练代价难以承受,另外由于需要明确的归一化计算,导致开销比较大。而条件随机场为命名实体识别提供了一个特征灵活、全局最优的标注框架,但同时存在收敛速度慢、训练时间长的问题。一般说来,最大熵和支持向量机在正确率上要比隐马尔可夫模型高一些,但是隐马尔可夫模型在训练和识别时的速度要快一些,主要是由于在利用维特比算法求解命名实体类别序列的效率较高。隐马尔可夫模型更适用于一些对实时性有要求以及像信息检索这样需要处理大量文本的应用,如短文本命名实体识别。
2.3、基于深度学习的方法
随着深度学习的兴起,RNN、LSTM、Bi-LSTM等模型已经被证明在NLP任务上有着良好的表现。相比传统模型,RNN能够考虑长远的上下文信息,并且能够解决CRF特征选择的问题,可以将主要的精力花在网络设计和参数调优上,但RNN一般需要较大的训练数据,在小规模数据集上,CRF表现较好。
3、中文实体识别
目前比较流行的做法是将Bi-LISTM和CRF进行结合,借鉴两个模型各自的优点,来达到更好的效果。模型图如下:
LSTM的全称是Long Short-Term Memory,它是RNN(Recurrent Neural Network)的一种。LSTM由于其设计的特点,非常适合用于对时序数据的建模,如文本数据。Bi-LSTM是Bi-directional Long Short-Term Memory的缩写,是由前向LSTM与后向LSTM组合而成。两者在自然语言处理任务中都常被用来建模上下文信息。
CRF(Conditional random field,条件随机场)是一种判别式模型,是给定一组输入随机变量条件下另一组输出随机变量的条件概率分布模型。
3.1 实体类别定义
实体类别包括以下6种:
time: 时间
location: 地点
person_name: 人名
org_name: 组织名
company_name: 公司名
product_name: 产品名
3.2 数据标注
采用UTF-8进行编码,每行为一个段落标注。所有的实体以如下的格式进行标注:
{{实体类型:实体文本}}
示例:
此次{{location:中国}}个展,{{person_name:苏珊}}将与她80多岁高龄的父亲一起合作,哼唱一首古老的{{location:威尔士}}民歌{{product_name:《白蜡林》}}。届时在{{location:画廊大厅}}中将安放6个音箱进行播放,艺术家还特意回到家乡{{location:格拉斯哥}},同父亲一起在{{org_name:中国音乐学院}}里为作品录制了具有{{location:中国}}元素的音乐片段。
3.3 标签体系
对于NER任务,常见的标签体系包括IO、BIO、BMEWO、BMEWO+。下面举例说明不同标签体系的区别。
大部分情况下,标签体系越复杂准确度也越高,但相应的训练时间也会增加。因此需要根据实际情况选择合适的标签体系。这里选择和分词系统类似的BMEWO标签体系。
3.4 环境搭建
基于keras + tensorflow实现Bi-LSTM + CRF实体识别。目前使用2.2.4版本的keras,在keras版本里面已经包含bilstm模型,但crf的loss function还没有,可以从keras contribute中获得,具体可参看:
https://github.com/keras-team/keras-contrib
环境搭建请参考这篇博文: https://www.cnblogs.com/MikeZhang/p/createKerasEnv-20210228.html
3.5 示例代码
训练代码:
#! /usr/bin/env python3
#-*- coding:utf-8 -*- import process_data,os
from bilsm_crf_model import create_model os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
EPOCHS = 1 (train_x, train_y), (test_x, test_y), (vocab, chunk_tags) = process_data.load_data()
model = create_model(len(vocab),len(chunk_tags))
# train model
model.fit(train_x, train_y,batch_size=128,epochs=EPOCHS, validation_data=[test_x, test_y])
model.save('model/ner_crf.h5')
测试代码:
#! /usr/bin/env python3
#-*- coding:utf-8 -*- import bilsm_crf_model
import process_data
import numpy as np
import pickle def doParse(predict_text):
model,vocab,chunk_tags = None,None,None
with open('model/config.pkl', 'rb') as inp:
(vocab, chunk_tags) = pickle.load(inp)
model = bilsm_crf_model.create_model(len(vocab),len(chunk_tags))
if not model : return None
model.load_weights('model/ner_crf.h5') str,length = process_data.process_data(predict_text, vocab)
raw = model.predict(str)[0][-length:]
result = [np.argmax(row) for row in raw]
result_tags = [chunk_tags[i] for i in result] per, loc, org,company,product = '', '', '','',''
#print(result_tags)
resultMap = {}
for s, t in zip(predict_text, result_tags):
#print(s,t)
if 'O' == t : continue
key = t[2:]
if t.startswith('B_'):
if key not in resultMap : resultMap[key] = ''
resultMap[key] += ' ' + s
else:
resultMap[key] += s
return resultMap predict_text = '中华人民共和国国务院总理在外交部长的陪同下,连续访问了埃塞俄比亚等非洲10国以及阿尔巴尼亚'
resultMap = doParse(predict_text)
print(predict_text)
for k,v in resultMap.items():
print("%s : %s" % (k,v))
示例代码目录结构:
本文涉代码及资源下载地址:https://pan.baidu.com/s/1w9T_mDxwqfzQ3Xf8_3FLrw
可关注微信公众号(聊聊博文)后回复 2021022801 获取提取码。
基于keras实现的中文实体识别的更多相关文章
- 基于LeNet网络的中文验证码识别
基于LeNet网络的中文验证码识别 由于公司需要进行了中文验证码的图片识别开发,最近一段时间刚忙完上线,好不容易闲下来就继上篇<基于Windows10 x64+visual Studio2013 ...
- 自然语言处理工具python调用hanlp中文实体识别
Hanlp作为一款重要的中文分词工具,在GitHub的用户量已经非常之高,应该可以看得出来大家对于hanlp这款分词工具还是很认可的.本篇继续分享一篇关于hanlp的使用实例即Python调用hanl ...
- 使用Python基于HyperLPR/Mask-RCNN的中文车牌识别
基于HyperLPR的中文车牌识别 Bolg:https://blog.csdn.net/lsy17096535/article/details/78648170 https://www.jiansh ...
- 用IDCNN和CRF做端到端的中文实体识别
实体识别和关系抽取是例如构建知识图谱等上层自然语言处理应用的基础.实体识别可以简单理解为一个序列标注问题:给定一个句子,为句子序列中的每一个字做标注.因为同是序列标注问题,除去实体识别之外,相同的技术 ...
- PyTorch 高级实战教程:基于 BI-LSTM CRF 实现命名实体识别和中文分词
前言:译者实测 PyTorch 代码非常简洁易懂,只需要将中文分词的数据集预处理成作者提到的格式,即可很快的就迁移了这个代码到中文分词中,相关的代码后续将会分享. 具体的数据格式,这种方式并不适合处理 ...
- 卷积神经网络(CNN)学习算法之----基于LeNet网络的中文验证码识别
由于公司需要进行了中文验证码的图片识别开发,最近一段时间刚忙完上线,好不容易闲下来就继上篇<基于Windows10 x64+visual Studio2013+Python2.7.12环境下的C ...
- 基于BERT预训练的中文命名实体识别TensorFlow实现
BERT-BiLSMT-CRF-NERTensorflow solution of NER task Using BiLSTM-CRF model with Google BERT Fine-tuni ...
- 基于分布式的短文本命题实体识别之----人名识别(python实现)
目前对中文分词精度影响最大的主要是两方面:未登录词的识别和歧义切分. 据统计:未登录词中中文姓人名在文本中一般只占2%左右,但这其中高达50%以上的人名会产生切分错误.在所有的分词错误中,与人名有关的 ...
- 【NER】对命名实体识别(槽位填充)的一些认识
命名实体识别 1. 问题定义 广义的命名实体识别是指识别出待处理文本中三大类(实体类.时间类和数字类).七小类(人名.机构名.地名.日期.货币和百分比)命名实体.但实际应用中不只是识别上述所说的实体类 ...
随机推荐
- SOLID:面向对象设计的五个基本原则
在程序设计领域,SOLID 是由罗伯特·C·马丁在 21 世纪早期引入的记忆术首字母缩略字,指代了面向对象编程和面向对象设计的五个基本原则.当这些原则被一起应用时,它们使得一个程序员开发一个容易进行软 ...
- 牛客NC15879 A Simple Problem
传送门:A Simple Problem 题意 给定两个序列s1和s2,同样的数字可以用相同的别的数字代替(并且也可以是出现过的数字),问s2在s1中出现了几次. 题解 首先预处理一下这两个序列,因为 ...
- POJ 1743 Musical Theme【SAM】
POJ1743 Musical Theme 要找长度\(\ge 5\)且出现次数\(\ge 2\)并且第一次出现和最后一次出现不重叠的最长子串. 题目条件中,如果对于两个串,在一个串的每个数上都加上相 ...
- Second My Problem First HDU - 3706 单调队列
单调队列 单调队列是指一个队列内部的元素具有严格单调性的一种数据结构,分为单调递增队列和单调递减队列. 单调队列满足两个性质 1.单调队列必须满足从队头到队尾的严格单调性. 2.排在队列前面的比排在队 ...
- Superset 1.0.1发布——稳定版本
Apache Superset最近发布了1.0.1版本,这也是1.0版本后的有一个重大的版本,Superset也会在以后有更多的改进.那么让我们来看一下最新的新功能吧. 用户体验 通过更简单,更直观的 ...
- 主动降噪,通话降噪及AI降噪之辨
近日,三星发布的Buds Pro 耳机中,宣传有以下功能.其中涉及到噪声的,有主动降噪,通话降噪及智能降噪,很多人对他们的具体用途容易混淆,今天我们来辨析一下. 主动降噪和通话降噪完全不是一个概念,无 ...
- 通过k8s部署dubbo微服务并接入ELK架构
需要这样一套日志收集.分析的系统: 收集 -- 能够采集多种来源的日志数据 (流式日志收集器) 传输 -- 能够稳定的把日志数据传输到中央系统 (消息队列) 存储 -- 可以将日志以结构化数据的形式存 ...
- codeforces 11B Jumping Jack
Jack is working on his jumping skills recently. Currently he's located at point zero of the number l ...
- 计算机网络 part3 HTTP&HTTPS
一.HTTP references: HTTP [HTTP协议]---HTTP协议详解 1.概述.特点 HTTP(超文本传输协议)是一种规定了浏览器和万维网服务器通信规则的协议.客户端和服务端的指定接 ...
- Stack Overflow Skill IQ Testing All In One
Stack Overflow Skill IQ Testing All In One Pluralsight IQ | Stack Overflow https://www.pluralsight.c ...