寫在前面:在初學nlp時的第一個任務——NER,嘗試了幾種方法,cnn+crf、lstm+crf、bert+lstm+crf,毫無疑問,最后結果時Bert下效果最好。
1、關於NER:
NER即命名實體識別是信息提取的一個子任務,但究其本質就是序列標注任務。
eg:
sentence:壹 叄 去 參加一個 NER 交 流 會
tag: B_PER I_PER O O O O O B_ORG I_ORG I_ORG I_ORG
(咱們暫且認為這個實體標記是正確的)
按照CoNLL2003任務中,LOC-地名、PER-人名、ORG-機構名、MISC-其他實體,其他此被標記為O,B代表實體名的開始位置,I代表實體名的中間位置。(在具體任務中標記不一,按照自己的任務中進行標記即可)
NER是一個基礎問題,不會不行,但是也是一個非常重要的問題,下面將按照實現過程中碰到的問題依次進行闡述(小白,如有錯誤,請瘋狂留言噴我,一定改正)。首先的明白NER是一個分類任務,也叫序列標注,其實就是對文本的不同實體標記上對應的標簽。
方法主要如下:
- 基於規則:按照語義學的先驗定義規則,由於語言的復雜性,這個方法很難制定出良好的規則;
- 基於統計學:統計學就是根據大量文本,在其中找到規律,代表作有HMM、CRF;
- 神經網絡:神經網絡的大放異彩在各個領域都點亮了一片天空,當然不會遺忘,其中在NER方面主要有CNN+CRF、LSTM+CRF。
2、老婆孩子熱炕頭
-
分詞
分詞工具主要采用了jieba分詞,在結巴原始詞庫的基礎上加載自定義詞典,方法參考參考
import jieba
jieba.load_userdict('..\data\\result_SVM_to_jiaba.txt')
import jieba.posseg as pseg
jieba支持三種分詞模式:
- 精准模式:試圖將句子最精確的切分,適合文本分析;
- 全模式:把句子中所有的詞都掃描出來,速度快,但是不支持歧義;
- 搜索引擎模式:在精准模式的基礎上,在對長詞進行切分,提高召回率,適用於搜索引擎分詞。
jieba對中文的支持還是很好的,當然現在還有很多中文方面的工具:jiagu、等等。
2.實體標記
假設我們的任務是從0開始的,沒有開源數據集,在做的時候先對實體詞進行摘取(eg:python開發工程師、全棧開發等等),作為自己的實體詞庫,並加載到jieba中進行分詞庫中,對數據進行分詞,分詞后按照我們抽取的實體詞進行標記(eg:B_PER\I_PER\B_LOC\I_LOC...)。在這兒我們已經有了NER的老婆(標記好的數據)。
3.一號兒子(CNN+CRF) [paper]
論文名字:Convolutional Neural Network Based Semantic Tagging with Entity Embeddings
- 詞嵌入:Word2Vec
Word2Vec是一種有效的神經網絡模型,該模型采用非結構化的文本並學習每個單詞的嵌入特性,這些嵌入特性捕獲了語法和語義的不同關系,有趣的是可以進行線性線性操作,eg: man + woman ~= queen.
值得提出的是Word2Vec工具主要包含兩個模型,分別是skip-gram(跳字模型)和CBOW(連續詞袋模型),以及兩種高效的訓練方法negative sampling和softmax。word2vec就是將詞轉換為向量,這個向量就可以認為是詞的特征向量,詞是nlp中最細粒度的,詞組成句子,句子組成段落、篇章...。我們將詞的向量表示出來,那么更粗粒度的表示也可表示出來。
注意:在CBOW模型中,我們最后得到的詞向量實際上權重矩陣,我們並不關心最后的輸出是什么,我們輸入層是詞的onehot編碼,V是我們最后學習到的向量維度大小,C為我們詞的上下文個數,學習目標就是讓我們預測的中間詞和onehot的label越小越好,這樣權重矩陣就是我們最終所需的。
skip-gram和CBOW類似,只不過是反過來用當前詞預測上下文。
【計算方式可參考論文里,這里打公式太麻煩了,有大佬知道有啥插件或者啥啥能方便快捷的打出來求告知一下。】
- 關系約束模型(RTM):
利用一個詞的其他相關詞來進行預測這個詞的向量,利用單詞之間synonymous 或者 paraphrase構建知識庫。將這個先驗當作編碼,再對Word2Vec中刪除上下文作為目標函數來學習嵌入。原論文公式(3)。
- 聯合模型
就是將Word2Vec和RTM聯合起來,
- CNN+CRF
命名實體識別由於有長距離依賴問題,大部分都用rnn家族模型,盡可能記住長序列的信息來對句子進行標注。但是RNN家族在GPU的利用上不如CNN,RNN無法做到並行。CNN的優勢在於可以並行速度快,但是隨着卷積層的增加,最后只得到原始信息的一小塊,這就不利於句子的序列標注。當然后來也有人提出IDCNN(膨脹卷積),暫不討論。而本論文中的CNN是一個基本的CNN,就不在贅述,論文主要針對不同的嵌入向量學習在模型下的F-score做了對比,結果如下:
4.兒子二號(LSTM+CRF)
5.兒子三號(CNN+LSTM+CRF)
上面這兩也沒啥說的了,就是換了個模型。LSTM和CNN相信大家都很熟悉,只需要針對自己的問題設置合理的結構就行。LSTM一般都用雙向的LSTM。后期再補充一個CRF內容。
3、思維導圖
才疏學淺,如有錯誤,請不吝賜教!