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
很简单,一句话就可以了,也支持训练和分词,但是在细节上还是没有源码版齐全,训练速度稍微慢点,因此还是建议装一个c++版,再装一个python包进行调用。
pip install sentencepiece
可以看做是一个分词算法,而且用在做特定领域的新词发现上还是蛮不错的,包含4种模型训练方式:
重要参数:
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
之前在github项目上有python的具体用法,但是这几天不见了,先分享调用模型分词的代码,希望之后作者能够补上吧。
import sentencepiece as spm
sp = spm.SentencePieceProcessor()
sp.Load("test/test_model.model") #加载训练好的模型
test_text = "这是一个测试"
sp.EncodeAsPieces(test_text) #切词