基于keras的BiLstm与CRF实现命名实体标注

crf的实现 keras_keras 解决加载lstm+crf模型出错的问题 错误展示new_model = load_model(“model.h5”)报错:1、keras load_model valueerror: unknown layer :crf2、keras load_model valueerror: unknown loss function:crf_loss错误修改1、load_model修改源码:custom_objects = none 改为 def... 阅读详情

https://www.cnblogs.com/vipyoumay/p/ner-chinese-keras.html

众所周知,通过Bilstm已经可以实现分词或命名实体标注了,同样地单独的CRF也可以很好的实现。既然LSTM都已经可以预测了,为啥要搞一个LSTM+CRF的hybrid model? 因为单独LSTM预测出来的标注可能会出现(I-Organization->I-Person,B-Organization ->I-Person)这样的问题序列。

但这种错误在CRF中是不存在的,因为CRF的特征函数的存在就是为了对输入序列观察、学习各种特征,这些特征就是在限定窗口size下的各种词之间的关系。

将CRF接在LSTM网络的输出结果后,让LSTM负责在CRF的特征限定下,依照新的loss function,学习出新的模型。

基于字的模型标注:

假定我们使用Bakeoff-3评测中所采用的的BIO标注集,即B-PER、I-PER代表人名首字、人名非首字,B-ORG、I-ORG代表组织机构名首字、组织机构名非首字,O代表该字不属于命名实体的一部分

  • B-Person
  • I- Person
  • B-Organization
  • I-Organization
  • O

加入CRF layer对LSTM网络输出结果的影响

为直观的看到加入后的区别我们可以借用网络中的图来表示:其中xx表示输入的句子,包含5个字分别用w1w1,w2w2,w3w3,w4w4,w5w5表示

没有CRF layer的网络示意图

Figure 1.3: The BiLSTM model with out CRF layer output correct labels

含有CRF layer的网络输出示意图

Figure 1.2: The meaning of outputs of BiLSTM layer

上图可以看到在没有CRF layer的情况下出现了 B-Person->I-Person 的序列,而在有CRF layer层的网络中,我们将 LSTM 的输出再次送入CRF layer中计算新的结果。而在CRF layer中会加入一些限制,以排除可能会出现上文所提及的不合法的情况

CRF loss function

CRF loss function 如下:
Loss Function = PRealPathP1+P2+…+PNPRealPathP1+P2+…+PN

主要包括两个部分Real path score 和 total path scroe

1、Real path score

PRealPathPRealPath =eSieSi

因此重点在于求出:

SiSi = EmissionScore + TransitionScore

EmissionScore=x0,START+x1,B−Person+x2,I−Person+x3,O+x4,B−Organization+x5,O+x6,ENDx0,START+x1,B−Person+x2,I−Person+x3,O+x4,B−Organization+x5,O+x6,END

2018-03-26-16-32-18

因此根据转移概率和发射概率很容易求出PRealPathPRealPath

2、total score

total scroe的计算相对比较复杂,可参看https://createmomo.github.io/2017/11/11/CRF-Layer-on-the-Top-of-BiLSTM-5/

实现代码(keras版本)

1、搭建网络模型

使用2.1.4版本的keras,在keras版本里面已经包含bilstm模型,但crf的loss function还没有,不过可以从keras contribute中获得,具体可参看:https://github.com/keras-team/keras-contrib

构建网络模型代码如下:

    model = Sequential()
    model.add(Embedding(len(vocab), EMBED_DIM, mask_zero=True))  # Random embedding
    model.add(Bidirectional(LSTM(BiRNN_UNITS // 2, return_sequences=True)))
    crf = CRF(len(chunk_tags), sparse_target=True)
    model.add(crf)
    model.summary()
    model.compile('adam', loss=crf.loss_function, metrics=[crf.accuracy])

2、清洗数据

清晰数据是最麻烦的一步,首先我们采用网上开源的语料库作为训练和测试数据。语料库中已经做好了标记,其格式如下:

月 O
油 O
印 O
的 O
《 O
北 B-LOC
京 I-LOC
文 O
物 O
保 O
存 O
保 O
管 O

语料库中对每一个字分别进行标记,比较包括如下几种:

'O', 'B-PER', 'I-PER', 'B-LOC', 'I-LOC', "B-ORG", "I-ORG"

分别表示,其他,人名第一个,人名非第一个,位置第一个,位置非第一个,组织第一个,非组织第一个

    train = _parse_data(open('data/train_data.data', 'rb'))
    test = _parse_data(open('data/test_data.data', 'rb'))

    word_counts = Counter(row[0].lower() for sample in train for row in sample)
    vocab = [w for w, f in iter(word_counts.items()) if f >= 2]
    chunk_tags = ['O', 'B-PER', 'I-PER', 'B-LOC', 'I-LOC', "B-ORG", "I-ORG"]

    # save initial config data
    with open('model/config.pkl', 'wb') as outp:
        pickle.dump((vocab, chunk_tags), outp)

    train = _process_data(train, vocab, chunk_tags)
    test = _process_data(test, vocab, chunk_tags)
    return train, test, (vocab, chunk_tags)

3、训练数据

在处理好数据后可以训练数据,本文中将batch-size=16获得较为高的accuracy(99%左右),进行了10个epoch的训练。

import bilsm_crf_model

EPOCHS = 10
model, (train_x, train_y), (test_x, test_y) = bilsm_crf_model.create_model()
# train model
model.fit(train_x, train_y,batch_size=16,epochs=EPOCHS, validation_data=[test_x, test_y])
model.save('model/crf.h5')

4、验证数据

import bilsm_crf_model
import process_data
import numpy as np

model, (vocab, chunk_tags) = bilsm_crf_model.create_model(train=False)
predict_text = '中华人民共和国国务院总理周恩来在外交部长陈毅的陪同下,连续访问了埃塞俄比亚等非洲10国以及阿尔巴尼亚'
str, length = process_data.process_data(predict_text, vocab)
model.load_weights('model/crf.h5')
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 = '', '', ''

for s, t in zip(predict_text, result_tags):
    if t in ('B-PER', 'I-PER'):
        per += ' ' + s if (t == 'B-PER') else s
    if t in ('B-ORG', 'I-ORG'):
        org += ' ' + s if (t == 'B-ORG') else s
    if t in ('B-LOC', 'I-LOC'):
        loc += ' ' + s if (t == 'B-LOC') else s

print(['person:' + per, 'location:' + loc, 'organzation:' + org])

输出结果如下:

['person: 周恩来 陈毅, 王东', 'location: 埃塞俄比亚 非洲 阿尔巴尼亚', 'organzation: 中华人民共和国国务院 外交部']

源码地址:https://github.com/stephen-v/zh-NER-keras

以上内容有任何错误或不准确的地方请大家指正,不喜勿喷! 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如果觉得还有帮助的话,可以点一下右下角的【推荐】,希望能够持续的为大家带来好的技术文章!想跟我一起进步么?那就【关注】我吧。

BiLSTM介绍 BiLSTM的理解以及介绍 阅读详情

相关推荐

基于keras与keras-contrib:biLSTM+CRF的命名实体标注模型 常见安装报错问题

keras-contrib与keras版本问题小结 基于keras与keras-contrib:biLSTM+CRF的命名实体标注模型 1.ubuntun产看keras和tensorflow版本 键入python(进入python)然后输入如下命令,查看其他库的版本是一样的操作 2.改变keras版本(以2.2.2为例): pip install --upgrade keras==2.2.2...

Yolo_C的博客 4978

CRF的keras实现(tensorflow_addons)

为了在分类问题中使用 CRF(条件随机场,Conditional Random Field)层,首先我们需要使用一个合适的 Keras 实现。虽然 Keras 本身并不直接提供 CRF 层的实现,但我们可以使用第三方库,如,其中包含了 CRF 层的实现。假设你已经安装了,下面是一个将 CRF 与全连接网络结合的示例。

baidu_39157459的博客 696

BiLSTM实战:用Keras构建双向LSTM模型处理序列数据(附完整代码)

本文通过命名实体识别(NER)实战案例,详细介绍了如何使用Keras构建和优化双向长短期记忆网络(BiLSTM)模型来处理序列数据。内容涵盖从数据预处理、基础与增强版BiLSTM模型搭建(包括注意力机制和CRF层)、模型训练调优到最终评估部署的完整流程,并提供了可运行的完整代码,帮助开发者掌握这一强大的深度学习工具。

weixin_29165725的博客 279

Python BiLSTM_CRF实现代码,电子病历命名实体识别和关系抽取,序列标注

Python BiLSTM_CRF实现代码,电子病历命名实体识别和关系抽取,序列标注

L_goodboy的博客 2291

Python-使用keras实现的基于BiLSTMCRF的中文分词词性标注

使用keras实现的基于Bi-LSTM CRF的中文分词 词性标注

企业微信微盘API权限避坑指南:为什么你的Python脚本无法获取文件列表?

本文深入解析了企业微信微盘API的权限模型,解释了为何即使使用超级管理员账号,Python脚本也可能因权限不足而无法获取文件列表。核心在于微盘API基于“应用身份”而非“用户身份”进行校验,应用只能访问自身创建的空间。文章提供了构建文件上传代理、利用事件回调等合规的替代方案,帮助企业实现高效数据同步。

weixin_29322553的博客 523

双向长短期记忆网络(BiLSTM)详解

双向长短期记忆网络BiLSTM

敷衍zgf的博客 10万+

Clock Gating设计陷阱:为什么你的ICG cell总是导致setup violation?(附解决方案)

本文深入分析了数字IC设计中ICG(Integrated Clock Gating)单元导致setup时序违规的常见问题,包括时钟偏斜和数据路径过长两大核心原因。通过量化分析影响因素,提供了逻辑重组、寄存器重定时等优化策略,并介绍了预防性设计方法和物理实现阶段的优化技巧,帮助工程师有效解决ICG相关的setup violation问题。

weixin_29168153的博客 202

Keras实现BiLSTM+CRF中文命名实体识别--实战篇(序列标注)

本文主要是利用Keras框架搭建BiLSTM+CRF的序列标注模型,完成中文的命名实体识别任务。这里使用的数据集是提前处理过的,已经转成命名实体识别需要的“BIO”标注格式。 详细代码和数据:https://github.com/huanghao128/zh-nlp-demo 输入的训练阿虎局格式如下: ...

qq_35549634的博客 4447

【Claude Code 源码解析教程】总体大纲

本教程旨在深入解析 Anthropic Claude Code 项目的源码架构和实现细节。Claude Code 是一个基于 TypeScript + Bun 构建的 AI 编程助手 CLI 工具,代号 "Tengu",具有复杂的多模块架构和丰富的功能特性。本教程基于Claude Code 的源码分析来生成,将帮助您全面掌握 Claude Code 的源码架构和实现细节,为开发类似 AI 编程助手工具奠定坚实基础。

rengang66的博客 386

软考中级-软件设计师 Python基础

软考中级-软件设计师 Python知识点整理

片言可决讼,半纸能缚龙 3641

keras 使用条件随机场 bilstm+crf

1. 安装Keras-contrib,参考keras-contrib : Keras community contributions。 步骤如下, # 下载 keras-contrib 仓库,建议放在 anaconda/Lib/sit-packages 下 # 安装 keras 版本如下即可,如需安装 tensorflow 版本,需要先运行 convert_to_tf_keras...

zimosangtian的专栏 1179

Codex 100个真实案例 - 用AI画业务流程图Mermaid(产品经理都馋哭了)

还在用 Visio、ProcessOn 拖拖拽拽画流程图?改一个箭头方向就要调半天?本案例教你用 Codex 自然语言描述业务流程,AI 自动转为 Mermaid 代码,一秒生成专业流程图、时序图、甘特图、饼图!还能搭建在线渲染工具、批量导出 PNG/SVG、集成到文档系统。产品经理、架构师、项目经理都能用,从此画图再也不是体力活!

yueyeguzhuo的专栏 344

如何利用Kashgari实现中文命名实体识别:从入门到精通

Kashgari是一个基于tf.keras构建的生产级NLP迁移学习框架,专为文本标注和文本分类任务设计,支持Word2Vec、BERT和GPT2等语言嵌入技术。本文将带您快速掌握使用Kashgari实现中文命名实体识别(NER)的完整流程,从环境搭建到模型训练与优化,让您在5分钟内构建专业级NER模型。 ## 📋 准备工作:环境搭建与项目获取 ### 1. 安装Kashgari框架 首先确

gitblog_01094的博客 846

YOLO11改进-模块-引入多尺度差异融合模块MDFM

MDFM主要用于融合双时相图像特征并生成带有丰富上下文信息的差异特征,其过程包含以下步骤:1. 特征提取与差异特征生成首先从双时相图像中提取特征f1和f2,然后将f1和f2进行像素级别的相减,再对相减结果取绝对值,最后通过一个3x3的卷积操作得到Di。2. 多尺度特征融合(MSFF)接着利用多尺度特征学习机制来增强特征融合效果。该机制通过不同核大小的卷积构建多尺度融合过程,具体是通过一个名为 MSFF 单元来实现的。

qq_64693987的博客 4378

刷机维修进阶教程-----adb禁用错了系统app导致无法开机 如何保数据无损恢复机型

在刷机维修过程中 。我们会遇到一些由于客户使用adb指令来禁用手机app而导致手机无法开机进入系统的故障机型。通常此类问题机型有好几种解决方法。但如果客户需要保数据来恢复机型。其实操作也是很简单的.还有类似误删除应用导致不开机等等如何保数据。  通过博文了解💝💝💝    1💝💝💝----adb禁用或者删除系统app导致无法开机的几种解决方法 2💝💝💝----如何保数据来无损恢复机型 3💝💝💝----其他保数据解决系统类故障无法开机的步骤解析

小马哥的专栏 1349

Keras实现BiLSTM+CRF字符级序列标注

BiLSTM即可实现分词或命名实体标注等序列标注任务,单独的CRF也可以很好的实现。但因为单独LSTM预测出来的标注可能会出现(I-Organization-> I-Person,B-Organization - > I-Person)这样的问题序列,所以需要搞一个LSTM + CRF的混合模型。 这种错误在CRF中是不存在的,因为CRF的特征函数的存在就是为了对输入序列观察,学习各种...

vivian_ll的博客 6450

OpenStack 2018 年终盘点

目录 文章目录目录前言OpenStack 一年来的成长NovaCinderNeutronIronicCyborgOctaviaKollaMagnumZunKuryr从 OpenStack 到 OpenInfra 前言 这是最好的时代,也是最坏的时代 — — 查尔斯·约翰·赫芬姆·狄更斯《双城记》 年关将至,闲暇之余,回顾我与 OpenStack 的 2018。 NOTE:仅作为个人见解,与公...

烟云的计算 3576

Bert+Bilstm+Crf 命名实体识别(NER) Keras实战

0.引言 最近做了一个命名实体识别(NER)的任务,发现了bert的强大,不愧是谷歌花了大精力训练的模型。其实网上相关tensorflow,pytorch的代码很多,但是用Keras的感觉没有一个是简单明了的,所以我在写这个网络的时候遇到不少麻烦,作为总结,把自己的经验分享给大家,尽量做到简单明了可实现,代码粗陋,适合新手学习,也欢迎大佬多给些宝贵意见。 1.前期准备 keras中要用bert和c...

weixin_42598761的博客 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

自然语言处理入门(一)--Keras实现BiLSTM+CRF中文命名实体识别

** 自然语言处理入门(一)–Keras实现BiLSTM+CRF中文命名实体识别 ** 这篇文章主要关于环境搭建以及遇到的一些bug等一些基础的梳理 参照的开源项目进行学习,地址是https://github.com/F-debug/Medical-named-entity-recognition 使用的python版本是3.6,keras版本是2.3.1,tensorflow版本是2.2.0 版本真的很重要,之前的版本keras是2.4.3经常会出一些错误,后来重新开始搭建的环境参照的是http

Jeremy_0414的博客 2178

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

[文本挖掘和知识发现] 02.命名实体识别之基于BiLSTM-CRF的威胁情报实体识别万字详解

《文本挖掘和知识发现》主要结合Python、大数据分析和人工智能分享文本挖掘、知识图谱、知识发现、图书情报等内容。前一篇文章介绍文献可视化分析软件CiteSpace基础知识,以中国知网《红楼梦》文献为例,开展主题挖掘、关键词聚类及主题演化分析。这篇文章将讲解如何实现威胁情报实体识别,利用BiLSTM-CRF算法实现对ATT&CK相关的技战术实体进行提取,是安全知识图谱构建的重要支撑。基础性文章,希望对您有所帮助!

杨秀璋的专栏 6711

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Bilstm+crf ner[pytorch,keras]

Reference 基于keras的BiLstm与CRF实现命名实体标注 - 帅虫哥 - 博客园

To be a better man 1280

用keras搭建bilstm crf

# coding: utf-8 from keras.models import Sequential from keras.layers import Embedding from keras.layers import LSTM from keras.layers import Bidirectional from keras.layers import Dense from keras.lay

BrownWong的专栏 2万+

crf的实现 keras_概率图模型系列-条件随机场模型(CRF)解析与实现

上篇文章写到了序列标注任务的隐马尔可夫模型(HMM)实现方法。HMM在进行序列标注时,是对观测序列和隐变量的联合概率 进行建模,属于一类生成模型。实际上,序列标注任务只关心在给定观测序列的情况下,标签是如何分布的,那么对联合概率进行建模未免有点“大材小用”。最大熵马尔科夫模型(MEMM)和HMM的区别就在于此,其在给定观测条件的情况下,对标签分布 进行建模,属于一类判别模型。MEMM由于是对概...

weixin_42399813的博客 897

crf的实现 keras_NLP-入门实体命名识别(NER)+Bilstm-CRF模型原理Pytorch代码详解——最全攻略...

最近在系统地接触学习NER,但是发现这方面的小帖子还比较零散。所以我把学习的记录放出来给大家作参考,其中汇聚了很多其他博主的知识,在本文中也放出了他们的原链。希望能够以这篇文章为载体,帮助其他跟我一样的学习者梳理、串起NER的各个小知识点,最后上手NER的主流模型(Bilstm+CRF)(文中讲的是pytorch,但是懂了pytorch去看keras十分容易相信我哈)全文结构:一、NER资料(主要...

weixin_32656107的博客 533
上一篇: Stanford-corenlp 英文词性标注
下一篇: CYK算法简介与实现
CopperDong
博客等级 码龄14年 1205粉丝 466原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值