什么是SentencePiece?
SentencePiece是谷歌推出的子词开源工具包,它是把一个句子看作一个整体,再拆成片段,而没有保留天然的词语的概念。一般地,它把空格也当作一种特殊字符来处理,再用BPE或者Unigram算法来构造词汇表。SentencePiece除了集成了BPE、ULM子词算法之外,还能支持字符和词级别的分词。
他是一种无监督的文本 tokenizer 和 detokenizer,主要用于基于神经网络的文本生成系统,其中,词汇量在神经网络模型训练之前就已经预先确定了。 SentencePiece 实现了subword单元(例如,字节对编码 (BPE))和 unigram 语言模型),并可以直接从原始句子训练子词模型(subword model)。 这使得我们可以制作一个不依赖于特定语言的预处理和后处理的纯粹的端到端系统。
SentencePiece优势:
- 以unicode方式编码字符,将所有的输入(英文、中文等不同语言)都转化为unicode字符,解决了多语言编码方式不同的问题。
- 将空格编码为‘_’, 如'New York' 会转化为['▁', 'New', '▁York'],这也是为了能够处理多语言问题,比如英文解码时有空格,而中文没有, 这种语言区别
- 优化了速度,如果实时处理输入并对原始输入执行标记化,则速度会太慢。 SentencePiece 通过使用 BPE 算法的优先级队列来加速它来解决这个问题,以便可以将它用作端到端解决方案的一部分。
使用SentencePiece示例:
SentencePiece开源代码地址:https://github.com/google/sentencepiece
import sentencepiece as sp
# 训练 Sentencepiece 模型
sp.SentencePieceTrainer.Train(input='data.txt', model_prefix='sp', vocab_size=5000)
# 载入模型
spp = sp.SentencePieceProcessor()
spp.Load('sp.model')
# 进行分词
text = '我喜欢北京烤鸭'
tokens = spp.EncodeAsPieces(text)
print(tokens) # 输出结果为 ['▁我', '喜欢', '北京', '烤鸭']
常见使用SentencePiece的LM:T5