传统的基于字级别的BiLSTM+CRF实现命名实体识别(NER),会受到实体词边界(切词)方面的影响,如图1所示。
图1 传统字符级别的NER的边界问题可以看到,中国篮协是一个Organization,但是模型在标注的时候,将中国篮协主当成一个完整的Organization实体了。
传统的基于字级别的NER往往会存在这个问题,Lattice LSTM基于这个考虑在NER的过程中引入了词表的知识,保证模型尽可能免受这个问题的干扰。下边我们来看看它是怎么做的吧。
图2 Lattice LSTM Structure可以看到,总体上Lattice LSTM也是基于字级别进行的,但是它同时引入了词的信息。在每个位置的输入除了该位置的字,同时也会输入以该字结尾的所有词。
例如在"长"这个位置,此时刻的输入包含字"长",也包含在这句话中以"长"结尾的所有词:"市长 ";在最后一个位置"桥",这个时刻的输入包含字"桥",也包含在这句话中以"桥"结尾的所有词:"大桥","长江大桥"。
这里可能有同学可能会问,这些词是怎么来的,如何去提取出一句话中的词呢?
这里其实用到了一个词典,根据词典去提取或匹配这句话中的潜在词。
这个想法是不是挺简单的,下边我们来看看,如何具体实现这个功能吧,内容涉及公式,晕公式的同学可以保持美好心情,选择性跳过。
在正式开始之前,我们先来约定一些记号:
如图2所示,$x_2^c$是取字"京"的字向量,
接下来,我们再来回顾一下基本的LSTM单元的计算公式:
好了,前情我们已经准备讨论完,下边我们进入主题。本节开始时我们提到,Lattice LSTM在每个位置引入的输入既包括字又包括词,那么具体是怎么融合的呢?
我们先来看字级别的输入处理:
字级别的输入处理和公式11中展示的相似,每个时刻的输入包括前一个时刻的隐状态
上边笔者并没有提到遗忘门 ,因为在后边字词信息融合的过程中你可以看出,根本没有用到这个门。
另外,
$h_{j-1}^c$ 代表前一个时刻的隐状态,但是这个隐状态是结合字和词两者的信息融合而成的,不是传统意义上的单字或单词形成的隐状态。欲知具体如何,请继续向下看。
我们再来看下词级别的输入处理:
词级别的输入处理如公式13所示,它的输入包含三部分:词向量
这里可能会有朋友疑问,为什么少了一个输出门?
这是因为我们是对字符标注,而不是对词标注,所以在这里设置一个输出门没什么用。
一句话中可能被词典匹配出很多词,这里一定要理解这么多词要分别融入到哪些位置。如图2所示,每个词都务必融入到以该词最后一个字结尾的那个位置。
假设我们在求
上边我们计算出了词的状态向量$c_{b,e}^w$,这里不太适合将$c_{b,e}^w$的全部信息融入到$c_e^c$中,因此设置了一个输入门
从公式14可以看出,输入门
前边我们提到,我们需要将以
这里我们来进一步讨论一下公式15,现在我们需要向$c_e^c$,这里假设$j=e$状态向量中融入多个词信息$c_{b,e}^w$ 和1个字信息$\tilde{c_e^c}$,每个信息的融入都需要一个输入门去控制各个字或者词信息向$c_e^c$输入信息的多少, 这里对应的输入门就是公式15中的$\alpha_{b,j}^c$ 和
通过这种方式就能计算出
总结一下,上边我们完整的计算了