NCRFpp框架簡析

2021-09-29 21:52:47 字數 2425 閱讀 7543

ncrfpp是jiesutd在github開源的序列標註工具:

ncrf++, a neural sequence labeling toolkit. easy use to 	any sequence labeling tasks (e.g. ner, pos, segmentation). it includes character lstm/cnn, word lstm/cnn and softmax/crf components.
ncrfpp github位址

作者jiesutd為了兼顧專案各種運**況,**寫得非常的周全。但這也為理解整個專案的結構帶來了一些困難。本文將圍繞序列標註任務對該項目的結構做乙個簡析,希望有助於大家快速掌握。

首先,ncrfpp專案本身較為複雜,要詳細的梳理、講述清楚並不容易。

從專案github主頁介紹中可以看到,使用了兩種特徵:字元和詞語(也可以視為字元級別和詞語級別的兩種分布式表示);然後使用softmax層或者crf層作為推理層。

專案的執行檔案是main.py,因此從main.py開始。main.py開啟後,直接滑動到檔案最低端。在main函式裡面,主要的流程就是:

data類的**位於專案utils/data.py中,這個類主要負責設定:

傳統的nlp一般都需要構建字元或者字詞詞典,將其轉換為乙個索引值,進而在嵌入層中根據索引值轉換為分布式表示向量。而本專案中這一部分工作是通過alphabet這個類(位於專案utils/alphabet.py)實現的:

alphabet類還對三種詞典提供了更多的功能(比如是否接收新詞,索引值的增量等等),提供很高的靈活性,這個看原始碼自己呼叫即可。

data類的build_alphabet方法作用是讀取資料檔案,將資料檔案中的字元、字詞和標籤傳遞給對應的詞典例項進行記錄。

seqlabel類位於專案model/seqlabel.py中,主要功能有:

定義神經網路模型層:self.word_hidden = wordsequence(data)

按需定義crf層:self.crf = crf(label_size, self.gpu)

計算損失:def calculate_loss(self,……

前向傳播:def forward(self,……

功能1中的wordsequence類將嵌入層、特徵提取層封裝在一起,而seqlabel類直接使用wordsequence特徵提取的結果。因此wordsequence模擬較關鍵,下面講一講這個類的結構。

wordsequence類(位於專案model/wordsequence.py中)的流程為:

嵌入輸入資料

self.wordrep = wordrep(data)  (例項化wordrep類,第25行)

word_represent = self.wordrep(word_inputs,feature_inputs, word_seq_lengths, char_inputs, char_seq_lengths, char_seq_recover)(嵌入輸入資料,第89行)

注:特徵提取時,所用分布式表示都統一在字詞級別。

選擇cnn或bi-lstm進行特徵提取

既然wordrep類負責嵌入層,那也有必要對其進行簡介。

wordrep類(位於專案model/wordrep.py中)主要工作流程為:

負責對字詞進行嵌入

self.word_embedding = nn.embedding(data.word_alphabet.size(), self.embedding_dim)(第43行)

word_embs = self.word_embedding(word_inputs)(第91行)

對字元嵌入使用cnn或/和bi-lstm進行初步的特徵提取

self.char_feature = charcnn(data.char_alphabet.size(), ……)(第36行)

self.char_feature_extra = charbilstm(data.char_alphabet.size(),……)(第37行)

將字詞特徵與字元嵌入初步提取特徵進行拼接:

word_list = [word_embs](第93行)

word_embs = torch.cat(word_list, 2)(第113行)

本文主要分析了ncrfpp專案的框架和主要工作流程,並圍繞序列標註任務,結合關鍵的4個類進行了結構的簡析。分析本專案的意義在於快速了解本專案的結構和模型框架。在此基礎上,根據自己的需求進行適當修改,比如字元級別的分布式表示可直接使用預訓練好的albert-tiny模型提供等。再次感謝jiesutd的工作,序列的padding、mask和batch都已經做得非常完善了。

html導航框架簡析

框架可以實現在同一瀏覽器視窗,瀏覽不同的頁面。乙個頁面的超連結一般跳轉到乙個新的瀏覽器視窗,而導航框架可以通過超連結在同一視窗顯示不同的頁面。接下來展示一下導航鏈結的實現。1.主頁面,將頁面分為兩欄,其中index.html包括三個超連結,即導航框架包含乙個將第二個框架作為目標的鏈結列表。2.ind...

PHP 單一入口框架設計簡析

2013年1月22日 19 35 25 大概過程 所有url請求 重定向到index.php 載入乙個類a 分析url得到引數資訊和將要呼叫的另乙個類b 載入這個類b,並將引數資訊傳遞給該類 執行 結束.入口檔案 通過.htaccess檔案中的rewrite功能把所有請求都轉向這個檔案 test.p...

strtok函式簡析

官方的strtok函式,用來通過分隔字元 不支援字串,傳入的串中每個字元單獨當分隔符,如下例子組合的如123會處理1而23會被跳過 返回分隔的串的首位址 比如呼叫strtok abc123def 123456 返回值是指向abc的指標 下次要獲得 def 需要呼叫strtok null,123456...