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