基于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. 问题定义 广义的命名实体识别是指识别出待处理文本中三大类(实体类.时间类和数字类).七小类(人名.机构名.地名.日期.货币和百分比)命名实体.但实际应用中不只是识别上述所说的实体类 ...
随机推荐
- Codeforces Round #697 (Div. 3) D. Cleaning the Phone (思维,前缀和)
题意:你的手机有\(n\)个app,每个app的大小为\(a_i\),现在你的手机空间快满了,你需要删掉总共至少\(m\)体积的app,每个app在你心中的珍惜值是\(b_i\),\(b_i\)的取值 ...
- 【noi 2.6_8786】方格取数(DP)
题意:N*N的方格图每格有一个数值,要求从左上角每步往右或往下走到右下角,问走2次的最大和. 解法:走一次的很好想,而走2次,不可误以为先找到最大和的路,再找剩下的最大和的路就是正解.而应该认清动态规 ...
- 1006 How many?
Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 36 Accepted: 2 Description 有一天,小Q给了小J ...
- Codeforces Global Round 7 D2. Prefix-Suffix Palindrome (Hard version)(Manacher算法+输出回文字符串)
This is the hard version of the problem. The difference is the constraint on the sum of lengths of s ...
- .Net反编译实践记录
去壳 去壳可以使用 de4dot,源码在 这里.可用版本 下载地址. 使用方式为:.\de4dot.exe [path] 修改代码 反编译修改代码可以使用 dnSpy,源码在 这里.可用版本 下载地址 ...
- Leetcode(886)-可能的二分法
给定一组 N 人(编号为 1, 2, ..., N), 我们想把每个人分进任意大小的两组. 每个人都可能不喜欢其他人,那么他们不应该属于同一组. 形式上,如果 dislikes[i] = [a, b] ...
- unity编辑器扩展学习
扩展编辑器实际上就是在unity菜单栏中添加一些按钮,可以一键执行一些重复性的工作. 一.添加按钮 1.简单使用MenuItem特性 using UnityEngine; using UnityEdi ...
- The best Fibonacci is achieved in js
The best Fibonacci is achieved in js the best realized by using js 斐波那契数列 "use strict"; /* ...
- CSS multi colors circle
CSS multi colors circle <!DOCTYPE html> <html lang="zh-Hans"> <head> < ...
- jest all in one
jest all in one ES Modules & TypeScript & React https://github.com/xgqfrms/FEAT/tree/master/ ...