環境搭建
1.安裝C++源碼版
step1 安裝環境依賴
ubuntu系統:
sudo apt-get install cmake build-essential pkg-config libgoogle-perftools-dev
centos系統:
sudo yum install cmake pkg-config gperfools-devel
注:如果之前安裝過cmake,但是3.1以下的,會編譯不成功,因此需要安裝更高版本的3.1以上版本的,具體更新辦法戳這裏。
step2 下載項目並進行編譯
% git clone https://github.com/google/sentencepiece
% cd /path/to/sentencepiece
% mkdir build
% cd build
% cmake ..
% make -j $(nproc)
% sudo make install
% sudo ldconfig -v
安裝過程中可能遇到的錯誤
運行spm_train報錯:
spm_train: error while loading shared libraries: libsentencepiece.so.0: cannot open shared object file: No such file or directory
解決方案:
echo "/usr/local/lib" >> /etc/ld.so.conf
ldconfig
2.安裝python調用接口
很簡單,一句話就可以了,也支持訓練和分詞,但是在細節上還是沒有源碼版齊全,訓練速度稍微慢點,因此還是建議裝一個c++版,再裝一個python包進行調用。
pip install sentencepiece
sentencePiece簡介
可以看做是一個分詞算法,而且用在做特定領域的新詞發現上還是蠻不錯的,包含4種模型訓練方式:
- unigram,就是一元分詞,把句子從頭到尾分成一個一個的漢字
- bpe,字節對編碼,首先將詞分成一個一個的字符,然後在詞的範圍內統計字符對出現的次數,每次將次數最多的字符對保存起來,直到循環次數結束,具體推演的話可以看論文
- char,字符型分詞
- word,使用這種模式,使用的語料首先要經過預分詞
模型訓練參數
重要參數:
input
每行一句的訓練文本的路徑model_prefix
輸出模型的路徑vocab_size
訓練出的詞庫大小,不指定的話就是8000character_coverage
模型中覆蓋的字符數,默認是0.995,對於字符集豐富的中文最好是1model_type
訓練使用的模型,四種可選,不指定的話就使用unigram模型
其它比較有用的參數:
max_sentence_length
控制模型輸入句子的長度,默認是4192,超過這個長度的句子會被過濾掉max_sentencepiece_length
最大的句子塊長度,默認是16seed_sentencepiece_size
種子訓練句子量,默認是100w條num_threads
線程數,默認是開16個use_all_vocab
使用所有的tokens作爲詞庫,不過只對word/char 模型管用input_sentence_size
訓練器最大加載數量,默認爲0,作者說爲了避免內存溢出,只會選擇100萬句子進行訓練,對應的就是seed_sentencepiece_size吧
訓練模型時需要注意的點
1.語料太少,報錯
RuntimeError: Internal: C:\projects\sentencepiece\src\trainer_interface.cc(468) [(trainer_spec_.vocab_size()) == (model_proto->pieces_size())]
這是因爲保留的詞小於4000,就會報這個錯,sentencepiece最好拿大語料去訓練
解決方法:
--hard_vocab_limit=false #在訓練命令的參數加一個這個參數就可以解決
2.訓練大語料值得參考的參數設置
spm_train --input=my_input --model_prefix=en_clean_unigram --vocab_size=32000 --character_coverage=1.0 --model_type=unigram --num_threads=40 --input_sentence_size=5000000 --shuffle_input_sentence=true
python接口用法
之前在github項目上有python的具體用法,但是這幾天不見了,先分享調用模型分詞的代碼,希望之後作者能夠補上吧。
import sentencepiece as spm
sp = spm.SentencePieceProcessor()
sp.Load("test/test_model.model") #加載訓練好的模型
test_text = "這是一個測試"
sp.EncodeAsPieces(test_text) #切詞