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

2021-09-11 16:22:58 字數 4358 閱讀 2914

bert模型是google在2023年10月發布的語言表示模型,bert在nlp領域橫掃了11項任務的最優結果,可以說是現今最近nlp中最重要的突破。bert模型的全稱是bidirectional encoder representations from transformers,是通過訓練masked language model和**下一句任務得到的模型。關於bert具體訓練的細節和更多的原理,有興趣的讀者可以去看在arxiv上的原文。本篇文章從實踐入手,帶領大家進行bert的中文文字分類和作為句子向量進行使用的教程。

git clone
3.(可選項)安裝bert-as-service,這是乙個可以利用bert模型將句子對映到固定長度向量的服務。

pip install bert-serving-server # server

pip install bert-serving-client # client, independent of 'bert-serving-server'

該服務要求tensorflow的最低版本為1.10。

game	apex是個新出的吃雞遊戲。

technology google將要推出tensorflow2.0。

一行代表乙個文字,由標籤加上乙個tab加上正文組成。

將文字分割為三個檔案,train.tsv(訓練集),dev.tsv(驗證集),test.tsv(測試集);然後放置在同乙個data_dir資料夾下。

run_classifier.py中的**def main(_)?*函式中將processors的內容增加為

processors =

實現如下的mytaskprocessor(dataprocessor)類,並將這一段**放置在run_classifier.py和其他processor並列的位置。

**__init__(self)**中的self.labels含有所有的分類label。

class

mytaskprocessor

(dataprocessor)

:"""processor for the news data set (glue version)."""

def__init__

(self)

: self.labels =

['game'

,'fashion'

,'houseliving'

]def

get_train_examples

(self, data_dir)

:return self._create_examples(

self._read_tsv(os.path.join(data_dir,

"train.tsv"))

,"train"

)def

get_dev_examples

(self, data_dir)

:return self._create_examples(

self._read_tsv(os.path.join(data_dir,

"dev.tsv"))

,"dev"

)def

get_test_examples

(self, data_dir)

:return self._create_examples(

self._read_tsv(os.path.join(data_dir,

"test.tsv"))

,"test"

)def

get_labels

(self)

:return self.labels

def_create_examples

(self, lines, set_type)

:"""creates examples for the training and dev sets."""

examples =

for(i, line)

inenumerate

(lines)

: guid =

"%s-%s"

%(set_type, i)

text_a = tokenization.convert_to_unicode(line[1]

) label = tokenization.convert_to_unicode(line[0]

) inputexample(guid=guid, text_a=text_a, text_b=

none

, label=label)

)return examples

如果資料格式並不是乙個label,乙個tab,一段文字;則需要更改**_create_examples()**的實現。

新建乙個執行指令碼檔名為run.sh

export data_dir=/media/ganjinzero/code/bert/data/

export bert_base_dir=/media/ganjinzero/code/bert/chinese_l-12_h-768_a-12

python run_classifier.py \

--task_name=mytask \

--do_train=true \

--do_eval=true \

--data_dir=

$data_dir/ \

--vocab_file=

$bert_base_dir/vocab.txt \

--bert_config_file=

$bert_base_dir/bert_config.json \

--init_checkpoint=

$bert_base_dir/bert_model.ckpt \

--max_seq_length=128 \

--train_batch_size=32 \

--learning_rate=2e-5 \

--num_train_epochs=3.0 \

--output_dir=/mytask_output

其中data_dir是你的要訓練的文字的資料所在的資料夾,bert_base_dir是你的bert預訓練模型存放的位址。task_name要求和你的dataprocessor類中的名稱一致。下面的幾個引數,do_train代表是否進行fine tune,do_eval代表是否進行evaluation,還有未出現的引數do_predict代表是否進行**。max_seq_length代表了句子的最長長度,當視訊記憶體不足時,可以適當降低max_seq_length。

執行指令碼

./run.sh
可以得到類似如下樣式的結果

***** eval results *****

eval_accuracy = 0.845588

eval_loss = 0.505248

global_step = 343

loss = 0.505248

如果出現了這樣的輸出,就是執行成功了。在run.sh
裡指定的output_dir資料夾下可以看到模型的evaluation結果和fine-tune之後的模型檔案。

如果想要將bert模型的編碼和其他模型一起使用,將bert模型作為句子向量使用很有意義。我們可以使用bert-as-service來完成這個目標。

安裝完bert-as-service以後,就可以利用bert模型將句子對映到固定長度的向量上。在終端中用一下命令啟動服務:

bert-serving-start -model_dir /media/ganjinzero/code/bert/chinese_l-12_h-768_a-12 -num_worker=4
model_dir後面的引數是bert預訓練模型所在的資料夾。num_worker的數量應該取決於你的cpu/gpu數量。

這時就可以在python中呼叫如下的命令:

from bert_serving.client import bertclient

bc = bertclient(

)bc.encode(

['一二三四五六七八'

,'今天您吃了嗎?'

])

最好以列表的形式,而非單個字串傳給**bc.encode()**引數,這樣程式執行的效率較高。

github:bert

arxiv:bert

[github:bert-as-service](

bert預訓練模型解讀 Bert 預訓練小結

最近正在預訓練乙個中文pytorch版本的bert,模型部分 是基於huggingface發布的版本,預訓練過程還是參考google的 值得吐槽的是huggingface之前發布的分支名叫pytorch pretrain bert,後來又加上了gpt2 xlnet一系列當紅模型,結果索性改了個名字叫...

BERT 中文預訓練模型使用

只要是從事文字處理相關工作的人應該都知道 google 最新發布的 bert 模型,該模型屬於是詞向量的預訓練模型,一經提出便橫掃各大 nlp 任務,最近 google 公司如約推出了中文詞向量的預訓練模型,不得不說這是一件非常有良心的事情,在此膜拜和感謝 google 公司。那麼如何使用 bert...

基於bert預訓練模型的比較

基於bert預訓練模型的比較 electra roberta bert wwm albert xlnet 預訓練任務替換詞檢驗 遮掩詞 與bert相同 遮掩詞 sop permutation lm pretraining model生成器 判別器的模式,生成器與判別器的網路結構均為transform...