sentencePiece入门小结

本文详细介绍了SentencePiece分词器的环境搭建过程,包括C++源码版和Python接口的安装方法,以及常见错误的解决方案。此外,还提供了模型训练参数详解和python接口的使用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境搭建

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)  #切词

参考资料

### SentencePiece 工具或库的使用方法 #### 安装方式 可以通过两种主要途径安装 SentencePiece: 1. **通过源码编译安装** 需要先从 GitHub 仓库克隆 SentencePiece 项目。可以运行以下命令完成操作: ```bash git clone https://github.com/google/sentencepiece.git cd sentencepiece mkdir build && cd build cmake .. make -j $(nproc) sudo make install sudo ldconfig ``` 此外,还需要单独构建 Python 绑定部分[^1]。 2. **通过预编译包安装** 如果不想手动编译,可以直接下载官方发布的最新版本 wheel 文件。可以从以下链接访问并获取所需文件: [https://github.com/google/sentencepiece/releases/latest](https://github.com/google/sentencepiece/releases/latest)[^2] 对于 Python 用户来说,推荐直接使用 pip 进行安装: ```bash pip install sentencepiece ``` --- #### 基本功能介绍 SentencePiece 是一种用于子词单元(subword units)训练和编码的语言无关分词模型。它支持多种语言,并能自动学习适合特定语料的最佳分割策略。其核心功能包括但不限于以下几个方面: - 子词单元的学习:基于输入数据集自动生成词汇表。 - 文本编码/解码:将原始文本转换为 token 序列或将序列还原成文本形式。 - 支持 BPE 和 Unigram Language Model (ULM) 方法进行建模。 具体实现上,提供了 C++ API 和多语言绑定接口(Python、Java 等),方便开发者集成到不同平台的应用程序中去。 --- #### 示例代码展示 以下是利用 `sentencepiece` 的简单例子来说明如何加载已有模型以及处理新句子的过程。 ```python import sentencepiece as spm # 加载已有的 SPM 模型 sp = spm.SentencePieceProcessor() model_path = 'path/to/model/file.model' sp.load(model_path) # 编码示例字符串 input_text = "这是一个测试句。" encoded_ids = sp.encode_as_pieces(input_text) print(f"Encoded pieces: {encoded_ids}") decoded_text = sp.decode_pieces(encoded_ids) print(f"Decoded text: {decoded_text}") ``` 上述脚本展示了怎样读取外部 `.model` 文件并将中文短语转化为对应的 subwords 表达形式再恢复原样。 --- #### 参考资料扩展阅读建议 为了更深入理解该工具的工作原理及其应用场景,可进一步查阅官方文档或者探索实际案例分析文章。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值