文字分類 08 BERT

2022-06-17 14:42:16 字數 3941 閱讀 4902

大綱概述

資料集合

資料處理

預訓練word2vec模型

word2vec預訓練詞向量

textcnn 模型

charcnn 模型

bi-lstm 模型

bi-lstm + attention 模型

transformer 模型

elmo 預訓練模型

bert 預訓練模型

資料集為imdb 電影影評,總共有三個資料檔案,在/data/rawdata目錄下,包括unlabeledtraindata.tsv,labeledtraindata.tsv,testdata.tsv。在進行文字分類時需要有標籤的資料(labeledtraindata),但是在訓練word2vec詞向量模型(無監督學習)時可以將無標籤的資料一起用上。

bert 模型**於**bert: pre-training of deep bidirectional transformers for language understanding。bert模型是google提出的基於雙向transformer構建的語言模型。bert模型和elmo有大不同,在之前的預訓練模型(包括word2vec,elmo等)都會生成詞向量,這種類別的預訓練模型屬於domain transfer。bert 模型是將預訓練模型和下游任務模型結合在一起的,也就是說在做下游任務時仍然是用bert模型,詳細介紹請看這篇博文。google提供了下面七種預訓練好的模型檔案。

bert模型在英文資料集上提供了兩種大小的模型,base和large。uncased是意味著輸入的詞都會轉變成小寫,cased是意味著輸入的詞會儲存其大寫(在命名實體識別等專案上需要)。multilingual是支援多語言的,最後乙個是中文預訓練模型。

修改部分如下:

在run_classifier.py檔案中有乙個基類dataprocessor類,在這個基類中定義了乙個讀取檔案的靜態方法_read_tsv,四個分別獲取訓練集,驗證集,測試集和標籤的方法。接下來我們要定義自己的資料處理的類,我們將我們的類命名為

class imdbprocessor(dataprocessor):

"""imdb data processor

"""def _read_csv(self, data_dir, file_name):

with tf.gfile.open(data_dir + file_name, "r") as f:

reader = csv.reader(f, delimiter=",", quotechar=none)

lines =

for line in reader:

return lines

def get_train_examples(self, data_dir):

lines = self._read_csv(data_dir, "traindata.csv")

examples =

for (i, line) in enumerate(lines):

if i == 0:

continue

guid = "train-%d" % (i)

text_a = tokenization.convert_to_unicode(line[0])

label = tokenization.convert_to_unicode(line[1])

inputexample(guid=guid, text_a=text_a, label=label))

return examples

def get_dev_examples(self, data_dir):

lines = self._read_csv(data_dir, "devdata.csv")

examples =

for (i, line) in enumerate(lines):

if i == 0:

continue

guid = "dev-%d" % (i)

text_a = tokenization.convert_to_unicode(line[0])

label = tokenization.convert_to_unicode(line[1])

inputexample(guid=guid, text_a=text_a, label=label))

return examples

def get_test_examples(self, data_dir):

lines = self._read_csv(data_dir, "testdata.csv")

examples =

for (i, line) in enumerate(lines):

if i == 0:

continue

guid = "test-%d" % (i)

text_a = tokenization.convert_to_unicode(line[0])

label = tokenization.convert_to_unicode(line[1])

inputexample(guid=guid, text_a=text_a, label=label))

return examples

def get_labels(self):

return ["0", "1"]

在這裡我們沒有直接用基類中的靜態方法_read_tsv,因為我們的csv檔案是用逗號分隔的,因此就自己定義了乙個_read_csv的方法,其餘的方法就是讀取訓練集,驗證集,測試集和標籤。在這裡標籤就是乙個列表,將我們的類別標籤放入就行。訓練集,驗證集和測試集都是返回乙個inputexample物件的列表。inputexample是run_classifier.py中定義的乙個類。在這個類中定義了text_a和text_b,說明是支援句子對的輸入的,不過我們這裡做文字分類只有乙個句子的輸入,因此text_b可以不傳參。

另外從上面我們自定義的資料處理類中可以看出,訓練集和驗證集是儲存在不同檔案中的,因此我們需要將我們之前預處理好的資料提前分割成訓練集和驗證集,並存放在同乙個資料夾下面,檔案的名稱要和類中方法裡的名稱相同。

到這裡之後我們已經準備好了我們的資料集,並定義好了資料處理類,此時我們需要將我們的資料處理類加入到run_classifier.py檔案中的main函式下面的processors字典中,結果如下:

1 	def main(_):

2 tf.logging.set_verbosity(tf.logging.info)

3 4 processors =

--data_dir=../my_dataset/

--task_name=imdb

--vocab_file=../bert_base_dir/uncased_l-12_h-768_a-12/vocab.txt

--bert_config_file=../bert_base_dir/uncased_l-12_h-768_a-12/bert_config.json

--do_train=true

--do_eval=true

--init_checkpoint=../bert_base_dir/uncased_l-12_h-768_a-12/bert_model.ckpt

--max_seq_length=128

--train_batch_size=16

--learning_rate=5e-5

--num_train_epochs=2.0

--output_dir=../output/

具體在pycharm這種ide執行的辦法可見這篇博文。

相關**可見

文字分類模型 BERT模型實戰之多文字分類

作者介紹 高開遠,漫威鐵粉 吸貓重症患者,本科就讀於哈爾濱工業大學,現為上海交通大學2017級碩士研究生,研究方向 知識圖譜 chatbot,大魚ai特約作者。01 transformer模型 bert模型就是以transformer基礎上訓練出來的,所以在開始之前我們首先複習一下目前nlp領域可以...

教程 使用Bert預訓練模型文字分類

bert模型是google在2018年10月發布的語言表示模型,bert在nlp領域橫掃了11項任務的最優結果,可以說是現今最近nlp中最重要的突破。bert模型的全稱是bidirectional encoder representations from transformers,是通過訓練mask...

基於bert句向量的簡單文字分類

1.獲取bert的sst2句向量,通過keras構建乙個簡單的基於句向量的文字分類演算法,得益於bert的強大效能,在sst2文字分類的準確率高達81.80,實驗結果比cran,cam,da,textcnn模型都好,訓練速度特別快,收斂也特別快 通過keras實現的簡單句向量分類演算法 from k...