命名實體識別(ner)是在自然語言處理中的乙個經典問題,其應用也極為廣泛。比如從一句話中識別出人名、地名,從電商的搜尋中識別出產品的名字,識別藥物名稱等等。傳統的公認比較好的處理演算法是條件隨機場(crf),它是一種判別式概率模型,是隨機場的一種,常用於標註或分析序列資料,如自然語言文字或是生物序列。簡單是說在ner中應用是,給定一系列的特徵去**每個詞的標籤。如下圖:
x我們可以看做成一句話的每個單詞對應的特徵,y可以看做成單詞對應的標籤。這裡的標籤就是對應場景下的人名、地名等等。重點在x的理解上面,什麼是特徵呢?通常我們都會取的特徵是詞性,如果名詞、動詞… 但是有人會反問,知道了詞性就能學習出標籤嗎?顯然是不夠的,我們可能需要更多的特徵來完成我們的學習。但是這些特徵需要我們根據不同的場景去人工的抽取,比如抽取人名的特徵我們往往可能看看單詞的第乙個字是不是百家姓等等。所以更多嚴謹的crf的圖應該如下:
至於y之間的連線請參考crf演算法的詳細內容。接下來會更注重用深度學習的方法來解決ner問題。
看了上圖有的人則會有疑惑了,這個特徵要怎麼提取呢?如何知道提取出來的特徵是有效的呢?要提多少個特徵才好呢?的確,特徵工程確實是乙個麻煩的問題,關於特徵的提取也大都是根據經驗和拍腦門想出來的,這整個過程很是麻煩。幸運的是現在深度學習大紅大紫,其原因除了它的效果卓越之外還免去了我們手工提取特徵的煩惱,以下將會講解本人github上的**思路與實現。
本**用tensorflow實現了雙向迴圈神經網路(bi-rnn)+ 條件隨機場(crf)在ner上的應用。了解深度學習的人都知道,我們把資料放入神經網路中然後輸出我們想要的結果,無論想要處理的問題是分類、回歸或者是序列的問題,其本質就是通過神經網路學習出特徵然後根據特徵求得結果。這不就正是我們需要的嗎?我們只要讓神經網路替我們把特性選好,然後我們只要簡單的把特徵放到crf裡不就好了嗎?這就是整個程式的本質。
知道了本質我們需要克服的困難也很多,接下來我們一一來解決。
如何把詞轉換成神經網路能接受的資料?
神經網路只接受數字,不接受字串,所以我們需要用工具把詞轉換成為詞向量,這個工具可以是gensim word2vec、glove等等。訓練的資料最好是要有個龐大的資料集,比如從網上爬取下來的新聞然後用這些資料來訓練詞向量。如果就用已有的資料訓練行不行呢?或者乾脆不訓練,隨機初始化這些詞向量行不行呢?答案是:可以。但是解決不了下面這個問題。
2. 如何處理訓練資料中沒有見過的詞?
我們之所以需要用龐大的新聞資料來預訓練詞向量的原因就是為了克服訓練資料量小的問題。因為人力有限,我們不可能有很大的標記過的資料,如果在測試樣例中出現了我們沒有標記過的詞,那麼顯然會影響ner結果。然後word2vec的用處就是將相似的詞的「距離」拉的很近(由於word2vec又是乙個很大的話題,這裡不拓展討論啦),這樣可以一定程度上減少未出現詞的影響。
整個流程圖如下:
更具體的實現在 https://
中有中文注釋,其使用簡單也可以不需要太關注細節。
基於深度學習的目標跟蹤
基於深度學習的目標檢測 基於深度學習的目標檢測綜述 目標檢測演算法匯聚 目標檢測演算法總結 10行 實現目標檢測 深度學習目標檢測 綜述 作者的個人理解 一刀流 tensorflow實現的目標檢測 有github 目標檢測演算法簡介,都是文字 內容摘要 r cnn是region based conv...
基於遙感背景的深度學習探索 深度學習簡介(一)
深度學習,我起初對其感覺既陌生又熟悉 陌生的是我完全不懂它背後的數學原理,熟悉是深度學習炒的太火,你不想知道都不可能 換句話說我腦海中沒有建立深度學習的大樹,只有硬生生的 深度學習 這個詞。而本文我想簡單介紹一下我通過學習之後建立起的深度學習的簡單樹,而這個所謂的樹指的是機器學習 深度學習 神經網路...
基於深度學習的Person Re ID(特徵提取)
一.cnn特徵提取 這一篇我們講的就是基於 cnn的特徵提取,特徵提取過程也就是訓練過程,訓練結果就是 cnn 的引數。以 triplet function 為例,對於 乙個輸入影象三元組 trip,通過乙個共享引數的網路進行訓練,通過下圖可以看到,三個影象 分別得到了乙個特徵空間,這個特徵空間只要...