CLIP的tokenizer详解

一、bytes_to_unicode

def bytes_to_unicode():"""Returns list of utf-8 byte and a corresponding list of unicode strings.The reversible bpe codes work on unicode strings.This means you need a large # of unicode characters in your vocab if you want to avoid UNKs.When you're at something like a 10B token dataset you end up needing around 5K for decent coverage.This is a signficant percentage of your normal, say, 32K bpe vocab.To avoid that, we want lookup tables between utf-8 bytes and unicode strings.And avoids mapping to whitespace/control characters the bpe code barfs on."""bs = list(range(ord("!"), ord("~")+1))+list(range(ord("¡"), ord("¬")+1))+list(range(ord("®"), ord("ÿ")+1))cs = bs[:]n = 0for b in range(2**8):if b not in bs:bs.append(b)cs.append(2**8+n)n += 1cs = [chr(n) for n in cs]return dict(zip(bs, cs))

可能的问题:

 1.Unicod != ACSII,ASCII是Unicode的子集

编码范围说明
ASCII0 ~ 127最早的字符编码,只支持英语字母、数字、标点、控制字符
Unicode0 ~ 1,114,111(约百万个码位)全球通用字符编码,包含了 ASCII 全部内容,还支持中文、日文、表情符号等

2.bs是idx,cs是对应的字符

3.为什么bs里append的是b而cs是2**8+n?

因为bs定义时会跳过一些不安全的控制字符,但是又希望bs是从0到255没有空缺,所以在cs中就会用安全的ASCII码之外的字符代替

4.cs = bs[:]

语法解释
cs = bs两个变量指向 同一个列表,修改一个会影响另一个(引用赋值)
cs = bs[:]

复制了一个 新的列表,内容一样,但两个变量互不影响(浅拷贝)

5.一些函数

问题解答
ord()字符 → Unicode 整数,比如 ord('A') = 65
chr()Unicode 整数 → 字符,比如 chr(65) = 'A'
dict(zip(bs, cs))把两个列表配对,创建 字节 → 字符 的映射字典

 二、get_pairs

def get_pairs(word):"""Return set of symbol pairs in a word.Word is represented as tuple of symbols (symbols being variable-length strings)."""pairs = set()prev_char = word[0]for char in word[1:]:pairs.add((prev_char, char))prev_char = charreturn pairs

这里应该好理解,就是给定一个由多个符号(symbol)组成的单词(word),返回它所有相邻符号对的集合。下面是举例:

word = ('ab', 'cd', 'e')
get_pairs(word)
→ {('ab', 'cd'), ('cd', 'e')}

三、basic_clean + whitespace_clean

函数或方法作用示例输入示例输出备注
ftfy.fix_text(text)修复 Unicode 编码错误、替换乱码字符"“hello”""“hello”"修复网页/数据库导出乱码最常用
html.unescape(text)将 HTML 实体编码还原为正常字符"&lt;div&gt;""<div>"常用于网页文本解析
text.strip()去除字符串前后的空白字符(包括 \n, \t, 空格)" hello world \n""hello world"不影响中间空格
re.sub(r'\s+', ' ', text)将所有连续的空白字符替换为一个空格"This\nis\t\ta test""This is a test"中间所有空白都变成一个普通空格

 四、bpe

word = tuple(token[:-1]) + (token[-1] + '</w>',)

举例:token = 'low'('l', 'o', 'w</w>')

为什么不是word = tuple(token) + ( '</w>',),这样的话就会把最后一个字符和'</w>'分开,导致无法标志单词结束的位置

pairs = get_pairs(word)

举例:('l', 'o', 'w</w>'){('l','o'), ('o','w</w>')}

if not pairs:return token+'</w>'

举例: 

输入 token处理后 wordpairs输出
"a"('a</w>',)set()(空集)"a</w>"

 下面用“lowered”来举例bpe的完整过程:

轮次当前 word合并的 bigram合并后结果
1('l','o','w','e','r','e','d</w>')('l','o')('lo','w','e','r','e','d</w>')
2('lo','w','e','r','e','d</w>')('lo','w')('low','e','r','e','d</w>')
3('low','e','r','e','d</w>')('e','r')('low','er','e','d</w>')
4('low','er','e','d</w>')⛔无匹配循环结束

 

    def bpe(self, token):if token in self.cache:return self.cache[token]word = tuple(token[:-1]) + (token[-1] + '</w>',)pairs = get_pairs(word)if not pairs:return token+'</w>'while True:bigram = min(pairs, key = lambda pair: self.bpe_ranks.get(pair, float('inf')))if bigram not in self.bpe_ranks:breakfirst, second = bigramnew_word = []i = 0while i < len(word):try:j = word.index(first, i)new_word.extend(word[i:j])i = jexcept:new_word.extend(word[i:])breakif word[i] == first and i < len(word)-1 and word[i+1] == second:new_word.append(first+second)i += 2else:new_word.append(word[i])i += 1new_word = tuple(new_word)word = new_wordif len(word) == 1:breakelse:pairs = get_pairs(word)word = ' '.join(word)self.cache[token] = wordreturn word

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

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

相关文章

Python常用医疗AI库以及案例解析(2025年版、上)

随着人工智能在医疗领域的持续深入发展&#xff0c;Python 已经成为医疗 AI 项目的首选开发语言。从数据处理、模型训练、大模型集成到系统部署与可视化&#xff0c;Python 社区在过去几年中涌现出大量功能强大且持续演进的开源工具。本指南整理了在 2025 年医疗 AI 项目中广泛…

钉钉企业应用开发系列:前端实现自定义右上角菜单(dd.http + Vue3)

本文将围绕“如何在钉钉企业应用中自定义右上角菜单”这一主题进行讲解&#xff0c;并结合现代前端技术栈&#xff08;Vue3 Composition API&#xff09;展示完整实现过程&#xff0c;帮助你快速构建具备原生交互体验的企业应用。 一、前置准备 1. 注册钉钉开发者账号并创建应…

Python 爬虫实战 | 国家医保

一、国家医保 1、目标网站 网址&#xff1a;https://fuwu.nhsa.gov.cn/nationalHallSt/#/search/drug-directory目标数据&#xff1a;获取药品信息 2、网站特点 服务端返回加密数据&#xff0c;客户端发送请求携带的载荷也是加密的 3、定位解密入口 可以通过关键字encDa…

Centrifugo 深度解析:构建高性能实时应用的开源引擎

引言&#xff1a;实时通信的现代挑战 在当今数字化世界中&#xff0c;实时通信能力已成为应用的必备特性。无论是聊天应用的即时消息、金融交易平台的实时报价&#xff0c;还是协作工具的同步编辑&#xff0c;对低延迟、高并发的需求都在指数级增长。然而&#xff0c;实现可靠…

PostgreSQL中的rank()窗口函数:实用指南与示例

在数据分析和数据库管理中&#xff0c;经常需要对数据进行排名操作。PostgreSQL提供了强大的窗口函数rank()&#xff0c;可以方便地对结果集中的行进行排名。本文将详细介绍rank()函数的使用方法&#xff0c;并通过多个实用示例展示其在不同场景下的应用。 一、rank()函数简介 …

学习设计模式《十六》——策略模式

一、基础概念 策略模式的本质是【分离算法&#xff0c;选择实现】。 策略模式的定义&#xff1a;定义一系列的算法&#xff0c;把它们一个个封装起来&#xff0c;并且使他们可以相互替换。本模式使得算法可独立于使用它的客户而变化。 策略模式的上下文&#xff08;context&…

Stereolabs ZED系列与ZED X立体相机系列对比:如何根据项目需求选择?

Stereolabs是全球领先的三维视觉技术公司&#xff0c;专注于为机器人、自动化和空间感知等领域提供高性能视觉解决方案。其ZED立体相机系列包括ZED和ZED X两大系列&#xff0c;分别针对多场景三维感知和工业级应用设计&#xff0c;为企业和开发者提供了丰富的选择。 ZED系列&am…

人体属性识别+跌倒检测:儿童行为监测与安全升级

智慧幼儿园的AI智能检测盒应用实践 背景&#xff1a;传统园区管理的三大痛点 传统幼儿园管理长期面临三大核心挑战&#xff1a;一是安全监控依赖人工巡查&#xff0c;存在视觉盲区与响应延迟&#xff0c;如某连锁幼儿园曾因人工巡查疏漏&#xff0c;导致3起儿童跌倒事故未能及…