實體命名識別(NER)任務中加詞典
導讀
- 本文主要介紹一下,怎麼在NER任務中融合詞典。
一、NER任務簡介
NER(Named Entity Recognition,命名實體識別)又稱作專名識別,是自然語言處理中常見的一項任務,使用的範圍非常廣。命名實體通常指的是文字中具有特別意義或者指代性非常強的實體,通常包括人名、地名、機構名、時間、專有名詞等。NER系統就是從非結構化的文字中抽取出上述實體,並且可以按照業務需求識別出更多類別的實體,比如產品名稱、型號、價格等。因此實體這個概念可以很廣,只要是業務需要的特殊文字片段都可以稱為實體。
二、LSTM模型融合詞典
1、特徵向量的構建
- 給定一個句子sentence X 和一個外部詞典Dictionary,記作D。 我們通過對句子中的每個詞
- 對於每一個出現在特徵的文字片段,我們都產生一個二進位制的值來表示這個片段是否在詞典 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論文做法:
圖片中的 表示我們抽取的特徵向量,作為一個LSTM向量的輸入,而表示訓練語料的字元過完embedding之後的結果,在這裡作為其中一個LSTM的輸入。
然後我們可以分別得到兩個過完LSTM的隱層結果,用公式表示:然後我們把這和結果concat在一起,用公式表示:
接著過一個線性層,得到預測的結果。
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