NLP分词notes

BPE

贪心提取所有出现频率高的成为词。

BPE的训练流程

1.初始化:将所有单个字符作为初始词汇表的元素。
2.迭代合并:

  • 统计语料中所有相邻符号对(包括字符和合并后的符号)的出现频率。
  • 找到出现频率最高的符号对,将其合并为新的符号,并添加到词汇表中。
  • 在语料中用新符号替换所有该符号对的出现。

3.重复迭代,直到达到预设的词汇表大小或到达合并次数。

输入:语料D,预设的合并次数N
初始化:词汇表V为语料中的所有字符
for i from 1 to N do:统计语料中所有相邻符号对的频率,得到列表P选择频率最高的符号对(s1, s2) ∈ P合并符号对s1、s2为新符号s_new将s_new添加到词汇表V用s_new替换语料D中所有的s1 s2
end for
输出:词汇表V

WordPiece

WordPiece目标是在固定大小的词表预算下,选择一组子词单元,使整个训练语料在当前词表下的分词似然最大化。它的核心思想是:初始词汇表包含所有单个字符,通过迭代合并带来最大似然增益的高频字符对,逐步扩展为更长的子词单元。

在 WordPiece 的建模假设中,一个单词的概率是其分解后子词序列概率的乘积:
P(word)=∏i=1nP(tokeni)P(\text{word}) = \prod_{i=1}^{n} P(\text{token}_i)P(word)=i=1nP(tokeni)

因此,WordPiece 的训练目标是最大化整个训练语料的对数似然:
max⁡∑wordslog⁡P(word)\max \sum_{\text{words}} \log P(\text{word})maxwordslogP(word)

WordPiece 的训练流程

1.初始化词汇表:从所有单个字符开始,非开头的token会加上前缀/后缀(例如 ##ing##ed)。
2.计算相邻字符对频率:统计整个训练语料中所有相邻字符对的出现频率。
3. 迭代合并:在每次迭代中,计算增益Gain=loglikelihood(new)−loglikelihood(old)Gain=loglikelihood(new)-loglikelihood(old)Gain=loglikelihood(new)loglikelihood(old),选择能够使语言模型对数似然增益最大的字符对进行合并,并更新词表。重复此过程直到词汇表达到预设大小。
4. 得到最终词汇表

输入:语料D,预设的词汇表大小N
初始化:词汇表V为所有字符
while |V| < N do:初始化增益字典G = {}for 语料D中的每个可能的子词s(由现有词汇表中的符号组合而成):计算将s添加到词汇表V后,语料D的似然增益ΔL将(s, ΔL)加入G从G中选择ΔL最大的子词s_max将s_max添加到词汇表V更新模型参数(如概率)
end while
输出:词汇表V

eg.给定初始词表 ["a", "b", "c", "w"] 和词汇 v = ["abc", "abw"],各字符的概率分布如下:

字符概率分布:p(a)=p(b)=13p(a) = p(b) = \frac{1}{3}p(a)=p(b)=31,p(c)=p(w)=16p(c) = p(w) = \frac{1}{6}p(c)=p(w)=61

假如合并ab,合并后词表更新为 ["ab", "c", "w"],重新归一化概率 p(ab)=12,p(c)=p(w)=14p(ab) = \frac{1}{2},p(c) = p(w) = \frac{1}{4}p(ab)=21,p(c)=p(w)=41

词汇序列概率计算:p(v)=p(ab)×p(c)+p(ab)×p(w)=14p(v) =p(ab) \times p(c) + p(ab) \times p(w) = \frac{1}{4}p(v)=p(ab)×p(c)+p(ab)×p(w)=41

原始未合并概率p(old v)=p(a)×p(b)×p(c)+p(a)×p(b)×p(w)=127p(old\ v) =p(a) \times p(b) \times p(c) + p(a) \times p(b) \times p(w) = \frac{1}{27}p(old v)=p(a)×p(b)×p(c)+p(a)×p(b)×p(w)=271
Gain=p(v)−p(old v)=14−127=23108 Gain = p(v) - p(old\ v) = \frac{1}{4} - \frac{1}{27} = \frac{23}{108}Gain=p(v)p(old v)=41271=10823

GPT写的一个demo

from tokenizers import Tokenizer, models, trainers, pre_tokenizers
# #BPE
# from tokenizers import models, trainers
# tokenizer = Tokenizer(models.BPE())
# trainer = trainers.BpeTrainer(vocab_size=30, special_tokens=["[UNK]"])# 1️⃣ 定义模型类型:WordPiece
tokenizer = Tokenizer(models.WordPiece(unk_token="[UNK]"))# 2️⃣ 定义预分词规则
tokenizer.pre_tokenizer = pre_tokenizers.Whitespace()# 3️⃣ 定义训练器
trainer = trainers.WordPieceTrainer(vocab_size=100,special_tokens=["[PAD]", "[UNK]", "[CLS]", "[SEP]", "[MASK]"]
)# 4️⃣ 训练文本
corpus = ["the quick brown fox jumps over the lazy dog","the quick brown dog jumps over the lazy fox","i love natural language processing","wordpiece helps with unknown words"
]# 5️⃣ 训练
tokenizer.train_from_iterator(corpus, trainer)# 6️⃣ 测试编码
output = tokenizer.encode("the quick brown fox")
print("Tokens:", output.tokens)
print("IDs:", output.ids)# 7️⃣ 保存分词器
tokenizer.save("wordpiece-tokenizer.json")

Q:为什么 vocab_size 越大,分词后句子里的 token 数会更少?
A:因为 vocab_size 越大,分词器词表能收录更多子词单元,包括更长的子词或整个单词。这让分词器在处理文本时可以用更大的块来覆盖文本,减少切分次数,所以最后得到的 token 数会更少。

Q:vocab_size 和合并次数是一个概念吗?
A:不是。vocab_size 是词表大小的上限,但并不保证最后一定会有 vocab_size 那么多的子词单元。分词器会尽量把词表填满到这个上限,但如果语料规模很小、可合并的模式有限,最终学到的词表可能会小于设定的 vocab_size。

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

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

相关文章

【数据结构】栈和队列-----数据结构中的双生花

文章目录[toc]栈与队列&#xff1a;数据结构中的双生花1. 栈&#xff1a;后进先出的有序世界1.1 概念及结构剖析1.2 实现方式深度解析数组 vs 链表实现1.3 动态栈实现详解&#xff08;附程序源码&#xff09;1.定义一个动态栈2.初始化3.销毁4.入栈5.出栈6.取栈顶数据7.判空8.获…

Mybatis-2快速入门

学习主线 必学必会属于优化的东西。 快速入门需求说明 要求&#xff1a;开发一个MyBatis项目&#xff0c;通过MyBatis的方式可以完成对monster表的crud操作 1.创建mybatis数据库-monster表 主键Primary Key默认非空Not null&#xff0c;就省略了 create database mybatis us…

Web基础 -java操作数据库

一、JDBCJDBC&#xff1a;&#xff08;Java DataBase Connectivity&#xff09;&#xff0c;就是使用Java语言操作关系型数据库的一套API。为了使用JDBC操作数据库&#xff0c;首先&#xff0c;我们需要在pom.xml文件中引入依赖<dependencies><!-- MySQL JDBC driver …

cell2location复现

https://github.com/BayraktarLab/cell2location/issues/348 根据你已下载的本地 wheel 文件&#xff0c;可以通过以下方式修改安装命令&#xff0c;优先从本地路径安装 jaxlib&#xff0c;同时保持其他依赖的安装方式不变&#xff1a; 解决方案 # 安装 jax (从远程 PyPI 源) p…

什么是 npm、Yarn、pnpm? 有什么区别? 分别适应什么场景?

什么是 npm、Yarn、pnpm? 有什么区别? 分别适应什么场景? 在前端开发中&#xff0c;包管理工具扮演着非常重要的角色。它们帮助开发者高效地管理项目的依赖&#xff0c;确保项目中所需的所有第三方库和工具都能按时安装&#xff0c;并且兼容版本。npm、Yarn 和 pnpm 是三款…

深度隐匿源IP:高防+群联AI云防护防绕过实战

隐蔽性挑战 黑客常通过以下手段绕过基础防护&#xff1a; HTTPS证书嗅探&#xff1a;访问 https://源站IP&#xff0c;通过证书域名匹配暴露真实IP历史解析记录追踪&#xff1a;从DNS数据库获取旧A记录CDN缓存渗透&#xff1a;利用边缘节点回源漏洞定位源站 三重防护方案 高防I…

如何加快golang编译速度

跟着我的步骤来&#xff1a;第一步&#xff1a;(点击edit)第二步&#xff1a;将go tool arguments设置为-p4&#xff0c;初始值设为4&#xff0c; 代表最多同时编译4个包&#xff08;非文件&#xff09;。电脑性能好时&#xff0c;可设为CPU最大核心数&#xff08;充分利用多核…

浏览器自动化方案

B端后台列表页自动新增素材方案 我设计了一套完整的浏览器自动化方案&#xff0c;使用 Puppeteer 实现B端后台列表页的自动新增素材功能。该方案包含数据组织、浏览器操作、错误处理等完整流程。 一、技术选型 浏览器自动化工具&#xff1a;Puppeteer (https://pptr.dev)任务调…

MPPT电路设计

反激的具体计算过程要写好起码要一天&#xff0c;所以本次先更MPPT。这章不计算具体参数&#xff0c;只做分析。 目录 一、电路作用 二、电路设计 采样电路和输入电路 主体电路 驱动电路 一、电路作用 MPPT电路是一种广泛应用于光伏发电、风力发电等新能源系统中的关键电…

【基于飞浆训练车牌识别模型】

基于飞浆训练车牌识别模型 基于飞浆训练车牌识别模型 LPRNet&#xff08;License Plate Recognition via Deep Neural Networks&#xff09;是一种轻量级卷积神经网络&#xff0c;专为端到端车牌识别设计&#xff0c;由Intel IOTG Computer Vision Group的Sergey Zherzdev于201…

No module named ‘sklearn‘

1、运行python数据分析库时报错 No module named sklearn2、原因 虚拟环境未安装 sklearn 库&#xff08;即 scikit-learn&#xff09;。 3、解决方案 pip install scikit-learn使用国内镜像源&#xff1a; pip install scikit-learn -i https://mirrors.aliyun.com/pypi/simpl…

XPath注入攻击详解:原理、危害与防御

什么是XPath注入&#xff1f; XPath注入&#xff08;XPath Injection&#xff09;是一种针对使用XPath查询语言的应用程序的安全攻击技术&#xff0c;类似于SQL注入。当应用程序使用用户提供的输入来构造XPath查询而没有进行适当的过滤或转义时&#xff0c;攻击者可以通过构造恶…

网络编程(套接字)

目录 一、套接字 1、套接字的作用 2、关于TCP和UDP协议 1. TCP协议 2. UDP协议 3. 两者的区别 2、套接字函数 1&#xff09;函数 socket&#xff08;创建套接字同文件描述符&#xff09; 2&#xff09;准备套接字用结构体 1. 套接字的结构体 2. 客户端的套接字&…

R语言安装包

# 在安装过程中指定源地址 install.packages("RCurl", repos "https://mirrors.tuna.tsinghua.edu.cn/CRAN/") # 查看当前镜像 options()$repos # 设置为中科大镜像 options("repos" c(CRAN"https://mirrors.ustc.edu.cn/CRAN/")…

微服务引擎 MSE 及云原生 API 网关 2025 年 5 月产品动态

点击此处&#xff0c;了解微服务引擎 MSE 产品详情。

性能测试过程中监控linux服务器资源情况

文章目录1. cpu使用情况&#xff08;1&#xff09;性能瓶颈类型CPU密集型瓶颈​​I/O或等待瓶颈​&#xff08;2&#xff09;资源分配与竞争​资源争用分析​虚拟化环境资源分配​&#xff08;3&#xff09;系统稳定性与异常​​异常波动与毛刺​​过热降频影响​&#xff08;4…

使用defineExpose暴露子组件的属性和方法、页面生命周期onLoad和onReady的使用

欢迎来到我的UniApp技术专栏&#xff01;&#x1f389; 在这里&#xff0c;我将与大家分享关于UniApp开发的实用技巧、最佳实践和项目经验。 专栏特色&#xff1a; &#x1f4f1; 跨平台开发一站式解决方案 &#x1f680; 从入门到精通的完整学习路径 &#x1f4a1; 实战项目经…

新手必看!VSCodePyCharm 配置 OpenCV 超详细教程(支持 Python 和 C++ 双语言)

新手必看&#xff01;VSCode&PyCharm 配置 OpenCV 超详细教程&#xff08;支持 Python 和 C 双语言&#xff09; 适用对象&#xff1a;初学者&#xff0c;希望在 VSCode 与 PyCharm 两款常用 IDE 中&#xff0c;学会配置并使用 OpenCV&#xff0c;分别实现 Python 与 C 环境…

PyTorch深度学习框架入门案例实战

PyTorch深度学习框架详解与实战 1. PyTorch简介与环境配置 1.1 安装与导入 # 基础导入 import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optim from torch.utils.data import DataLoader, TensorDataset import numpy as np import…

Spring Boot - Spring Boot 集成 MyBatis 分页实现 手写 SQL 分页

一、准备阶段 1、依赖引入 pom.xml <properties>...<postgresql.verison>42.5.6</postgresql.verison><mybatis.version>3.0.1</mybatis.version> </properties><dependencies>...<!-- postgresql 驱动 --><dependency>…