cap流程图_源码阅读笔记 BiLSTM+CRF做NER任务(二)
源碼地址:https://github.com/ZhixiuYe/NER-pytorch
本篇正式進入源碼的閱讀,按照流程順序,一一解剖。
一、流程圖
二、詳細步驟
1、數據預處理
1)將數據集從文件中加載出來,如果句子中出現了數字,會將其置零(可選),刪除
無用句。
2)轉換標注模式,將iob1(數據集原有標注模式)轉換為iob2,如果選用的是IOBES則將iob2轉換成iobes,選用的是IOB,則將iob2返回。iob1和iob2都是表示里面只有I、O、B,不同的是iob1中的B是為了隔斷同類實體不同實體名的,而iob2中的B是為了作為實體名的開頭的。iobes中包含I(實體名內部)、O(非實體)、B(實體的開頭)、E(實體的結尾)、S(單字實體名)。
下例將說明iob1、iob2、iobes的形式:
3)創建word、char、tag、cap字典(根據訓練集)。
word字典:統計單詞詞頻,篩選出詞頻大于3的單詞,按照詞頻逆序、單詞順序對單詞由0開始編號并加入字典中。除此,加入''、''這兩個單詞,分別表示pad和未知詞匯,賦予最大的兩個編號。
char字典:統計字母頻數,按照詞頻逆序、字母順序對字母由0開始編號并加入字典中,除此,加入''并賦予最大的編號。
tag字典:統計標簽頻數,按照標簽頻數逆序、標簽順序對標簽由0開始編號并加入字典中,除此,加入''和''并分別賦予-1和-2編號
cap字典:無法創建字典,映射關系為全小寫:0,全大寫:1,首字母大寫:2,其他:3。
4)根據3創建的字典和映射關系,分別對訓練集、驗證集、測試集的word、char、cap、tag等特征做數值化。得出的數據集中每一句由{'str_words': str_words,'words': words,'chars': chars,'caps': caps,'tags': tags,}字典組成,句中每個單詞對應一個這樣的字典。
2、進入訓練
從上面的數據預處理中,假如我們得到這么一個句子數據:
{'str_words': ['Amy','goes','to','Beijing','to','visit','Peking','University'],
'words': [0,1,2,3,2,4,5,6],
'chars': [[0, 1, 2], [3, 4, 5, 6], [7, 4], [8, 5, 9, 10, 9, 11, 3], [7, 4], [12, 9, 6, 9, 7], [13, 5, 14, 9, 11, 3], [15, 11, 9, 12, 5, 16, 6, 9, 7, 2]],
'caps': [2,0,0,2,0,0,2,2],
'tags': [0,1,1,2,1,1,3,3], }
注:該示例的words、chars、tags并未按照1所說的根據詞頻進行的編碼,只是按照出現的先后順序進行的編碼。
1)char Embedding
① 對'chars'根據word長度進行排序,得到排序后的列表,與原列表對比生成索引映射關系。
② 對排序后的列表進行mask處理,即對word進行尾部填充0知道達到最長word長度。本例中,即是生成:[[15, 11, 9, 12, 5, 16, 6, 9, 7, 2],[8, 5, 9, 10, 9, 11, 3, 0, 0, 0],......],為8×10的矩陣。
③將生成的char新矩陣輸入Embedding層,設置的size為25,在本例中將得到8×10×25的矩陣,并進行轉置,成為10×8×25的矩陣。
④對得到的矩陣進行pack操作(去除pad),成為39×25的PackedSequence,batchsize為(10,7,6,5,4,3,2,2)。
⑤ 將PackedSequence輸入到雙向LSTM中,然后把輸出的output的pack操作還原回去,再進行轉置操作。
⑥ 提取出output中最后一個字母的out和第一個字母的out進行拼接,并且將排序的結果還原。
注:如果在進行pack操作時,選擇batch_first=True,則不用進行轉置操作;進行長度排序是pack操作必經的過程;雙向lstm的結果的第三維長度為2*size,拼接時選擇第一個字母的后size長度(t→1)和最后一個字母的前size長度(1→t)。
2)word Embedding
輸入embedding層
3)cap Embedding
輸入embedding層
4)拼接所有的Embedding并輸入LSTM中
① 拼接char、word、cap Embedding
② 對最終的Embedding增加第二維(unsqueeze)
③ 輸入到dropout層
④ 輸入到雙向LSTM層
⑤ 減去第二維
⑥ 輸入到dropout層
⑦ 輸入到一個線性層
5)無crf的話,使用交叉熵作為loss函數。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的cap流程图_源码阅读笔记 BiLSTM+CRF做NER任务(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pythontype(1+0xf*3.1
- 下一篇: 前缀表达式后缀表达式_五分钟小知识之什么