前言

在三大特征提取器中,我们已经接触了LSTM/CNN/Transormer三种特征提取器,这一节我们将介绍如何使用BiLSTM实现序列标注中的命名实体识别任务,以及Lattice-LSTM的模型原理。

本文提到的模型在我的Github中均有相应代码实现(Lattice LSTM之后更新)

BiLSTM

对于LSTM我就不再多做介绍了,想要了解的小伙伴可以看我之前的文章。BiLSTM就是双向LSTM,正向和反向提取句子信息,将正向和反向输出拼接在一起组成模型输出。

既然我们将BiLSTM看作特征提取器,意味着他的输出我们可以将其看作特征,作为另一个模型的输入来用。有了这种思想,我们将BiLSTM的输出输入一个简单的全连接神经网络就可以实现简单的分类了。

BiLSTM-CRF

如果仅仅将BiLSTM最后全连接神经网络进行分类,这就意味着,每一个标签输出,只由上下文决定,即:

\[P(y_t|X, Y) = P(y_t|X)\]

但实际上,我们上一节了解到的,序列标注任务中,不同字的隐藏状态之间通常是由相互联系的,如之前提到的IOBES标注,标签S(单个实体),则其前后必定是标签O(非实体字),标签I(实体中间字),则其前后必定只会是I、B(实体开头字)、E(实体结尾字)。显然,这些信息是不会包含在上述模型中的。

为了能够考虑到隐藏状态之间的相互关系,上文介绍的CRF模型就能提供作用了。我们记得之前的CRF模型参数化条件概率定义如下:

\[P(y|x)=\frac{1}{Z}exp(\sum_j\sum_{i=1}^{n-1}\lambda_it_j(y_{i+1}, y_i, x, i)+ \sum_k\sum_{i=1}^{n}\mu_ks_k(y_i, x, i))\]

其中:
\(t_j(y_{i-1}, y_i, x, i)\)为局部特征函数,该特征由当前节点和上一个节点决定,称其为状态转移特征,用以描述相邻节点以及观测变量对当前状态的影响;
\(s_k(y_i, x, i)\)为节点特征函数,该特征函数只和当前节点有关,称其为状态特征;
\(\lambda\)和\(\mu\)是对应特征函数的参数。

实际上,特征函数\(t(·)\)就包含了我们之前提到的隐藏状态之间的相互关系,\(s(·)\)包含了观察变量的特征表示对相应隐藏状态的关系。之前我们提到过,将上述两个特征函数看作可学习参数的一部分,然后将其整合到状态转移矩阵中去了。在代码实现中,我们仅仅需要学习一个状态转移矩阵,就能实现一个完整的CRF,实际上,这个状态转移矩阵中,就包含了两个特征函数信息。CRF对LSTM信息的再利用,显然比一个简单的分类模型要强。

Lattice LSTM

之前我们讨论的明明实体识别问题都是基于字的,主要是因为分词过程将引入很多误差来源,例如之前提到的OOV问题。但没有分词的过程使得基于字符的NER模型无法利用显性的词和词序信息来提取当前最有用的实体。如下图

如果没有加入显性的词序信息,模型难以根据上下文判断该句应该识别出来地名“南京市/长江大桥”还是应该识别出人物“南京市长/江大桥”。Lattice LSTM的做法是构造一个潜在实体词典,当匹配到潜在实体出现的时候,将该潜在实体的信息输入到模型中辅助判断,从而实现潜在相关命名实体消歧。其大致模型结构如下图所示

模型的细节可以参考官方给出的代码,之后我有时间再给出自己的实现。

参考链接
https://arxiv.org/pdf/1805.02023.pdf
https://www.jianshu.com/p/9c99796ff8d9
https://zhuanlan.zhihu.com/p/38941381

序列标注(BiLSTM-CRF/Lattice LSTM)的更多相关文章

  1. DL4NLP —— 序列标注:BiLSTM-CRF模型做基于字的中文命名实体识别

    三个月之前 NLP 课程结课,我们做的是命名实体识别的实验.在MSRA的简体中文NER语料(我是从这里下载的,非官方出品,可能不是SIGHAN 2006 Bakeoff-3评测所使用的原版语料)上训练 ...

  2. TensorFlow (RNN)深度学习 双向LSTM(BiLSTM)+CRF 实现 sequence labeling 序列标注问题 源码下载

    http://blog.csdn.net/scotfield_msn/article/details/60339415 在TensorFlow (RNN)深度学习下 双向LSTM(BiLSTM)+CR ...

  3. TensorFlow教程——Bi-LSTM+CRF进行序列标注(代码浅析)

    https://blog.csdn.net/guolindonggld/article/details/79044574 Bi-LSTM 使用TensorFlow构建Bi-LSTM时经常是下面的代码: ...

  4. Bi-LSTM+CRF在文本序列标注中的应用

    传统 CRF 中的输入 X 向量一般是 word 的 one-hot 形式,前面提到这种形式的输入损失了很多词语的语义信息.有了词嵌入方法之后,词向量形式的词表征一般效果比 one-hot 表示的特征 ...

  5. ALBERT+BiLSTM+CRF实现序列标注

    一.模型框架图 二.分层介绍 1)ALBERT层 albert是以单个汉字作为输入的(本次配置最大为128个,短句做padding),两边分别加上开始标识CLS和结束标识SEP,输出的是每个输入wor ...

  6. LSTM+CRF进行序列标注

    为什么使用LSTM+CRF进行序列标注 直接使用LSTM进行序列标注时只考虑了输入序列的信息,即单词信息,没有考虑输出信息,即标签信息,这样无法对标签信息进行建模,所以在LSTM的基础上引入一个标签转 ...

  7. NLP之CRF应用篇(序列标注任务)

    1.CRF++的详细解析 完成的是学习和解码的过程:训练即为学习的过程,预测即为解码的过程. 模板的解析: 具体参考hanlp提供的: http://www.hankcs.com/nlp/the-cr ...

  8. BiLSTM:序列标注任务的标杆

    Bidirectional LSTM-CRF Models for Sequence Tagging. Zhiheng Huang. 2015 在2015年,本文第一个提出使用BiLSTM-CRF来做 ...

  9. 转:TensorFlow入门(六) 双端 LSTM 实现序列标注(分词)

    http://blog.csdn.net/Jerr__y/article/details/70471066 欢迎转载,但请务必注明原文出处及作者信息. @author: huangyongye @cr ...

随机推荐

  1. WTM重磅更新,LayuiAdmin and more

    从善如登,从恶如崩.对于一个开发人员来说,那就是做一个好的系统不容易,想搞砸一个系统很简单,删库跑路会还不会么. 对于我们开源框架的作者来说,做一个好的框架就像登山(也许是登天),我们一步一步往上走, ...

  2. 别说你不会开发exe程序,拿走不谢。

    本文重点介绍如何将我们写的java代码打包成在电脑上可以运行的exe文件 本文重点介绍如何将我们写的java代码打包成在电脑上可以运行的exe文件.这里只介绍直接打包成exe的方法,至于打包成exe安 ...

  3. Python实现 下载IJCAI会议所有论文

    import requests import threading def get_file_content(num): savepath = '%04d.pdf' % (num) suburl = ' ...

  4. 【赛后总结+部分题解】2019中国大学生程序设计竞赛(CCPC) - 网络选拔赛

    赛后总结: T:今天状态一般,甚至有点疲惫.然后12点比赛开始,和队友开始看题,从最后往前面看,发现数学题公式看不懂.然后发现队友已经双开做1001和1006了,我看着1007有人A,开始做1007. ...

  5. lightoj 1134 - Be Efficient(组合数)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1134 题解:简单的一道组合题,现求一下前缀和,然后只要找前缀和膜m的结果相同的 ...

  6. 徐州邀请赛 江苏 icpc I. T-shirt 矩阵快速幂

    题目 题目描述 JSZKC is going to spend his vacation! His vacation has N days. Each day, he can choose a T-s ...

  7. js中的所有兼容问题总结

    js兼容问题总结 ​ 在学习js过程中很多人都遇到过兼容问题,这些兼容问题是因为各版本浏览器不同导致的,为了解决这些兼容问题,js给我们提供了解决这些兼容问题的方案,对此,我个人进行了汇集以及总结. ...

  8. linux常用命令二

    linux常用命令一 常用指令 ls        显示文件或目录 -l           列出文件详细信息l(list) -a          列出当前目录下所有文件及目录,包括隐藏的a(all ...

  9. STA——multicycle path

    之前去地平线面试的时候被问到了multicycle path的一点问题,其实这个问题我应该知道,看过<Constraining Designs for Synthesis and Timing  ...

  10. Java的初始化块及执行过程详解

    问题:Java对象初始化方式主要有哪几种?分别是什么?针对上面的问题,想必大家脑海中首先浮现出的答案是构造器,没错,构造器是Java中常用的对象初始化方式. 还有一种与构造器作用非常相似的是初始化块, ...