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

2021-09-02 05:15:05 字數 3074 閱讀 4257

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

本文不會去講解bert的原理,如果您還不清楚什麼是bert建議先參閱google的**或者其他博文,本文主要目的在於教會大家怎麼使用bert的預訓練模型。

模型準備好後就可以編寫**了,我們先把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

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.0

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

引數說明

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/

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

NLP 中文文字相似度實戰

原文 1 基於詞向量 余弦相似度,曼哈頓距離,歐幾里得距離,明式距離 是前兩種距離測度的推廣 2 基於字元 編輯距離,simhash 適用於海量資料 共有字元數 有點類似 onehot 編碼,直接統計兩個文字的共有字元數,最 3 基於概率統計 傑卡德相似係數 4 基於詞嵌入模型 word2vec d...

計算文字相似度 最準的中文文字相似度計算工具

向ai轉型的程式設計師都關注了這個號?text2vec,chinese text to vetor.文字向量化表示工具,包括詞向量化 句子向量化 本文相關 獲取 ai專案體驗位址 文字相似度計算 query和docs的相似度比較 result 文字相似度計算 儘管文字相似度計算的基準方法很簡潔,但用...

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

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