BERT 處理中文分類和相似度

2021-10-06 10:03:16 字數 2861 閱讀 6576

使用bert做中文文字相似度計算.html

簡介最近google推出了nlp大殺器bert,bert(transformer雙向編碼器表示)是google ai語言研究人員最近發表的一篇**。它通過在各種nlp任務中呈現最先進的結果,包括問答系統、自然語言推理等,引起了機器學習社群的轟動。

tensorflow 用來儲存預訓練模型的三個 checkpoint 檔案(bert_model.ckpt.***)

字典檔案,用於做id的對映 (vocab.txt)

配置檔案,該檔案的引數是fine-tuning時模型用到的,可自行調整 (bert_config.json)

編寫**

模型準備好後就可以編寫**了,我們先把bert的github**clone下來,之後我們的**編寫會基於run_classifier.py檔案,我們看下**的結構

可以看到有好幾個***processor的類,這些類都有同乙個父類dataprocessor,其中dataprocessor提供了4個抽象方法,如圖

顧名思義,processor就是用來獲取對應的訓練集、驗證集、測試集的資料與label的資料,並把這些資料餵給bert的,而我們要做的就是自定義新的processor並重寫這4個方法,也就是說我們只需要提供我們自己場景對應的資料。這裡我自定義了乙個名叫simprocessor的類,我們簡單看一下

讀取的資料需要封裝成乙個inputexample的物件並新增到list中,注意這裡有乙個guid的引數,這個引數是必填的,是用來區分每一條資料的。是否進行訓練集、驗證集、測試集的計算,在執行**時會有引數控制,我們下文會講,所以這裡的抽象方法也並不是需要全部都重寫,但是為了體驗乙個完整的流程, 建議大家還是簡單寫一下。

get_labels方法返回的是乙個陣列,因為相似度問題可以理解為分類問題,所以返回的標籤只有0和1,注意,這裡我返回的是引數是字串,所以在重寫獲取資料的方法時inputexample中的label也要傳字串的資料,可以看到上圖中我對label做了乙個str()的處理。

接下來還需要給processor加乙個名字,讓我們的在執行時告訴**我們要執行哪乙個processor,如圖我自定義的叫做sim

訓練模型

ok,到這裡我們已經把processor編寫好了,接下來就是執行**了,我們來看下run_classifier.py的執行過程。

可以看到,在執行run_classifier.py時需要先輸入這5個必填引數,這裡我們對引數做乙個簡單的說明

引數     說明

data_dir     訓練資料的位址

task_name     processor的名字

vocab_file     字典位址,用預設提供的就可以了,當然也可以自定義

bert_config_file     配置檔案

output_dir     模型的輸出位址

當然還有一些其他的引數,這裡給出官方提供的執行引數

export bert_base_dir=/users/joe/desktop/chinese_l-12_h-768_a-12

export my_dataset=/users/joe/desktop/bert_data

python run_classifier.py \

--data_dir=$my_dataset \

--task_name=sim \

--vocab_file=$bert_base_dir/vocab.txt \

--bert_config_file=$bert_base_dir/bert_config.json \

--output_dir=/tmp/sim_model/ \

--do_train=true \

--do_eval=true \

--init_checkpoint=$bert_base_dir/bert_model.ckpt \

--max_seq_length=128 \

--train_batch_size=32 \

--learning_rate=5e-5\

--num_train_epochs=2.012

3456

78910

1112

1314

1516

17這裡再補充下以下三個可選引數說明

引數     說明

do_train     是否做fine-tuning,預設為false,如果為true必須重寫獲取訓練集的方法

do_eval     是否執行驗證集,預設為false,如果為true必須重寫獲取驗證集的方法

dopredict     是否做**,預設為false,如果為true必須重寫獲取測試集的方法

**執行以上的**即可訓練我們自己的模型了,如果需要使用模型來進行**,可執行以下命令

python run_classifier.py \

--task_name=sim \

--do_predict=true \

--data_dir=$my_dataset \

--vocab_file=$bert_base_dir/vocab.txt \

--bert_config_file=$bert_base_dir/bert_config.json \

--init_checkpoint=/tmp/sim_model \

--max_seq_length=128 \

--output_dir=/tmp/output/12

3456

789當然,我們需要在data_dir下有測試資料,測試完成後會在output_dir路徑下生成乙個test_results.tsv檔案,該檔案包含了測試用例和相似度probabilities

總結除了相似度計算,以上的**完全能夠用來做文字二分類,你也可以根據自己的需求來修改processor,更多的細節大家可以參閱github原始碼。

使用BERT做中文文字相似度計算與文字分類

最近google推出了nlp大殺器bert,bert transformer雙向編碼器表示 是google ai語言研究人員最近發表的一篇 它通過在各種nlp任務中呈現最先進的結果,包括問答系統 自然語言推理等,引起了機器學習社群的轟動。本文不會去講解bert的原理,如果您還不清楚什麼是bert建議...

BERT 處理中文文字任務

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

自然語言處理的中文文字相似度

前言 人與計算機的互動過程中,如果能提供人類的自然語言形式來進行交流,那麼人與計算機就能更加親密友好。而要實現這一機制就需要自然語言處理來處理,一般來說自然語言處理會涉及幾個學科 電腦科學 語言學 統計學和數學等。不同語言的自然語言處理也存在差別,對於中文來說,很多時候都無法直接套用英語自然語言處理...