实体命名识别(NER)任务中加词典

导读

  • 本文主要介绍一下,怎么在NER任务中融合词典。

一、NER任务简介

NER(Named Entity Recognition,命名实体识别)又称作专名识别,是自然语言处理中常见的一项任务,使用的范围非常广。命名实体通常指的是文本中具有特别意义或者指代性非常强的实体,通常包括人名、地名、机构名、时间、专有名词等。NER系统就是从非结构化的文本中抽取出上述实体,并且可以按照业务需求识别出更多类别的实体,比如产品名称、型号、价格等。因此实体这个概念可以很广,只要是业务需要的特殊文本片段都可以称为实体。

二、LSTM模型融合词典

1、特征向量的构建

  • 给定一个句子sentence X 和一个外部词典Dictionary,记作D。 我们通过对句子中的每个词 xi x i 抽取特征模板,通过特征模板上的词产生特征向量。特征模板描述为如下图
    实体命名识别(NER)任务中加词典_第1张图片
  • 对于每一个出现在特征的文本片段,我们都产生一个二进制的值来表示这个片段是否在词典 D 中,如果在词典中可以找到,我把这个词的向量表示为1,否则,表示为0。

举个例子说明:
美国总统特朗普意识到对中国发起 易战是极其愚蠢的做法。
2-gram 起贸 贸易
3-gram 发起贸 贸易战
4-gram 国发起贸 贸易战是
5-gram 中国发起贸 贸易战是极
对应词典有“贸易”、“贸易战”,那我们的特征向量 t 可以表示为:

0 1 0 1 0 0 0 0

2、model的设计

  • 设计图如下,这也是参考论文:Neural Networks Incorporating Dictionaries for Chinese Word Segmentation。2018年AAAI论文做法:
    实体命名识别(NER)任务中加词典_第2张图片
    图片中的 t1t2....tn t 1 , t 2 . . . . t n 表示我们抽取的特征向量,作为一个LSTM向量的输入,而 exi e x i 表示训练语料的字符过完embedding之后的结果,在这里作为其中一个LSTM的输入。
    然后我们可以分别得到两个过完LSTM的隐层结果,用公式表示:

    hxi=BiLSTM(hxi1,hxi+1,exi) h i x = B i L S T M ( h → i − 1 x , h ← i + 1 x , e x i )
    hti=BiLSTM(hti1,hti+1,ti) h i t = B i L S T M ( h → i − 1 t , h ← i + 1 t , t i )

    然后我们把这 hxi h i x hti h i t 结果concat在一起,用公式表示:

    hi=hxihti h i = h i x ⊕ h i t

    接着过一个线性层,得到预测的结果。

3、部分代码展示

按照model设计部分,展示主要的代码设计部分:

        x_emb = self.embed(batch_feature.word_features)  
        x_emb = self.dropout_embed(x_emb)
        lstm_out, _ = self.bilstm(x_emb)
        lstm_out_t, _ = self.bilstm_t(t_emb)
        lstm_out = torch.cat([lstm_out, lstm_out_t], 2)
        lstm_out = F.tanh(lstm_out)
        logit = self.linear(lstm_out)

三、实验结果

参数设计:

[data]  ###这里可以不用看,可以忽略,因为是项目中人为标注的。
train_file = ./data/cropus/4/train_sentence6.txt
test_file = ./data/cropus/4/test_sentence6.txt

[Model]
lstm_layers = 1
embed_dim = 300
lstm_hiddens = 300
dropout_embed = 0.2
dropout = 0.4

[Optimizer]
adam = True
learning_rate = 0.001
learning_rate_decay = 1
weight_decay = 1e-8
clip_max_norm = 10

[Train]
use_cuda = True
epochs = 1000
batch_size = 16
test_batch_size = 16

实验结果,用的评测指标是F值评测,最终跑到数据是74.6%比我预期的效果要差,因为我没有用词典的效果是77.2%。这里写这篇博客的目的纯粹是介绍一下加词典的方法,也对这次做的东西做一个小结吧。

四、结果分析

  • 主要分析我这个失败的做法失败的原因吧,沮丧。。

1、第一我觉得我的model的设计有点简单,但是做法是没有问题,毕业人家在分词做出效果了。
2、就是我外部词典质量是存在重大问题,我试着对比词典中比较明显的词和训练语料的词,发现基本匹配不到,所以导致我的特征向量普遍都是零。
3、第三我觉得本身我的语料就是存在一些问题,但是这不是主要的原因,因为据我对语料的分析观察,发现有些可以标注为实体的内容没有标注出来。

参考文献

[1] Neural Networks Incorporating Dictionaries for Chinese Word Segmentation

你可能感兴趣的:(自然语言处理,深度学习)