一、在Ubuntu下安装sentencepiece的C++版本
1、安装环境依赖
sudo apt-get install cmake build-essential pkg-config libgoogle-perftools-dev
2、源文件编译
git clone https://github.com/google/sentencepiece.git
cd sentencepiece
mkdir build
cd build
cmake ..
make -j $(nproc)
sudo make install
sudo ldconfig -v
这里git下载很慢,可以采用sz和rz工具在windows端下载好文件后上传到Ubuntu
2.1安装sz和rz
一般来说,linux服务器大多是通过ssh客户端来进行远程的登陆和管理的,使用ssh登陆linux主机以后,如何能够快速的和本地机器进行文件的交互呢,也就是上传和下载文件到服务器和本地;
与ssh有关的两个命令可以提供很方便的操作:
sz:将选定的文件发送(send)到本地机器
rz:运行该命令会弹出一个文件选择窗口,从本地选择文件上传到服务器(receive)
apt-get install -y lrzsz
此处我用的是SecureCRT,具体的更改 rz上传/sz下载 的默认的路径的方法:
右键点击当前会话session -> Session Options -> Terminal -> Xmodem/Zmodem ->Directories
3、Build and install using vcpkg
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
./vcpkg install sentencepiece
如果报错按照相应的提示进行即可
二、使用spm_train对语料库构建词典
spm_train --input='result1.txt' --model_prefix='mymodel' --vocab_size=30000 --pad_id=0 --unk_id=1 --eos_id=-1 --bos_id=-1 --control_symbols=[CLS],[SEP],[MASK] --input_sentence_size=10000000 --character_coverage=1 --model_type=char --vocabulary_output_piece_score=false
input为语料库
model_prefix为保存的模型前缀名
vocab_size为保存的词典的大小
pad_id,unk_id,eos_id,bos_id当等于-1时没有这个特殊标识
vocabulary_output_piece_score为是否保留分词后的分数
character_coverage为模型覆盖的字符数
model_type为模型类型:
unigram:就是一元分词,把句子从头到尾分成一个一个的汉字。
bpe:字节对编码,首先将词分成一个一个的字符,然后在词的范围内统计字符对出现的次数,每次将次数最多的字符对保存起来,直到循环次数结束,具体推演的话可以看论文
char:字符型分词
word:使用这种模式,使用的语料首先要经过预分词
三、代码测试
1、安装sentencepiece模块
pip install sentencepiece
2、代码测试
import sentencepiece as spm
sp=spm.SentencePieceProcessor()
text='建议做次胃镜及肝胆脾胰彩超检查以排除相关疾病,并予中药治疗。'
sp.Load('mymodel.model')
print(sp.EncodeAsPieces(text))
3、结果
['▁', '建', '议', '做', '次', '胃', '镜', '及', '肝', '胆', '脾', '胰', '彩', '超', '检', '查', '以', '排', '除', '相', '关', '疾', '病', ',', '并', '予', '中', '药', '治', '疗', '。']