更多、更及时内容欢迎留意Wechat公众号: 小窗幽记机器学习
背景
SoftLexicon 出自ACL 2020的Simplify the Usage of Lexicon in Chinese NER
官方代码:
https://github.com/v-mipeng/LexiconAugmentedNER
论文:
https://arxiv.org/abs/1908.05969
模型结构
近年来学者试图利用词典(词汇信息)来提高中文命名实体识别(NER)的性能如Lattice LSTM等,但其模型架构十分复杂限制了其计算速度,从而限制了它在许多需要实时NER响应的工业领域中的应用。
SoftLexicon是一种简单而有效的将词汇信息纳入字符表示的方法。这种方法避免设计复杂的序列建模结构,并且对于任何NER模型,它只需要细微地调整字符表示层来引入词典信息。在4个中文NER基准数据集上的实验结果表明,该方法的推理速度比现有SOTA方法快6.15倍,性能更好。实验结果还表明,该方法可以很容易地与BERT等预训练模型相结合。实验表明当采用单层的Bi-LSTM实现序列建模层时,本文的方法在推理速度和序列标注性能上都比现有方法有了很大的提高。
SoftLexicon 算法流程大致如下:
大致有以下3个步骤:
- 输入序列的每个字符映射到一个密集向量中
- 构建软词典特征并将其添加到每个字符的表示中
- 将这些增强的字符表示输入到序列建模层和CRF层,以获得最终的预测结果。
字符表示层
输入文本字符序列记为
s
=
s=
s=
{
c
1
,
c
2
,
⋯
,
c
n
}
∈
V
c
\left\{c_{1}, c_{2}, \cdots, c_{n}\right\} \in \mathcal{V}_{c}
{c1,c2,⋯,cn}∈Vc, 其中
V
c
\mathcal{V}_{c}
Vc是字符表,每个字符
c
i
c_{i}
ci用一个稠密向量表示(即embedding):
x
i
c
=
e
c
(
c
i
)
x_{i}^{c}=e^{c}\left(c_{i}\right)
xic=ec(ci)
其中
e
c
e^{c}
ec 是字符表示向量的查找表。
同时使用char+bichar的联合表示增强字符embedding:
x
i
c
=
[
e
c
(
c
i
)
;
e
b
(
c
i
,
c
i
+
1
)
]
x_{i}^{c}=\left[e^{c}\left(c_{i}\right) ; e^{b}\left(c_{i}, c_{i+1}\right)\right]
xic=[ec(ci);eb(ci,ci+1)]
其中
e
b
e^{b}
eb是bigram的embedding的查找表。
引入词汇信息
单纯使用字符信息的NER模型存在不能利用单词信息这个不足。为此,SoftLexicon提出两种方法:ExSoftword Feature 和 SoftLexicon 以在字符表示中引入词信息。对于字符序列 s = s= s= { c 1 , c 2 , ⋯ , c n } \left\{c_{1}, c_{2}, \cdots, c_{n}\right\} {c1,c2,⋯,cn}其中存在的单词记为 w i , j = c i , c i + 1 , ⋯ , c j w_{i,j}=c_{i}, c_{i+1}, \cdots, c_{j} wi,j=ci,ci+1,⋯,cj
ExSoftword Feature:
ExSoftword是对Softword的拓展,与Softword不同,它不再只保留每个字符进行分词后的一个分词结果,而是使用词典获得所有可能的分词结果:
x
j
c
←
[
x
j
c
;
e
s
e
g
(
segs
(
c
j
)
]
,
x_{j}^{c} \leftarrow\left[x_{j}^{c} ; e^{s e g}\left(\operatorname{segs}\left(c_{j}\right)\right],\right.
xjc←[xjc;eseg(segs(cj)],
其中
segs
(
c
j
)
\operatorname{segs}\left(c_{j}\right)
segs(cj) 表示字符
c
j
c_{j}
cj所有可能的分词结果,
e
s
e
g
(
seg
(
c
j
)
)
e^{s e g}\left(\operatorname{seg}\left(c_{j}\right)\right)
eseg(seg(cj))是一个5维的multi-hot向量,各个维度分别对应:
{
B
,
M
,
E
,
S
,
O
}
\{\mathrm{B}, \mathrm{M}, \mathrm{E}, \mathrm{S}, \mathrm{O}\}
{B,M,E,S,O}。
比如Figure 2中的“西”
c
7
(
“西”
)
c_7{(“西”)}
c7(“西”)出现在两个词中:
w
5
,
8
(
"
中山西路
"
)
w_{5,8}{("中山西路")}
w5,8("中山西路")和
w
6
,
7
(
"
山西
"
)
w_{6,7} ("山西")
w6,7("山西")。因此,其对应的分割结果是
M
,
E
{M,E}
M,E,分别表示中间位置和结尾位置,可以看出第2和第3个维度对应的位置置为1,其他维度值为0。"西"这个字符的字符表示可以用以下方式进一步丰富:
x
7
c
←
[
x
7
c
;
e
s
e
g
(
{
M
,
E
}
)
]
x_{7}^{c} \leftarrow[x_{7}^{c} ; e^{s e g}(\{M,E\})]
x7c←[x7c;eseg({M,E})]
该方法有两个问题:
- 相比于 Lattice LSTM,该方法没有引入预先训练好的词汇embedding
- 仍然丢失匹配结果的信息。
Figure2中的示例
c
5
,
c
6
,
c
7
,
c
8
c_5,c_6,c_7,c_8
c5,c6,c7,c8字符序列的的ExSoftword feature结果是
{{B}, {B,M,E}, {M,E}, {E}}
。但是对于这样一种给定的构建序列,存在多种可能的匹配结果。比如
{
w
5
,
6
\left\{w_{5,6}\right.
{w5,6 (“中山”),
w
5
,
7
w_{5,7}
w5,7 (“中山西”),
w
6
,
8
w_{6,8}
w6,8 (“山西路”)
}
\}
} 和
{
w
5
,
6
\left\{w_{5,6}\right.
{w5,6 (“中山”),
w
6
,
7
(
w_{6,7}\left(\right.
w6,7( “山西”),
w
5
,
8
w_{5,8}
w5,8 (“中山西 路”)}。为此,无法知晓哪个才是正确的结果。
SoftLexicon:
作为对ExSoftword的改进,该方法由3个步骤组成:
(1) 对匹配到的单词进行分类:
为了保留分词信息,匹配到的词中的每个字符都被分类到 {B,M,E,S}中。对于每个字符
c
i
c_i
ci,这四个集合被认为为:
B ( c i ) = { w i , k , ∀ w i , k ∈ L , i < k ≤ n } M ( c i ) = { w j , k , ∀ w j , k ∈ L , 1 ≤ j < i < k ≤ n } E ( c i ) = { w j , i , ∀ w j , i ∈ L , 1 ≤ j < i } S ( c i ) = { c i , ∃ c i ∈ L } . \begin{aligned} &\mathrm{B}\left(\mathrm{c}_{\mathrm{i}}\right)=\left\{\mathrm{w}_{\mathrm{i}, \mathrm{k}}, \forall \mathrm{w}_{\mathrm{i}, \mathrm{k}} \in \mathrm{L}, \mathrm{i}<\mathrm{k} \leq \mathrm{n}\right\} \\ \\ &\mathrm{M}\left(\mathrm{c}_{\mathrm{i}}\right)=\left\{\mathrm{w}_{\mathrm{j}, \mathrm{k}}, \forall \mathrm{w}_{\mathrm{j}, \mathrm{k}} \in \mathrm{L}, 1 \leq \mathrm{j}<\mathrm{i}<\mathrm{k} \leq \mathrm{n}\right\} \\ \\ &\mathrm{E}\left(\mathrm{c}_{\mathrm{i}}\right)=\left\{\mathrm{w}_{\mathrm{j}, \mathrm{i}}, \forall \mathrm{w}_{\mathrm{j}, \mathrm{i}} \in \mathrm{L}, 1 \leq \mathrm{j}<\mathrm{i}\right\} \\ \\ &\mathrm{S}\left(\mathrm{c}_{\mathrm{i}}\right)=\left\{\mathrm{c}_{\mathrm{i}}, \exists \mathrm{c}_{\mathrm{i}} \in \mathrm{L}\right\} . \end{aligned} B(ci)={wi,k,∀wi,k∈L,i<k≤n}M(ci)={wj,k,∀wj,k∈L,1≤j<i<k≤n}E(ci)={wj,i,∀wj,i∈L,1≤j<i}S(ci)={ci,∃ci∈L}.
具体示例如Figure3所示:
其中,
L
L
L表示使用的词典,同时如果单词集合为空,将特殊字符None
加入到对应集合中。好处是不仅使用了word embbeding,而且不存在信息丢失。
(2) 压缩word sets:
在获得每个字符的{B,M,E,S}词集之后,每个词集被压缩成一个固定维度的向量。文中探索了2种实现压缩的方法。
第一种是直接进行平均
其中 S S S提供关于词汇的集合(即word sets), e w e^{w} ew对应贡献单词的embedding。然而这种方法表现并不佳,同时为了保持计算效率,本文没有选择像注意力这样的动态加权算法,而是使用每个单词的频率作为权重。由于一个单词的出现频率是一个可以离线获取的静态值,这样可以大大加快每个单词权重的计算。具体地,让 z ( w ) z(w) z(w)表示词典中词 w w w在统计数据中出现的频率,词集 S S S的加权表示如下:
如果 w w w被另一个与词典匹配的子序列覆盖,则 w w w的频率不会增加。这防止了较短单词的频率总是小于覆盖它的较长单词的频率的问题。
(3) 字符的联合表示:
最后一步是将四个集合的embedding组合成一个固定维的特征,并将其添加到每个字符表示中。
e s ( B , M , E , S ) = [ v s ( B ) ; v s ( M ) ; v s ( E ) ; v s ( S ) ] x c ← [ x c ; e s ( B , M , E , S ) ] \begin{aligned} e^{s}(\mathrm{~B}, \mathrm{M}, \mathrm{E}, \mathrm{S}) &=\left[\boldsymbol{v}^{s}(\mathrm{~B}) ; \boldsymbol{v}^{s}(\mathrm{M}) ; \boldsymbol{v}^{\mathrm{s}}(\mathrm{E}) ; \boldsymbol{v}^{\mathrm{s}}(\mathrm{S})\right] \\ \boldsymbol{x}^{c} & \leftarrow\left[\boldsymbol{x}^{c} ; \boldsymbol{e}^{s}(\mathrm{~B}, \mathrm{M}, \mathrm{E}, \mathrm{S})\right] \end{aligned} es( B,M,E,S)xc=[vs( B);vs(M);vs(E);vs(S)]←[xc;es( B,M,E,S)]
其中 v s v^s vs为上述提供表示的加权函数。
序列建模层和标签预测层
引入词典信息后的字符表示随后输入序列建模层,该层对字符之间的依赖性进行建模。通用的序列建模架构有:BiLSTM,CNN,Transformer等。本文用单层BiLSTM实现序列建模层。至于标签预测层,文章采用CRF进行解码。
更多、更及时内容欢迎留意微信公众号: 小窗幽记机器学习