自然语言处理之 _SentencePiece 分词

#自然语言处理

1、说明

 SentencePiece 是一个 google 开源的自然语言处理工具包。网上是这么描述它的:数据驱动、跨语言、高性能、轻量级——面向神经网络文本生成系统的无监督文本词条化工具。

  那么它究竟是干什么的呢?先举个例子:假设在数据挖掘时,有一列特征 T 是文本描述,我们需要将其转成枚举型,或者多个布尔型代入模型,即:需要从文本中提供信息构造新特征。

  首先,我们可以用标点将长句长分成短句,以短句作为关键词,看每个实例的特征 T 中是否包含该关键词,从而构造新的布尔型特征。但有时候表达同一个意思所使用的文本并不完全一致,比如“买三送一”和“买三送一啦!”是一个意思。

  此时,我们可以用 SnowNLP 或者 jieba 分词把描述拆成单个词,看 T 是否包括该关键词。但这样用也有一个问题:可能把一个意思拆成了多个特征,比如“袖子较短,领子较大”被拆成了四个独立的特征“袖子”“较短”“领子”“较大”,组合效果没有了。

  我们想要的效果是:如果“袖子较短”这个组合经常出现,就把它当成一个词处理。jieba 中可以用自定义词典的方式加入已知的词。

  还有一些组合常常出现,但事先并不知道,于是我们想让机器自动学习经常组合出现的短语和词。SentencePiece 就是来解决这个问题的。它需要大量文本来训练。

 SentencePiece 的用途不限于自然语言处理,记得 DC 之前有一个药物分子筛选的比赛,蛋白质的一级结构是氨基酸序列,需要研究氨基酸序列片断,片断的长度又是不固定的,此处就可以用 SentencePiece 进行切分。原理是重复出现次数多的片断,就认为是一个意群(词)。

2、安装

 SentencePiece 分为两部分:训练模型和使用模型,训练模型部分是用 C 语言实现的,可编成二进程程序执行,训练结果是生成一个 model 和一个词典文件。

  模型使用部分同时支持二进制程序和 Python 调用两种方式,训练完生成的词典数据是明文,可编辑,因此也可以用任何语言读取和使用。

1) 在 Ubuntu 系统中安装 Python 支持

1
$ sudo pip install SentencePiece

2) 下载源码

1
2
3
4
$ git clone https://github.com/google/sentencepiece
$ cd sentencepiece
$ ./autogen.sh
$ ./confiture; make; sudo make install # 注意需要先安装autogen,automake等编译工具

3、训练模型

1
2
$ spm_train --input=/tmp/a.txt --model_prefix=/tmp/test
# --input指定需要训练的文本文件,--model_prefix指定训练好的模型名,本例中生成/tmp/test.model和/tmp/test.vocab两个文件,vocab是词典信息。

4、使用模型

(1) 命令行调用

1
$ echo "食材上不会有这样的纠结" | spm_encode --model=/tmp/test.model

(2) Python 程序调用

1
2
3
4
5
6
7
import sentencepiece as spm

sp = spm.SentencePieceProcessor()
text = "食材上不会有这样的纠结"

sp.Load("/tmp/test.model")
print(sp.EncodeAsPieces(text))

5、使用技巧

  如果我们分析某个领域相关问题,可以用该领域的书籍和文档去训练模型。并不限于被分析的内容本身。训练数据越多,模型效果越好。更多参数及用法,请见 git 上的说明文件。

6、参考

(1) 用法示例

https://pypi.org/project/sentencepiece/0.0.0/

(2) 训练示例

https://github.com/google/sentencepiece#train-sentencepiece-model