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