RNN的Seq2Seq模型做命名实体识别

seq2seq 具有极强的时序能力,在自然语言处理(NLP)中是一个很强的模型,最近一段时间,在工程方面将该模型引入做命名实体识别(NER)也取得不错的效果。推荐G.Hinton的论文“Grammar as a Foreign Language”,讲述了如何用seq2seq做序列标注。

对于中文的命名实体识别的处理方式,参考中文分词和词性标注的思路,设定标签集:{B, M, E, S, B-name, M-name, E-name, S-name, …},里面的” *-name “,是实体类别的标签,标注的时候,我采用字符级的标注方案。

数据处理

我们将数据分为编码数据(encode data)和解码数据(decode data),并对数据添加GO, EOS, PAD符号,分别代表:
GO: 解码数据开头添加该符号。解码开始的时候作为输入使用。
EOS: 解码数据结尾符号。表示解码数据的结尾
PAD: 编码和解码数据补零符号。在mini-batch的时候,batch中最长文本的长度将剩余的文本用PAD补全。

编码数据在输入的时候,把顺序反置,在神经翻译系统里面,效果更好,即
[GO, 明,天,张,三,……,EOS,PAD,PAD,PAD]
转为
[PAD,PAD,PAD,EOS,……,三,张,天,明,GO]

模型:

字符的向量大小:128
LSTM层数:2
softmax输出,交叉熵求损失
学习率:
– 用SGD,学习率0.1,学习率衰减值0.99(慢慢的减少)
– 用Adadelta,初始学习率随便设置0.9,会自适应修改。

模型参考了tensorflow里面的英法翻译的模型,被Google用在了自动翻译中,称为“神经机器翻译(Google Neural Machine Translation,GNMT)”。

评论

《 “RNN的Seq2Seq模型做命名实体识别” 》 有 6 条评论

  1. […] 许久未更博了,在前段时间测试了用seq2seq做ner任务,可以参考之前的文章《RNN的Seq2Seq模型做命名实体识别》 ,之后通过NER做NLU,再加上RL尝试多轮对话,结果达到了期望,但是还有很多工作需要去做,多轮语料采集、句子相似度、句向量,在多轮对话中,我没有尝试将每句话进行分类,我认为句子本身表意就非常清晰,标注反而画蛇添足,特别是上下文中的句子,其意思根据上下文而变化。那么对话中去匹配距离最近的句子,并且人为的反馈,可能是一个多轮对话的主要方式。 […]

  2. 清风 的头像
    清风

    你好,请问RNN的Seq2Seq模型做命名实体识别有相关代码吗?可否给个链接学习一下?谢谢博主。

  3. frey 的头像
    frey

    看到了楼主的作品,感觉很不错。也实验了一下,遇到一个问题,想请教一下。我识别到的词中,含有一些被切烂的词,如“业道德教”,“各环节的”这样的,想请问这个如何解决??

    1. Kun 的头像
      Kun

      不知道你训练时候的训练样本数量是多少?

  4. hoyoung 的头像
    hoyoung

    这个模型对于没有标注过的实体会识别出来吗,我曾经测试过,对新实体的识别能力很差

    1. Kun 的头像
      Kun

      抱歉,回复的太晚了,一直在忙工程的事儿。不知道您做的识别率有多差呢?

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据