[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!


目录
相关文章
|
10月前
|
机器学习/深度学习 自然语言处理 算法
大语言模型中常用的tokenizer算法
不同算法有各自的适用场景和优缺点,选择时应根据具体需求和数据特点进行综合考虑。通过本文的介绍,希望您能更好地理解和应用这些tokenizer算法,从而提升NLP任务的效果和效率。
857 9
|
8月前
|
Java 数据库连接 数据库
微服务——MyBatis配置——多环境配置
在 MyBatis 中,多环境配置允许为不同数据库创建多个 SqlSessionFactory。通过传递环境参数给 SqlSessionFactoryBuilder,可指定使用哪种环境;若忽略,则加载默认环境。`environments` 元素定义环境配置,包括默认环境 ID、事务管理器和数据源类型等。每个环境需唯一标识,确保默认环境匹配其中之一。代码示例展示了如何构建工厂及配置 XML 结构。
136 0
|
9月前
|
运维 监控 安全
代理IP故障排查,怎样快速锁定问题?
在信息化时代,互联网不可或缺,业务需求使HTTP动态代理IP的应用日益广泛。为快速排查代理IP故障,可采取以下步骤:1. 检查代理IP有效性(Ping测试、HTTP请求测试);2. 监控连接速度(延迟、带宽测试);3. 分析错误信息(HTTP状态码、错误日志);4. 检查代理设置(配置文件、协议支持);5. 使用调试工具(Wireshark、浏览器开发者工具);6. 咨询服务提供商;7. 检查网络环境(防火墙、ISP限制);8. 逐步故障排除并记录变化。通过这些方法,能有效找出并解决问题。
282 5
|
前端开发 JavaScript API
前端框架新探索:Svelte在构建高性能Web应用中的优势
【10月更文挑战第26天】近年来,前端技术飞速发展,Svelte凭借独特的编译时优化和简洁的API设计,成为构建高性能Web应用的优选。本文介绍Svelte的特点和优势,包括编译而非虚拟DOM、组件化开发、状态管理及响应式更新机制,并通过示例代码展示其使用方法。
333 2
|
存储 SQL 数据库
触发器的设计、掌握存储过程的基本概念和创建、执行、删除方法。掌握数据库备份的方法和数据库恢复的方法。
这篇文章介绍了数据库中触发器的设计概念,包括创建、修改、删除触发器的方法,并通过实验内容教授如何使用SQL命令创建DML触发器以及如何利用触发器实现数据的完整性和自动化处理。
触发器的设计、掌握存储过程的基本概念和创建、执行、删除方法。掌握数据库备份的方法和数据库恢复的方法。
|
机器学习/深度学习 自然语言处理 语音技术
注意力机制(Attention Mechanism)
注意力机制(Attention Mechanism)
527 0
|
JavaScript
vue 在线聊天实战范例(含选择发送表情、图片、视频、音频,自定义右键快捷菜单,一键复制,左右聊天气泡)
vue 在线聊天实战范例(含选择发送表情、图片、视频、音频,自定义右键快捷菜单,一键复制,左右聊天气泡)
613 0
|
消息中间件 分布式计算 搜索推荐
【KafkaStream】微服务学习笔记十一:流式计算概述&KafkaStream入门
【KafkaStream】微服务学习笔记十一:流式计算概述&KafkaStream入门
743 0
【KafkaStream】微服务学习笔记十一:流式计算概述&KafkaStream入门
|
机器学习/深度学习 PyTorch 算法框架/工具
神经网络参数初始化
**神经网络参数初始化**是深度学习的关键步骤。权重常通过**Xavier**或**He**初始化来打破对称性,适用于ReLU激活;而偏置通常初始化为0。初始化方法还包括**均匀分布**、**正态分布**、**全零**、**全一**和**固定值**。在PyTorch中,`torch.nn.init`模块提供了如`xavier_uniform_`和`kaiming_normal_`等初始化函数。预训练模型也可用于初始化,通过微调提升性能。