Pytorch 給出的命名體識別(NER)的小例子,簡潔清晰,深入原理及實現細節,比較適合想深入學習又沒有好的入門途徑的同學。不過他過於簡潔,一些理論背景沒有介紹,對於咱們這些,在門口晃悠的渣渣掌握起來還是有點兒費勁。
所以,本文打算總結自己的學習過程,從原理到代碼,走一遍這個小例子,算是摸着石頭入門吧~
outline:
- 這個模型的用途
- 模型的結構
- 幾個關鍵代碼的原理
1、模型用途
輸入是一句話,或者更嚴謹一點說是一個多個詞(單詞)組成的自然序列,然後這個模型其中的實體(比如人名,地名,組織機構名等)識別出來。
比如輸入:我愛北京
模型給出標記:O O B-LOC I-LOC
我 | O | 其他 |
愛 | O | 其他 |
北 | B-LOC | 地點實體開始 |
京 | I-LOC | 地點實體內部 |
這裏只是拿地點實體舉個例子,實際應用中,可以標記出任何你想識別的東西,前提是,語料中已經有標記好的訓練數據。順便多說兩句,現在(2020年)NER方面最先進的模型都會結合預訓練模型,不過這個經典模型任然在其中扮演着一些角色。
2、模型的結構
上邊是兩個圖,左邊黑白圖,右邊彩色圖。
簡單來說,模型分爲三層,如黑白圖的大括號標出來的那樣:
詞向量輸入層
原始輸入的句子,屬於非結構化數據,需要變成結構化數據輸入模型。此處的變換方式是給每個字隨機編號,再利用pytorch自帶的Embedding 方法映射成 embedding_dim 維的向量。
我 | 0 | [e_1, e_2, ..., e_n] |
愛 | 1 | [e_1, e_2, ..., e_n] |
北 |
2 | [e_1, e_2, ..., e_n] |
京 | 3 | [e_1, e_2, ..., e_n] |
實際中,會用預訓練好的詞向量表,每個輸入字的詞向量,從詞向量表中查詢得到。
Bi-LSTM 層
雙向LSTM層,主要用來提取輸入數據的特徵。因爲包括Pytorch在內的框架,已經完美封裝了,交給我們的只剩下弄清楚輸入、輸出,更具體點可能是,輸入、輸出的維度。
能看見的大多博客、知乎裏,對這個結構的解釋就兩點:1、能編碼序列輸入的雙向信息;2、一堆三個門控制的公式。雖然用的一個比一個666,但是都沒有解釋清楚其中原理。
或許是像我一樣,功利性的放棄深入探尋,繼續追逐新的模型。
CRF 層
(先保存,後續繼續寫。。。2020-5-20)
(有想急於瞭解的部分,歡迎在評論裏留言~)