12月07, 2019

SentencePiece多语言分词

SentencePiece是什么

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

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

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

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

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

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

原理

不同于Jieba中使用HMM发现新词,和使用统计的方法寻找新词,SentencePiece支持以下算法:

  • BPE: byte-pair-encoding
  • unigram: unigram language model
  • char
  • word

安装

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

$ sudo pip install SentencePiece

2) 下载源码

$ git clone https://github.com/google/sentencepiece
% sudo apt-get install cmake build-essential pkg-config libgoogle-perftools-dev

% cd /path/to/sentencepiece
% mkdir build
% cd build
% cmake ..
% make -j $(nproc)
% sudo make install
% sudo ldconfig -v

训练模型

$ spm_train --input=/tmp/a.txt --model_prefix=/tmp/test

使用模型

1) 命令行调用

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

2) Python程序调用

import sentencepiece as spm

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

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

使用技巧

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

Github

https://github.com/google/sentencepiece#subword-regularization

本文链接:http://57km.cc/post/SentencePiece.html

-- EOF --

Comments