关于LLaMA Tokenizer的一些坑...

使用LLaMA Tokenizer对 jsonl 文件进行分词,并将分词结果保存到 txt 文件中,分词代码如下:

import jsonlines
import sentencepiece as spm
from tqdm import tqdmjsonl_file = '/path/to/jsonl_file'
txt_file = '/path/to/txt_file'tokenizer = spm.SentencePieceProcessor('./tokenizer.model')
w = open(txt_file, mode='w', encoding='utf-8')with jsonlines.open(jsonl_file, mode='r') as r:for line in tqdm(r):ids = tokenizer.Encode(line['text'])tokenized_text = ' '.join(tokenizer.IdToPiece(i) for i in ids)w.write(f"{tokenized_text}\n")w.close()

从以上代码可以看出,txt 文件中的每行内容实际上是 jsonl 文件对应行的文档的分词结果,分词之间以空格分隔。理论上,这意味着 txt 文件的行数应与 jsonl 文件的行数相匹配均等同于文档数量。然而,实际情况可能出现 txt 文件的行数显著超过 jsonl 文件的行数。

既然行数对不上,那自然就需要找到第一个出现问题的行。为此,我们重新执行分词过程,并在每行的开头添加该行的索引(从 1 1 1 开始)以便追踪。

with jsonlines.open(jsonl_file, mode='r') as r:for idx, line in tqdm(enumerate(r, start=1)):ids = tokenizer.Encode(line['text'])tokenized_text = ' '.join(tokenizer.IdToPiece(i) for i in ids)w.write(f"{idx} {tokenized_text}\n")

然后遍历 txt 文件,找到第一个出现问题的行:

with open(txt_file, mode='r') as r:for cnt, line in tqdm(enumerate(r, start=1)):idx = line[:line.index(' ')]if str(cnt) != idx:print(cnt)break

打开 txt 文件,发现出现问题的行的开头压根没有数字,这说明分词结果被某种特殊字符换行了。要注意LLaMA词表是没有换行符 \n 的(被映射到 <unk> 了),那还能是什么字符导致换行的呢?

jsonl 文件中对应的行抽取出来,单独对它进行分词,然后将分词结果打印到终端上,发现并没有换行,然而将这个分词结果单独写入到一个新的文件中时,换行出现了。通过对每一个token单独进行分析,发现其中有一个token含有 \r,而这个字符正是导致换行的罪魁祸首!

📝 \r 字符是回车符(Carriage Return, CR),在ASCII表中的位置是十进制的13或者十六进制的0x0D。这个字符最初设计用于打字机和早期计算机,指的是将打印头移动到一行的开始位置而不换到下一行,这样新的文本就会覆盖掉同一行上旧的文本。

  • 在Python中使用 print('\r') 时,并不会导致在控制台上换行,因为 \r 只是将光标移回行首,而没有执行换到新行的操作。例如 print('aaa\rbb') 会输出 bba
  • 而在文本文件中写入 \r 字符时,文本编辑器可能会将其解释为换行符,因此会触发换行效果。

接下来,我们就可以找出LLaMA词表中所有可能会导致换行的token了:

tokenizer = spm.SentencePieceProcessor('./tokenizer.model')
vocab_size = tokenizer.GetPieceSize()
for i in range(vocab_size):piece = tokenizer.IdToPiece(i)if '\r' in piece:print(f"{i}: {list(piece)}")

一共有 24 24 24 个:

2104: [';', '\r']
3238: ['>', '\r']
3336: ['▁', '{', '\r']
4970: ['▁', '}', '\r']
6075: [')', ';', '\r']
6756: ['▁', '\r']
8117: ['}', '\r']
8443: [')', '\r']
10175: ['"', '>', '\r']
11167: [',', '\r']
14078: ['(', ')', ';', '\r']
14626: ['{', '\r']
15231: ['"', ',', '\r']
16737: ['%', ';', '\r']
17822: ["'", ')', ';', '\r']
18584: ['"', ')', ';', '\r']
19451: ['"', '\r']
22993: ['.', '\r']
23592: ["'", ',', '\r']
24426: ['▁', '}', ')', ';', '\r']
25982: ['"', ';', '\r']
26471: ['(', ')', '\r']
29722: ['▁', '*', '/', '\r']
30004: ['\r']

可以看出,位于索引 30004 处的token刚好就是 \r,而其他token则均是以 \r 结尾。


很多场景下,我们可能需要保证 jsonltxt 的行数一致才能进行下一步,为此有两种选择方案:

  • 在生成 jsonl 文件的时候做一个预处理,判断其中是否有token包含在上述24个token之一(该方案可保持 jsonl 行数不变)。
  • 对生成的 jsonl 文件按照上述的24个token进行过滤(该方案会导致 jsonl 行数减少)。

无论是哪种方案,都涉及到对是否包含的判断。设24个token构成的列表为 a,某个文档的分词结果为 b,于是问题便归结为判断 a 中是否有元素出现在了 b 中(反之亦然)。根据这篇博客的结论,我们可以用集合法来快速判断。

tokenizer = spm.SentencePieceProcessor('./tokenizer.model')
stop = {2104, 3238, 3336, 4970, 6075, 6756, 8117, 8443, 10175, 11167, 14078, 14626, 15231, 16737, 17822, 18584, 19451, 22993, 23592, 24426, 25982, 26471, 29722, 30004}def valid(ids):return not bool(set(ids).intersection(stop))with jsonlines.open(jsonl_file, mode='r') as r:for idx, line in tqdm(enumerate(r, start=1)):ids = tokenizer.Encode(line['text'])if not valid(ids):print(f"Line {idx} is invalid data!")

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

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

相关文章

腾讯云游戏服务器购买入口,详细配置精准报价

2024年更新腾讯云游戏联机服务器配置价格表&#xff0c;可用于搭建幻兽帕鲁、雾锁王国等游戏服务器&#xff0c;游戏服务器配置可选4核16G12M、8核32G22M、4核32G10M、16核64G35M、4核16G14M等配置&#xff0c;可以选择轻量应用服务器和云服务器CVM内存型MA3或标准型SA2实例&am…

BUUCTF-Real-[Tomcat]CVE-2017-12615

目录 漏洞描述 一、漏洞编号&#xff1a;CVE-2017-12615 二、漏洞复现 get flag 漏洞描述 CVE-2017-12615&#xff1a;远程代码执行漏洞 影响范围&#xff1a;Apache Tomcat 7.0.0 - 7.0.79 (windows环境) 当 Tomcat 运行在 Windows 操作系统时&#xff0c;且启用了 HTTP P…

MVC模式Nodejs+express+Mysql开发后台

想给自己的博客做个后台&#xff0c;一开始考虑的是java开发&#xff0c;然后把idea和一堆东西勤勤恳恳安装完了之后&#xff0c;心里一想&#xff0c;算了&#xff0c;咱就nodejs不方便多了&#xff0c;于是开始Nodejs开发后台。 Java和idea环境安装 安装jdk(1.8)安装idea&…

Qlik Sense : where exists

什么是Exists函数 Exists() 用于确定是否已经将特定字段值加载到数据加载脚本中的字段。此函数用于返回 TRUE 或 FALSE&#xff0c;这样它可以用于 LOAD 语句或 IF 语句中的 where 子句。 信息注释您也可使用 Not Exists() 来确定是否尚未加载字段值&#xff0c;但是如果要在…

Excel+VBA处理高斯光束

文章目录 1 图片导入与裁剪2 获取图片数据3 数据拟合 1 图片导入与裁剪 插入图片没什么好说的&#xff0c;新建Excel&#xff0c;【插入】->【图片】。 由于图像比较大&#xff0c;所以要对数据进行截取&#xff0c;选中图片之后&#xff0c;点击选项卡右端的【图片格式】…

【JavaWeb】头条新闻项目实现 基本增删改查 分页查询 登录注册校验 业务功能实现 第二期

文章目录 一、为什么使用token口令二、登录注册功能2.1 登录表单提交后端代码&#xff1a; 2.2 根据token获取完整用户信息代码实现&#xff1a; 2.3 注册时用户名占用校验代码实现&#xff1a; 2.4 注册表单提交代码实现&#xff1a; 三、头条首页功能3.1 查询所有头条分类3.2…

打卡今天学习 Linux

过年了&#xff0c;祝大家过年快乐 在今天的学习中&#xff0c;我们涉及了一些关键的 Linux 系统管理知识点&#xff0c;包括 systemctl、IP 地址配置、域名解析、映射的创建、软链接等。让我们简要回顾一下这些主题。 1. systemctl systemctl 是一个强大的 Linux 系统管理工…

docker自定义镜像并使用

写在前面 本文看下如何自定义镜像。 ik包从这里 下载。 1&#xff1a;自定义带有ik的es镜像 先看下目录结构&#xff1a; /opt/program/mychinese [rootlocalhost mychinese]# ll total 16 -rw-r--r-- 1 root root 1153 Feb 5 04:18 docker-compose.yaml -rw-rw-r-- 1 el…

利巴韦林市场规模及厂商格局分析

利巴韦林又名病毒唑&#xff0c;是一种合成鸟苷类似物&#xff0c;对多种DNA和RNA病毒具有广谱活性&#xff0c;可干扰病毒mRNA的合成。利巴韦林1970年由ICN制药公司发现&#xff0c;1986年被批准临床应用&#xff0c;通常与干扰素药物&#xff08;如聚乙二醇干扰素α-2a或聚乙…

开源大型语言模型概览:多语种支持与中文专注

开源大型语言模型概览&#xff1a;多语种支持与中文专注 开源大型语言模型概览&#xff1a;多语种支持与中文专注什么是大型语言模型如何工作大型语言模型的发展应用领域 开源大语言模型概览支持多种语言的开源LLMsLLaMA&#xff08;由Meta开发&#xff09;BERT&#xff08;由G…

什么是Java中的类加载器(ClassLoader),并举例说明不同类型的类加载器?

什么是Java中的类加载器&#xff08;ClassLoader&#xff09;&#xff0c;并举例说明不同类型的类加载器&#xff1f; 在Java中&#xff0c;类加载器&#xff08;ClassLoader&#xff09;是负责加载 Java 类文件的重要组件之一。ClassLoader 将字节码数据加载到 JVM 中&#x…

vue-cil的watch函数详解

在Vue中&#xff0c;watch是一个非常有用的API&#xff0c;用于侦听一个响应式引用&#xff08;例如由ref创建&#xff09;或响应式对象&#xff08;由reactive创建&#xff09;的属性&#xff0c;并在值变化时执行回调函数。Vue 3的Composition API引入了这种侦听方式&#xf…

Vue 3 + Koa2 + MySQL 开发和上线部署个人网站

Vue 3 Koa2 MySQL 开发和上线部署个人网站 记录个人的一个操作步骤, 顺序不分先后, 嫌啰嗦请出门右转! 环境说明: 服务器: 阿里云轻量应用服务器 服务器系统: CentOS8.2 本地环境: macOS 12.7.2 Node: 20.10.0 MySQL: 8.0.26 Vue: 3.3.11 Koa: 2.7.0 pm2: 5.3.1 Nginx: 1.1…

CTFshow web(php命令执行 45-49)

基础知识&#xff1a; 1.绕过cat使用&#xff1a; tac more less head tac tail nl od(二进制查看) vi vim sort uniq rev 2.绕过空格用&#xff1a; %09 <> ${IFS} $IFS$ {cat,fl*} %20 注&#xff1a; %09 ##&#xff08;Tab&#xff09; %20 ##&#xff08;spa…

请手写几种js排序算法

什么是排序算法 冒泡排序选择排序插入排序快速排序归并排序&#xff08;Merge Sort&#xff09; 思想实现测试分析动画 快速排序 &#xff08;Quick Sort&#xff09; 思想实现测试分析动画 思考&#xff1a;快排和归并用的都是分治思想&#xff0c;递推公式和递归代码也非常相…

Linux下的socket操作

一、TCP服务端 创建一个TCP服务器的基本操作&#xff1a; 创建一个套接字&#xff08;socket&#xff09;&#xff1a;使用socket函数绑定套接字&#xff08;socket&#xff09;:将套接字绑定到一个特定的IP地址和端口号上&#xff0c;这些信息要用结构体sockaddr_in来保存监…

vue3 之 商城项目—一级分类

整体认识和路由配置 场景&#xff1a;点击哪个分类跳转到对应的路由页面&#xff0c;路由传对应的参数 router/index.js import { createRouter, createWebHashHistory } from vue-router import Layout from /views/Layout/index.vue import Home from /views/Home/index.vu…

Spring Boot + 七牛OSS: 简化云存储集成

引言 Spring Boot 是一个非常流行的、快速搭建应用的框架&#xff0c;它无需大量的配置即可运行起来&#xff0c;而七牛云OSS提供了稳定高效的云端对象存储服务。利用两者的优势&#xff0c;可以为应用提供强大的文件存储功能。 为什么选择七牛云OSS? 七牛云OSS提供了高速的…

Akamai 如何揪出微软 RPC 服务中的漏洞

近日&#xff0c;Akamai研究人员在微软Windows RPC服务中发现了两个重要漏洞&#xff1a;严重程度分值为4.3的CVE-2022-38034&#xff0c;以及分值为8.8的CVE-2022-38045。这些漏洞可以利用设计上的瑕疵&#xff0c;通过缓存机制绕过MS-RPC安全回调。我们已经确认&#xff0c;所…

nodejs+vue高校实验室耗材管理系统_m20vy

用户功能&#xff1a; 登录后要有一个首页 比如:可以看见目前的耗材消耗记录&#xff0c;可做成图表菜单栏在左侧显示 1.个人信息管理 可以对基本信息进行修改&#xff0c;(修改密码时需要验证) 2.耗材管理&#xff08;耗材信息&#xff09; 普通用户可以查询当前相关耗材信息[…