sentencePiece入门小结

环境搭建

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 训练出的词库大小,不指定的话就是8000
  • character_coverage 模型中覆盖的字符数,默认是0.995,对于字符集丰富的中文最好是1
  • model_type 训练使用的模型,四种可选,不指定的话就使用unigram模型

其它比较有用的参数:

  • max_sentence_length 控制模型输入句子的长度,默认是4192,超过这个长度的句子会被过滤掉
  • max_sentencepiece_length 最大的句子块长度,默认是16
  • seed_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)  #切词

参考资料

  • https://github.com/google/sentencepiece
  • http://114.115.240.75/?p=729
  • https://github.com/google/sentencepiece/issues/308
  • https://github.com/google/sentencepiece/issues/226

你可能感兴趣的:(NLP,分词,python,sentencePiece)