文章目錄
基本介紹
BertForTokenClassification
pytorch-crf
實驗項目
參考
基本介紹
命名實體識別:命名實體識別任務是NLP中的一個基礎任務。主要是從一句話中識別出命名實體。比如
姚明在NBA打球
從這句話中應該可以識別出姚明(人), NBA(組織)這樣兩個實體。
常見的方法是對字或者詞打上標簽。B-type, I-type, O, 其中B-type表示組成該類型實體的第一個字或詞。I-type表示組成該類型實體的中間或最后字或詞,O表示該字或詞不組成命名實體,當然有的地方也采用B-type, I-type, E-type,O形式。
比如上一句話就可以有如下標簽
姚/B-PER 明/I_PER 在/O NBA/B_ORG 打/O 球/O
這樣根據標簽我們就可以提取出命名實體了
BertForTokenClassification
Bert作為進來比較火的模型,自然官方給出了進行命名實體識別的方法。就是BertForTokenClassfication類。使用如下:
引入模型:
from pytorch_pretrained_bert import BertForTokenClassification
1
創建模型
model = BertForTokenClassification.from_pretrained(bert_model_dir, num_labels=self.opt.tag_nums)
1
參數:
bert_model_dir: bert預訓練模型參數
num_labels: 詞標簽類的個數。即(2 or 3)*type+1
模型使用
out = model(batch_data, token_type_ids=None, attention_mask=batch_masks, labels=labels)
1
參數解釋:
輸入:
input_ids:訓練集,torch.LongTensor類型,shape是[batch_size, sequence_length]
token_type_ids:可選項,當訓練集是兩句話時才有的。
attention_mask:可選項,當使用mask才有,可參考原論文。
labels:數據標簽,torch.LongTensor類型,shape是[batch_size]
輸出:
如果labels不是None(訓練時):輸出的是分類的交叉熵
如果labels是None(評價時):輸出的是shape為[batch_size, num_labels]估計值
From:https://zhuanlan.zhihu.com/p/56155191
這樣通過BertForTokenClassificaiton類,我們就可以很容易實現命名實體識別了。
pytorch-crf
條件隨機場(CRF)命名實體識別的傳統方法。自深度學習火后,BiLstm+CRF成為命名實體識別的標准方法。具體原理可以參看這篇博客.
由於pytorch官方沒有實現條件隨機場。但是有人自己實現了pytorch-crf, 是一個不錯的開源包。
pytorch-crf基本操作:https://pytorch-crf.readthedocs.io/en/stable/
pytorch-crf接入BiLstm:
流程:
BiLstm輸出:
(BatchSize, Sequence Length, 2*hidden_size)
經過一個linear層:
(BatchSize, Sequence Length, tag_nums)
可以考慮對tag_nums這個維度softmax一下.
最后輸入到CRF中.
輸出:
CRF的前向傳播最后輸出的是真實標簽序列的分數。形式是log(realall) log(\frac{real}{all})log(
all
real
), 因此是一個負值。作為損失函數需要加一個負號
預測時調用decode就可以輸出(BatchSize, Sequence)的序列標簽。
具體細節可以參見這個issue
實驗項目
見個人github. 待補充
參考
最通俗易懂的BiLSTM-CRF模型中的CRF層介紹
kmkurn/pytorch-crf
一起讀Bert文本分類代碼
---------------------
作者:無聊的人生事無聊
來源:CSDN
原文:https://blog.csdn.net/wangpeiyi9979/article/details/89599009
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!