[SentencePiece]论文解读:SentencePiece: A simple and language independent subword tokenizer...

本文涉及的产品
NLP 自学习平台,3个模型定制额度 1个月
NLP自然语言处理_高级版,每接口累计50万次
NLP自然语言处理_基础版,每接口每天50万次
简介: [SentencePiece]论文解读:SentencePiece: A simple and language independent subword tokenizer...

论文:SentencePiece: A simple and language independent subword tokenizer and detokenizer for Neural Text Processing

作者:Taku Kudo, John Richardson

时间:2018

地址:google/sentencepiece: Unsupervised text tokenizer for Neural Network-based text generation. (github.com)

一、完整代码

这里我们使用python代码进行实现

# 完整代码在这里
import tensorflow as tf
import keras_nlp
inputs = tf.data.Dataset.from_tensor_slices(["Drifting Along"])
proto = keras_nlp.tokenizers.compute_sentence_piece_proto(inputs, vocabulary_size=15, lowercase=True)
tokenizer = keras_nlp.tokenizers.SentencePieceTokenizer(proto=proto)
outputs = inputs.map(tokenizer)
for output in outputs:
    print(output)
# tf.Tensor([ 4  8 12  5  9 14  5  6 13  4  7 10 11  6 13], shape=(15,), dtype=int32)

二、论文解读

SentencePiece是一个用于基于文本生成的无监督文本分词器,基本上结合了所有的分词算法于一身,是一个端到端的工具,并且不依赖于语言;也就是说无论什么语言丢进去就能做分词处理;

2.1 问题

  1. 不同语言需要进行不同的预处理

一般来说,BPEUnigram在处理tokenization的时候都需要文本已经经过了一次切割,以英文为例子:how are you应该被切割成了['how', 'are', 'you'];只有这样我们才能进行考虑单词的内部构造,因为BPEUnigram都是基于subwords的算法;现在的问题是,不是所有的语言其word都是以空格来进行分割的,对于中文来说,只能每个字符每个字符来切割,或者结合词表来切割;总结就是语言并不共享同一套预处理方式;

  1. 解码会存在不同,并不是无损的

hello world.为例子,假设得到的分割是['hello', 'world', '.'],这里解码的时候会得到hello world .,也就是在world.之间多了一个空格,这是我们不想看到的

  1. 没有一个端到端的解决方案

BPEUnigram并不能完整的解决问题,需要一个端到端的解决方案;

2.2 解决

  1. 把所有的字符都转化为unicode编码,包括空格

SentencePiece首先将所有文本的字符都转化为unicode字符,这也就意味着不需要去考虑不同的语言,字符或者符号,都视为一致的;

  1. SentencePiece把空格看作一个基本符号

SentencePiece为了精细化的处理空格,其将空格 转为_进行分割,比如hello world.,其会分割为[hello],[_wor],[ld],[.],这样处理就我们可以在没有任何歧义的情况下去标记文本;

  1. 不仅实现端到端的方案,而且更快

SentencePiece利用了优先队列对算法进行加速,分词时间大幅缩减,可以利用其作为一个端到端的分词工具;

2.3 应用

这里要介绍的是这里采用的模型类别有四种,分别是BPEUnigramwordchar

其中wordchar看字面意思就直到其是根据wordchar来进行分词,前者根据空格转的_来进行分词,而char是根据每个unicode来进行分词;

这里要讨论的便是BPEUnigram,其会对_来进行分割,然后各自适配其算法,但是在这里假设是中文呢,预处理的时候会分割成以空格开头的长字符串,看作word再进行subword分析;要注意的是BPE是小表变大表,Unigram是大表转小表,由于在转化的过程中一般有限制,这里建立在对中文分词时使用Unigram最好,这样会有长字符出现而不是统一都是单字符;

代码如下:

import tensorflow as tf
import keras_nlp
inputs = tf.data.Dataset.from_tensor_slices(["Drifting Along"])
proto = keras_nlp.tokenizers.compute_sentence_piece_proto(inputs, vocabulary_size=15, lowercase=True)
tokenizer = keras_nlp.tokenizers.SentencePieceTokenizer(proto=proto)
outputs = inputs.map(tokenizer)
for output in outputs:
    print(output)
# tf.Tensor([ 4  8 12  5  9 14  5  6 13  4  7 10 11  6 13], shape=(15,), dtype=int32)

三、总结

SentencePiece不应该看作一个分词算法,现有的分词算法貌似只有两种,BPE和Unigram,WordPiece和SentencePiece一样,其不过是做了一些改良;

SentencePiece NB!


目录
相关文章
|
3月前
|
存储 算法 计算机视觉
【博士每天一篇文献-模型】Meta-Learning Based Tasks Similarity Representation for Cross Domain Lifelong Learning
本文提出了一种基于元学习的跨域终身学习框架,通过跨域三元组网络(CDTN)学习任务间的相似性表示,并结合自注意模块与软注意网络(SAN)来增强特征提取和任务权重分配,以提高学习效率并减少对先前知识的遗忘。
47 1
【博士每天一篇文献-模型】Meta-Learning Based Tasks Similarity Representation for Cross Domain Lifelong Learning
|
6月前
|
机器学习/深度学习 自然语言处理 TensorFlow
[Character Embedding]论文实现:Text Understanding from Scratch
[Character Embedding]论文实现:Text Understanding from Scratch
33 2
|
6月前
|
Python
[UNILM]论文实现:Unified Language Model Pre-training for Natural Language.........
[UNILM]论文实现:Unified Language Model Pre-training for Natural Language.........
42 0
|
6月前
|
机器学习/深度学习 数据挖掘 Python
[Bart]论文实现:Denoising Sequence-to-Sequence Pre-training for Natural Language Generation...
[Bart]论文实现:Denoising Sequence-to-Sequence Pre-training for Natural Language Generation...
45 0
|
自然语言处理 算法
SIFRank New Baseline for Unsupervised Keyphrase Extraction Based on Pre-Trained Language Model
在社交媒体上,面临着大量的知识和信息,一个有效的关键词抽取算法可以广泛地被应用的信息检索和自然语言处理中。传统的关键词抽取算法很难使用外部的知识信息。
158 0
SIFRank New Baseline for Unsupervised Keyphrase Extraction Based on Pre-Trained Language Model
|
自然语言处理 算法 vr&ar
X-GEAR:Multilingual Generative Language Models for Zero-Shot Cross-Lingual Event Argument Extraction
我们提出了一项利用多语言预训练生成语言模型进行零样本跨语言事件论元抽取(EAE)的研究。通过将EAE定义为语言生成任务,我们的方法有效地编码事件结构并捕获论元之间的依赖关系。
120 0
|
自然语言处理 数据挖掘 数据处理
【提示学习】Exploiting Cloze Questions for Few Shot Text Classification and Natural Language Inference
目前流行的第四大范式Prompt的主流思路是PVP,即Pattern-Verbalizer-Pair,主打的就是Pattern(模板)与Verbalizer(标签映射器)。   本文基于PVP,提出PET与iPET,但是关注点在利用半监督扩充自己的数据集,让最终模型学习很多样本,从而达到好效果。
111 0
|
机器学习/深度学习 人工智能 自然语言处理
【论文精读】AAAI 2022 - Unified Named Entity Recognition as Word-Word Relation Classification
到目前为止,命名实体识别(NER)已经涉及三种主要类型,包括扁平、重叠(又名嵌套)和不连续NER,它们大多是单独研究的。
236 0
【论文精读】AAAI 2022 - Unified Named Entity Recognition as Word-Word Relation Classification
|
人工智能 数据可视化 决策智能
【CAMEL】Communicative Agents for “Mind”Exploration of Large Scale Language Model Society
【CAMEL】Communicative Agents for “Mind”Exploration of Large Scale Language Model Society
340 0
|
存储 自然语言处理 测试技术
LASS: Joint Language Semantic and Structure Embedding for Knowledge Graph Completion 论文解读
补全知识三元组的任务具有广泛的下游应用。结构信息和语义信息在知识图补全中都起着重要作用。与以往依赖知识图谱的结构或语义的方法不同
127 0