【Transformer系列】深入浅出理解Tokenization分词技术

news2024/9/25 13:24:58

一、参考资料

NLP技术中的Tokenization是什么?核心任务是什么?

二、Tokenization相关介绍

1. Tokenization的概念

NLP技术中Tokenization被称作是“word segmentation”,直译为分词。具体来说,分词是NLP的基础任务,按照特定需求能把文本中的句子、段落切分成一个字符串序列(其中的元素通常称为token或叫词语),方便后续的处理分析工作。

分词的大致流程:首先将文本句子切成一个个子单元,然后将子单元数值化(映射为向量),接着将这些向量输入到模型进行编码,最后输出到下游的任务中,进一步得到最终的结果。
在这里插入图片描述

分词的目的是将复杂问题转化为数字问题,即将文本的非结构化数据转化为结构化数据,这样就可以将数据转化为数学问题。其中,分词就是整个转化过程中的第一步。这是因为机器学习中绝大多数模型是不支持字符串的,想要模型能够进行有效学习,必须对字符串数据进行数值化。另外,并不是直接对输入句子或者单词进行数值化,我们需要先将其切分成一个个有限的子单元,然后对这些子单元数值化。

简单来说,将原始文本切分成子单元的过程,称之为Tokenization

2. Tokenization的难点

分词的难点在于将原文本切分成子单元的过程中,如何获得一种理想的切分效果,使文本中所有的token都具有正确的语义,并且不会存在遗漏的问题。

从上述Tokenization(分词)的任务内容可知,其是为数值化作准备,数值化的过程必然需要映射,而映射又需要一个目标集合或映射表。如果切分的子单元种类非常多设置无限多,就需要一个非常庞大的映射表,这会导致巨大的内存消耗以及过多的计算量,这显然是不理想的。

3. 基于词表和规则的分词方法

在分词方法中,有一类是在一个词表中根据各种算法进行词表匹配来进行分词。基于词表和规则的分词方法可以分为三种,即:

  1. 前(后)向最大匹配法;
  2. 最短路径分词法;
  3. 基于N-Gram LM 的统计词频率分词法。

假设给定一个词典V,如何对一个句子S进行分词,基于这一假设,展开介绍三种不同的分词方法。
在这里插入图片描述

3.1 前(后)向最大匹配法

前(后)向最大匹配法很简单,只需要知道向前匹配,那么后向匹配自然也就理解了。举例描述一个前向最大匹配法的流程,预设条件:

  1. 设定最大匹配长度为2(当然可以是3,4,5或者更长);
  2. 从左往右扫描句子(也可以从右往左)。
    在这里插入图片描述

对应给定的假设词典V,可以看到最终的输出结果为:
在这里插入图片描述

这种规则虽然简单,但还是无法解决歧义的问题。

3.2 最短路径分词法

最短路径分词法是指,首先将句子中所有字都切分开来根据词表将组成词的字连接起来,构成“词图”,然后求解“词图”的最短路径就是分词结果。
在这里插入图片描述

本文中的例子构造出的“词图”,如上图所示。路径上的数字“1”代表权重,这里我们全部取为1,代表每种分词的重要性,然后利用N-最短路径或者Dijkstra算法便可以求解出最短路径,该最短路径上的词汇就是我们最终需要的结果。

上述结果中,最终的分词结果为:
在这里插入图片描述

3.3 基于N-Gram LM 的统计词频率分词法

实际上,最短路径分词法将简化边的权重都为1,但现实中并非如此,常见的词出现频率高,我们可以用求解“词图”最短路径的方法转为求解概率最大路径。

利用2-Gram语言模型,可以计算出词语的共现概率,结合词典V,可以得到下面的“词图”:
在这里插入图片描述

参数解释

  • **P(他|) **:表示“他”作为句子开头对于训练好的语言模型来说其概率是多少。
  • P(说|他) :表示“说”字在“他”字后面出现的概率是多少。

由于该方法考虑了不同词语之间先后出现的概率,所以这是一种更合理的方法。

4. Tokenization切分方法

按照切分的粒度,可以将Tokenization分为三类,一是按词粒度来分,二是按字符粒度来分,三是按子词粒度(subword)来分。

4.1 基于词粒度

词粒度是一种自然而然的方法,因为人类对自然语言文本的理解就是按照这种方式进行切分的。通常用一些工具来完成,例如英文的NLTK、SpaCy,中文的jieba、HanLP等。

举例描述词粒度进行Tokenization的过程:
在这里插入图片描述

明显可以看出,按词粒度切分方式是和人类阅读时自然划分一致的。这种方法的优点在于能够很好地保留词的语义和边界信息。

但需要注意的是,对于英文或拉丁语系的词粒度Tokenization很简单,可以直接按照英文中自然的空格作为分隔符进行切分,但中日韩类的文字没有自然空格,所以切分很容易导致出现歧义。针对这类语言的文字,可以使用一些分词方法

词粒度的优缺点

优点——

词粒度的切分非常切合人类的阅读习惯,一方面能够很好地保留词的边界信息,另一方面也能很好地保留词的语义信息。这对于后续的模型来讲十分有利,例如NER任务中,通常标签偏移是由于词边界没有约束好导致的,所以词语的边界信息对于某些下游任务来讲是很重要的。在MRC任务中,词语含义能否被模型捕获也显得很重要,一旦最初的输入模型丢失了某些关键的含义信息,最终结果可能会受到一定的影响。

缺点——

词粒度的方法,需要构造的词典太过庞大,严重影响计算效率和消耗内存;即使使用较大的词典不影响效率,也会造成OOV问题,因为人类语言是不断发展的,词汇会不断的增加,总会加大词典量;词表中的低频词/稀疏词在模型训练过程中无法得到充分训练,进而模型不能充分理解这些词的含义;一个单词因为不同的形态会产生不同的词,如由“look”衍生出的"looks",“looking”,但意义相近,对于它们都进行训练是不必要的。

4.2 基于字符粒度

字符粒度是按某一种语言最小符号来进行切分的。简单说就是英文(拉丁语系)以字母为单位,中文日文韩文等则是以字为单位进行切分
在这里插入图片描述

字符粒度是一种极简的方法,基本不需要什么技巧,但其存在较多的弊端。

字符粒度的优缺点

优点——

基于字符粒度的切分方法的优点在于词表会大大减小,26个字母基本就能够覆盖所有词,5000多个中文基本也能组合覆盖大部分的词汇。

缺点——

基于字符粒度的切分方法有严重的缺陷,主要在于会严重丢失词汇的语义信息边界信息,对NER等词汇边界的任务来说会有一定的影响。如果把单词切分的过细,会使得输入太长而增加输入计算的压力,减小词表的代价就是输入长度大大增加,从而输入计算变得更耗时,训练时更占内存空间,在现实应用中较少使用。

4.3 基于子词粒度(subword)

基于子词粒度切分是一种这种的方法,但只适用于英文等拉丁语系的语言,对于中文来讲,由于不能将某一个字拆分为偏旁部首和字根,没有意义。subwords的Tokenization切分过程具体如下图所示:
在这里插入图片描述

通常构造出subword词典主要有4种方法:

4.3.1 BPE

BPE全称 Byte Pair Encoding,字节对编码,是一种数据压缩方法,BPE 迭代地合并最频繁出现的字符或字符序列,具体步骤如下:
在这里插入图片描述
在这里插入图片描述

由此可以看到,每次尝试合并相邻的两个字符,如果合并后出现概率是目前最大的,则会将合并后的字符串加入到词汇表中。

4.3.2 WordPiece

**WordPiece主要应用于解决日语和韩语语音问题。**它与 BPE 相同点:每次从统计语料中选取出两个新的子词进行合并。它与 BPE 最大区别在于选择两个子词进行合并的原则:BPE 按频率,WordPiece 按能够使得 LM 概率最大的相邻子词加入词表。

WordPiece 的算法步骤如下:
在这里插入图片描述

4.3.3 UniLM

Unigram方法与 WordPiece 相同点是:同样使用语言模型来挑选子词

与 WordPiece 最大区别:WordPiece 算法的词表大小都是从小到大变化;UniLM 的词库则是从大到小变化,即先初始化一个大词表,根据评估准则不断丢弃词表,直到满足限定条件。ULM 算法考虑了句子的不同分词可能,因而能够输出带概率的多个子词分段。

UniLM 构造词典的算法步骤如下:
在这里插入图片描述

可以看出,UniLM会保留那些以较高频率出现在很多句子的分词结果中的子词,因为这些子词如果被丢弃,其损失会很大

4.3.4 SentencePiece

以上三种方法都存在着两个问题:

  1. 无法逆转
  2. 训练的时候需要提前切分

【无法逆转】是指对句子 s 进行切分后得到的结果无法准确复原回 s。更直白地说就是空格不能被保留,如下:
在这里插入图片描述

SentencePiece的解决方法是:

  1. 首先将所有输入转换为unicode字符,这意味着它不必担心不同的语言、字符或符号,可以以相同方式处理所有输入;
  2. 空白也被当做普通符号来处理,Sentencepiece显式地将空白作为基本标记来处理,用一个元符号 “▁”( U+2581 )转义空白,这样就可以实现简单的decoding;
  3. Sentencepiece 可以直接从 raw text 进行训练;
  4. 支持 BPE 和 UniLM 训练方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1014035.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何优化你的Vue.js应用以获得最佳性能

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

C++版本的OpenCV实现二维图像的卷积定理(通过傅里叶变换实现二维图像的卷积过程,附代码!!)

C版本的OpenCV库实现二维图像的卷积定理过程详解 前言一、卷积定理简单介绍二、不同卷积过程对应的傅里叶变换过程1、“Same”卷积2、“Full”卷积3、“Valid”卷积 三、基于OpenCV库实现的二维图像卷积定理四、基于FFTW库实现的二维图像卷积定理五、总结与讨论 前言 工作中用…

基于matlab实现的弹簧振动系统模型程序(动态模型)

完整代码: clear all; %System data m1.0; zeta0.01; omega01.0; Dt1.0; f01.0; x00.0; dotx00.0; xmaxsqrt(x0^2(dotx0/omega0)^2)min([0.5*abs(f0)*Dt/(m*omega0) f0/omega0^2]); omegadomega0*sqrt(1-zeta^2); dt00.1*pi/omega0; nstep500; a0.70; b0.…

Python爬虫(二十)_动态爬取影评信息

本案例介绍从JavaScript中采集加载的数据。更多内容请参考:Python学习指南 #-*- coding:utf-8 -*- import requests import re import time import json#数据下载器 class HtmlDownloader(object):def download(self, url, paramsNone):if url is None:return Noneuser_agent …

Echarts 雷达图的详细配置过程

文章目录 雷达图 简介配置步骤简易示例 雷达图 简介 Echarts雷达图是一种常用的数据可视化图表类型,用于展示多个维度的数据在同一坐标系下的分布情况。雷达图通过不同的坐标轴表示不同的维度,数据点的位置表示了各个维度的数值大小。 Echarts雷达图的…

035:vue项目中 radio和checkbox美化方法

第035个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下,本专栏提供行之有效的源代码示例和信息点介绍,做到灵活运用。 (1)提供vue2的一些基本操作:安装、引用,模板使…

基于matlab实现的中点放炮各类地震波时距曲线程序

完整程序&#xff1a; clear all dx50;x-500:dx:500;%炮检距 h100;V11500; theta25*pi/180; V2V1/sin(theta); t1sqrt(x.*x4*h*h)/V1;%反射波时距曲线 t2abs(x)./V1;%直达波时距曲线 %折射波时距曲线 xm2*h*tan(theta);%求盲区 k1; for i1:length(x) if x(i)<-xm …

JVM 篇

一、知识点汇总 其中内存模型&#xff0c;类加载机制&#xff0c;GC是重点方面。性能调优部分更偏向应用&#xff0c;重点突出实践能力。编译器优化和执行模式部分偏向于理论基础&#xff0c;重点掌握知识点。 内存模型&#xff1a;各部分作用&#xff0c;保存哪些数据。类加载…

Python if条件分支结构

视频版教程 Python3零基础7天入门实战视频教程 如果 Python程序的多行代码之间没有任何流程控制&#xff0c;则程序总是从上向下依次执行。 但是现实生活中&#xff0c;我经常遇到一些需要做判断的业务流程。比如去银行ATM取款&#xff0c;如果密码输入正确&#xff0c;则可以…

基于matlab实现的额特征线法管道瞬变流计算程序

完整曲线&#xff1a; % 假设阀门瞬间关闭 % 初始数据: clear tic L3000; % 管线长度 Hr70; % 泵压力 N10; % 分段数 NSN1; % 节点数 e0.001651; % 壁厚m,0.065 D0.00635-2*e; % 管道内径 K2.1e9; % 流体体积弹性系数 Rho…

软考高级架构师下篇-15嵌入式系统架构设计的理论

目录 1. 引言2. 嵌入式系统发展历程3. 嵌入式系统硬件4.嵌人式系统软件5.嵌入式系统软件架构设计方法6.嵌入式系统软件架构实践7. 前文回顾1. 引言 此章节主要学习嵌入式系统架构设计的理论和工作中的实践。根据新版考试大纲,本小时知识点会涉及案例分析题(25分)。在历年考…

Redis 配置文件详解 - 持久化(RDB、AOF)

目录 Redis 配置文件详解 单位 包含 INCLUDES 网络 NETWORK 通用 GENERAL 快照 SNAPSHOTTING &#xff08;持久化&#xff09; 复制 REPLICATION&#xff08;主从复制&#xff09; 安全 SECURITY&#xff08;账号密码设置&#xff09; ​编辑 限制 CLIENTS 追加模…

Redis - 超越缓存的多面手

文章目录 Redis 使用场景图解 Redis 使用场景 Redis可以在各种场景中使用 &#x1f539;会话 我们可以使用Redis在不同服务之间共享用户会话数据。 &#x1f539;缓存 我们可以使用Redis缓存对象或页面&#xff0c;特别是对于热点数据。 &#x1f539;分布式锁 我们可以使用…

gin框架再探

Gin框架介绍及使用 | 李文周的博客 (liwenzhou.com) lesson03_gin框架初识_哔哩哔哩_bilibili 1.路由引擎 //路由引擎 rgin.Default() 2.一些http请求方法 get post put delete等等 遇到什么路径&#xff0c;执行什么函数 r.GET("/hello",func{做你想做的事返回…

【Linux】缓冲区/回车换行

1、缓冲区 C程序默认有输出缓冲区。数据输出时&#xff0c;被及时看到&#xff0c;是立马刷新了&#xff1b;如果没被看到&#xff0c;是被暂存在数据缓冲区中。fflush(stdout); 【强制刷新】\n【行刷新&#xff0c;也是一种刷新方式】 2、回车换行 \n【回车换行】输入完一行内…

如何根据性能需求进行场景设计?

场景设计一 探索 测试环境 客户端: win10 这里可以用linux,但没用,因为想直观查看结果。 被测环境:linux X86 4核CPU16G内存 被测接口:登录接口,没有做数据驱动。 在测试执行前,先使用influxSQL把influxdb的数据清理一下,以防影响结果查看。 有这么一个需求,要求系…

docker中安装Ubuntu20,浏览器访问其图形界面

介绍 Kasm&#xff08;https://kasmweb.com/&#xff09;是一家提供虚拟化和远程访问解决方案的公司。他们的主要产品是 Kasm Workspaces&#xff0c;它是一个基于浏览器的虚拟桌面和应用程序交付平台。 Kasm Workspaces 基于开源项目 Apache Guacamole 和 Chromium 浏览器引…

python连接mysql数据库的练习

一、导入pandas内置的sqlite3模块&#xff0c;连接的信息&#xff1a;ip地址是本机, 端口号port 是3306, 用户user是root, 密码password是123456, 数据库database是lambda-xiaozhang import pymysql# 打开数据库连接&#xff0c;参数1&#xff1a;主机名或IP&#xff1b;参数…

安装Anaconda与pytorch,在IDEA中配置环境进行编程

1.官网下载与自己python版本匹配的Anaconda(注意&#xff0c;要想成功安装pytorch&#xff0c;python版本也要对应pytorch的相关版本) Anaconda官网最新版本 与自己python版本不否请查找自己版本anaconda版本对应 清华大学镜像下载 2.安装时勾选添加环境变量或者手动添加&am…

Vue.js vs React:哪一个更适合你的项目?

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…