sentencepiece原理与实践

2023-11-09

1 前言

前段时间在看到XLNET,Transformer-XL等预训练模式时,看到源代码都用到sentencepiece模型,当时不清楚。经过这段时间实践和应用,觉得这个方法和工具值得NLP领域推广和应用。今天就分享下sentencepiece原理以及实践效果。

2 原理

sentencepiece由谷歌将一些词-语言模型相关的论文进行复现,开发了一个开源工具——训练自己领域的sentencepiece模型,该模型可以代替预训练模型(BERT,XLNET)中词表的作用。开源代码地址为:https://github.com/google/sentencepiece。其原理就相当于:提供四种关于词的切分方法。这里跟中文的分词作用是一样的,但从思路上还是有区分的。通过使用我感觉:在中文上,就是把经常在一起出现的字组合成一个词语;在英文上,它会把英语单词切分更小的语义单元,减少词表的数量。

例如“机器学习领域“这个文本,按jieba会分“机器/学习/领域”,但你想要粒度更大的切分效果,如“机器学习/领域”或者不切分,这样更有利于模型捕捉更多N-gram特征。为实现这个,你可能想到把对应的大粒度词加到词表中就可以解决,但是添加这类词是很消耗人力。然而对于该问题,sentencepiece可以得到一定程度解决,甚至完美解决你的需求。

模型在训练中主要使用统计指标,比如出现的频率,左右连接度等,还有困惑度来训练最终的结果。了解算法细节可以去githup上查看相关论文。

3 安装

GitHub官网提供了二种安装方式,第一种是通过vcpkg:

 

git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
./vcpkg install sentencepiece

第二种方式通过C++方式安装:
需要依赖的包有:

  • cmake
  • C++11 compiler
  • gperftools library (optional, 10-40% performance improvement can be obtained.)
    安装步骤先从githup把源码download下来,然后

 

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

4 训练

安装成功,就可以用自己的领域文本数据进行训练,训练的代码指令为:

 

spm_train --input='/home/deploy/sentencepiece/news_corpus.txt' -- model_prefix='/home/deploy/sentencepiece/mypiece' --vocab_size=320000 --character_coverage=1 --model_type='bpe' 

参数说明:

input 训练语料,形式为一行一段文本
model_prefix 模型输出的路径
vocab_size 训练后词表的大小,数量越大训练越慢,太小(<4000)可能训练不了
character_coverage 模型中覆盖的字符数,默认是0.995,中文语料设置为1
model_type 训练时模型的类别:
max_sentence_length 最大句子长度,默认是4192,长度貌似按字节来算,意味一个中文字代表长度为2
max_sentencepiece_length 最大的句子块长度,默认是16
seed_sentencepiece_size 控制句子数量,默认是100w
num_threads 线程数,默认是开16个
use_all_vocab 使用所有的tokens作为词库,不过只对word/char 模型管用
input_sentence_size 训练器最大加载数量,默认为0

5 测试

训练完模型后,可以调用模型进行效果测试。在调用模型前,先安装对应的python包:

 

pip install sentencepiece

具体是,我使用大小约1G的NLP相关的语料库,分别训练unigram和bpe两种模型。另外,我还对比了XLNET开源的中文sentencepiece模型,以及jieba分词效果。

 

def sentence_piece():
    import sentencepiece as spm
    sp = spm.SentencePieceProcessor()

    text="讲解了一下机器学习领域中常见的深度学习LSTM+CRF的网络拓扑 17:了解CRF层添加的好处 18: 
           EmissionScore TransitionScore 19:CRF的目标函数 20:计算CRF真实路径的分数"

    print("*****************text****************")
    print(text)
    print("*****************jieba****************")
    print(' '.join(jieba.cut(text)))

    print("*****************XLNET sentencepiece****************")
    sp.Load("/home/deploy/pre_training/spiece.model")
    print(sp.EncodeAsPieces(text))

    print("***************** unigram_sentencepiece****************")
    sp.Load("/home/deploy/pre_training/sentencepiece/mypiece_unigram.model")
    print(sp.EncodeAsPieces(text))

    print("***************** bpe_sentencepiece****************")
    sp.Load("/home/deploy/pre_training/sentencepiece/mypiece_pbe.model")
    print(sp.EncodeAsPieces(text))

测试结果如下:

 

6 结语

从测试结果可以看出:sentencpiece更倾向输出更大粒度的词,像把“机器学习领域中”放在一起,说明这个词语在语料库中出现的频率很高。XLNET中别人开源的模型跨领域表现的并不好,在面向自己应用场景时,需自己训练。此外,与jieba对比,会发现后者切分的可能并不是一个语言词,例如“的网络”,但这个N-gram特征对模型来说影响并不是很大。
就个人来说,我觉得sentencpiece给我带来了一定的惊喜,后续我会用它在下游任务上进行测试,再进一步验证它的效果,比如text-cnn文本分类。不过,我觉得它还是有改进空间的,像切分如“的网络”这样的结果,加一个停用词处理流程,可能会更好。



作者:烛之文
链接:https://www.jianshu.com/p/d36c3e06fb98
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sentencepiece原理与实践 的相关文章

  • STM32使用HAL库输出连续可调的PWM信号

    项目中要控制一个步进电机控制器 因为涉及到加减速过程 需要频率任意可变 总体思路是先初始化PWM定时器输出 之后直接修改ARR和PSC寄存器 初始化代码如下 函 数 名 bsp SetTIMOutPWM 功能说明 设置引脚输出的PWM信号的
  • PHP正则采集示例 sscanf

    sscanf从一个格式化字符串中读取输入 功能跟正则类似 输出结果 Age 25 Name John Gender male 正则三段论 定
  • Mycat+Mysql分布式架构改造和性能压力测试

    架构实现 Mycat作为数据库高可用中间件具备很多的功能 如负载均衡 分库分表 读写分离 故障迁移等 结合项目的实际情况 分库分表功能对于关联查询有很高的要求 需要从业务角度考虑分库分表后的关联查询SQL的分析 业务代码动作较大 所以在此方
  • 记一次线上fullgc排查历程

    在公司一次重大项目中 生产环境突然发生频繁fullgc问题 通过cat发出警告 很不幸 这次项目非常重要 领导很看重 所以得赶紧解决问题 下面就是排查的艰苦历程 22 10 线上可以报警 出现fullgc问题 初步判断是服务器少了 于是申请
  • 2023最新版IntelliJ IDEA安装教程(非常详细)从零基础入门到精通,看完这一篇就够了

    IDEA的使用 IDEA的简单介绍 IDEA的主要优势 IDEA的卸载 IDEA的安装 第一个程序 HelloWorld 结束语 IDEA的简单介绍 IDEA全称IntelliJ IDEA 是Java语言对的集成开发环境 IDEA在业界被认
  • ajax无法获取null,Ajax未捕获TypeError:无法读取属性'点击'null

    我无法找出错误的原因 我不断收到Uncaught TypeError Cannot read property click of null错误 我确实在按钮中定义了 product btn类 Ajax未捕获TypeError 无法读取属性
  • 甲骨文 CleanCache 将从 Linux 内核中清除;GNU Parallel 20 周年;Openfire 4.6.7 发布

    整理 宋彤彤 责编 屠敏 开源吞噬世界的趋势下 借助开源软件 基于开源协议 任何人都可以得到项目的源代码 加以学习 修改 甚至是重新分发 关注 开源日报 一文速览国内外今日的开源大事件吧 一分钟速览新闻点 甲骨文研发的 CleanCache
  • java 常见的异常错误代码

    java异常错误代码 1 应当谨慎地使用那些只有HTTP1 1支持的状态代码 因为许多浏览器还只能够支持HTTP1 0 如果你使用了 HTTP1 1特有的状态代码 最好能够检查一下请求的HTTP版本号 状态代码 状态信息 含义 2 100错
  • Java 中有哪些类型的流?

    Java 中的流 Stream 分为两种类型 字节流和字符流 字节流 Byte Stream 字节流可以处理任何类型的数据 但是它们是以字节为单位进行操作的 Java 中提供了两种字节流 InputStream 和 OutputStream
  • 区块链学习路线图!

    分享关于区块链的学习的大致方向和路线

随机推荐

  • [519]matplotlib(二)

    3D 散点图绘制 scatter from mpl toolkits mplot3d import Axes3D import numpy as np from matplotlib import pyplot as plt 生成3D示例数
  • 虚拟化技术基础汇总(特全,初学者值得一看)

    虚拟化意味着应用程序可以使用一个资源 而不必担心它驻留在哪里 技术接口是什么 它是如何实现的 它使用的平台以及它有多少可用 里克 F 范德兰斯 目录 一 什么是虚拟化 1 虚拟化概念 2 虚拟化的类型 服务器虚拟化 网络虚拟化 桌面虚拟化
  • Pandas--DataFrame修改值

    pandas要修改值先需要了解DataFrame的一些知识 此处参照的是pandas的官方文档 When setting values in a pandas object care must be taken to avoid what
  • STM32学习笔记

    STM32笔记 STM32笔记 ADC TIM定时器 定时中断基本结构 代码配置 PWM PWM初始化 EXTI外部中断 NVIC基本结构 EXIT简介 代码配置 GPIO输出 单独操作输出数据寄存器的某一位的方法 GPIO8种模式 代码操
  • wireshark:界面介绍

    菜单栏 文件 打开文件集 保存包 导出HTTP对象 编辑 清除所有标记的包 忽略包和时间属性 视图 查看 隐藏工具栏和面板 编辑Time列 重设颜色 跳转 捕获 分析 创建显示过滤器宏 查看启用协议 保存关注解码 统计 创建图表并打开各种协
  • 网络空间安全进入动态防御时代

    现代计算机网络中包括各种各样的设备和软件 这些设备和软件存在着大量的未知和已知漏洞 漏洞是安全问题的根本 在漏洞面前 攻守双方并不平等 一个弱点被黑客利用 最终可以导致危险在整个网络扩散 漏洞具有的高威胁性 突发性 高破坏性 大规模性的主要
  • Introduction to Data-Centric AI 以数据为中心的人工智能导论

    文章目录 前言 一 Data Centric AI vs Model Centric AI 二 Label Errors and Confident Learning 1 引入库 2 读入数据 总结 前言 本博客笔记来源于MIT的课程 In
  • keil5安装出现error:A1023E等信息

    这是因为在安装的时候没有将环境变量配置好 应该配置如下
  • 国家大力发展集成电路,是否意味着微电子行业在中国前景可以?

    集成电路是信息化 数字化的基石 是全球信息产业的基础 用于通信 安防 军事 工业 交通 消费电子等领域 现在的消费电子 互联网 数字图像 网络通信 云计算 大数据 人工智能发展都得靠它 而在国家安全 经济 日常生活中是不可或缺的 如果是这种
  • 前端笔试题

    目录 1 选择器的优先级 从上往下依次降低 是 2 下述有关 border none 以及 border 0 的区别 描述错误的是 3 关于a元素 以下说法正确的有 4 History对象的属性或方法描述正确的是 5 在HTML5中 为in
  • Matlab中的点数据生成图

    目录 简单的背景介绍 尝试plot3 构造矩阵 遍历填充 无优化版遍历填充 优化后的遍历填充 简单的背景介绍 今天蠢师弟用comsol导出了一个模拟数据 用matlab打开一看是一个数据长度 189739 3 189739 3 189739
  • 嵌入式物联网毕业设计选题智能图像识别项目-stm32mp157 linux开发板

    stm32mp157开发板FS MP1A是华清远见自主研发的一款高品质 高性价比的Linux 单片机二合一的嵌入式教学级开发板 开发板搭载ST的STM32MP157高性能微处理器 集成2个Cortex A7核和1个Cortex M4 核 A
  • R语言第八次课堂小测 rattle的应用(包括rattle的安装)

    题目 安装rattle 并使用rattle 用三种聚类方法对鸢尾花数据集进行聚类 步骤一 修改镜像源 首先 在Rstudio上打开如下界面 进入后 找到packages 再点击change 下图是已经更换了的截图 选择中国的任意一个镜像 最
  • ./configure之后报错

    首先要看报的错误是什么 一般从第一条开始解决 因为有可能下面的错误是由上面的导致的
  • js 判断变量类型(完整版),包括ES6 新类型Symbol

    欢迎来到Altaba的博客 相信大家在开发中遇到需要判断变量类型的问题 js变量按存储类型可分为值类型和引用类型 值类型包括Undefined String Number Boolean 引用类型包括object Array Functio
  • 股票和期货的区别(股指期货1个点赚多少钱)

    股票和期货的辨别 股票的最后含意即是说不妨表明你购置了这家公司的股子 而期货 则是买卖两边按照各自对目标物的将来价钱预期 以此刻的价钱签署的合约 观念既是仍旧领会了 那咱们就再领会一下这几个的辨别 1 目标物 目标物也即是买卖东西 菜商场里
  • 【深度学习】SETR:基于视觉 Transformer 的语义分割模型

    Visual Transformer Author louwill Machine Learning Lab 自从Transformer在视觉领域大火之后 一系列下游视觉任务应用研究也随之多了起来 基于视觉Transformer的语义分割正
  • OpenMMLab AI实战营第二期(2)MMPose初体验

    根据MMPose的官方文档学习一下 MMPose文档地址 https mmpose readthedocs io zh CN latest index html 文章目录 1 概述 2 安装 2 1 创建conda环境并激活 2 2 安装p
  • mysql锁

    想要了解锁 必须要知道mysql事务 以及mysql事务产生的并发问题 数据库中的事务 隔离级别 以及数据展示 華同学 的博客 CSDN博客 1 Mysql锁的介绍 锁是计算机协调多个线程或进程并发访问某一资源的机制 除传统的计算机资源 C
  • sentencepiece原理与实践

    1 前言 前段时间在看到XLNET Transformer XL等预训练模式时 看到源代码都用到sentencepiece模型 当时不清楚 经过这段时间实践和应用 觉得这个方法和工具值得NLP领域推广和应用 今天就分享下sentencepi