NER(Named Entity Recognition,命名实体识别)又称作专名识别,是自然语言处理中常见的一项任务,使用的范围非常广。命名实体通常指的是文本中具有特别意义或者指代性非常强的实体,通常包括人名、地名、机构名、时间、专有名词等。NER系统就是从非结构化的文本中抽取出上述实体,并且可以按照业务需求识别出更多类别的实体,比如产品名称、型号、价格等。因此实体这个概念可以很广,只要是业务需要的特殊文本片段都可以称为实体。
举个例子说明: 美国总统特朗普意识到对中国发起 贸 易战是极其愚蠢的做法。 2-gram 起贸 贸易 3-gram 发起贸 贸易战 4-gram 国发起贸 贸易战是 5-gram 中国发起贸 贸易战是极 对应词典有“贸易”、“贸易战”,那我们的特征向量 t 可以表示为:
01010000设计图如下,这也是参考论文:Neural Networks Incorporating Dictionaries for Chinese Word Segmentation。2018年AAAI论文做法: 图片中的 t1,t2....tn t 1 , t 2 . . . . t n 表示我们抽取的特征向量,作为一个LSTM向量的输入,而 exi e x i 表示训练语料的字符过完embedding之后的结果,在这里作为其中一个LSTM的输入。 然后我们可以分别得到两个过完LSTM的隐层结果,用公式表示:
hxi=BiLSTM(h→xi−1,h←xi+1,exi) h i x = B i L S T M ( h → i − 1 x , h ← i + 1 x , e x i ) hti=BiLSTM(h→ti−1,h←ti+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=hxi⊕hti h i = h i x ⊕ h i t 接着过一个线性层,得到预测的结果。按照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