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 編碼錯誤、替換亂碼字符"a??helloa??""“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.pswp.cn/diannao/90154.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/90154.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/90154.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【如何判斷Linux系統是Ubuntu還是CentOS】

要確定您的操作系統是 Ubuntu 還是 CentOS&#xff0c;可以通過以下方法快速檢查&#xff1a; 方法 1&#xff1a;通過終端命令&#xff08;推薦&#xff09; 在終端中執行以下命令之一&#xff1a; 查看 /etc/os-release 文件 cat /etc/os-releaseUbuntu 特征&#xff1a;顯示…

RISCV Linux 虛擬內存精講系列二 -- Linux 入口 head.S

通過 Linux 的構建系統&#xff0c;即 Linux 源代碼的根目錄下的 Makefile&#xff0c;能夠找到 vmlinux 的鏈接文件&#xff0c;從而能夠查看其入口代碼 head.S:_start&#xff0c; 如下&#xff1a; Linux 構建系統主Makefile: vmlinux.lds: head.S: 找到該入口后&#xff0c…

springAI學習:Advisors

spring AI Advisors類似于攔截器&#xff0c;會對請求的prompt做出特定的修改和增強&#xff08;比如傳入歷史溝通記錄、搜索信息等等&#xff09;&#xff0c;以達到完善prompt的目的。通過Advisors API&#xff0c;開發人員可以創建更為復雜、可重用、可維護的AI組件。下面介…

MySQL CDC與Kafka整合指南:構建實時數據管道的完整方案

一、引言&#xff1a;現代數據架構的實時化需求 在數字化轉型浪潮中&#xff0c;實時數據已成為企業的核心資產。傳統批處理ETL&#xff08;每天T1&#xff09;已無法滿足以下場景需求&#xff1a; 實時風險監控&#xff08;金融交易&#xff09;即時個性化推薦&#xff08;電商…

MATLAB | 繪圖復刻(二十一)| 扇形熱圖+小提琴圖

前段時間在小紅書刷到了一個很有特色的熱力圖&#xff0c;由大佬滾筒洗衣機創作&#xff0c;感覺很有意思&#xff0c;嘗試 MATLAB 復刻&#xff1a; 作者使用的是 python 代碼&#xff0c;趕快去瞅瞅。 復刻效果 正文部分 0.數據準備 數據需要一個用來畫熱圖的矩陣以及一個…

批量PDF轉換工具,一鍵轉換Word Excel

軟件介紹 今天為大家推薦一款高效的Office文檔批量轉換工具&#xff0c;能夠快速將Word和Excel文件批量轉換為PDF格式。 軟件特點 這款名為"五五Excel word批量轉PDF"的工具體積小巧&#xff0c;不到2M大小&#xff0c;卻能實現強大的批量轉換功能&#xff0c…

面試150 基本計算器

思路 利用棧&#xff08;stack&#xff09;來保存進入括號前的計算狀態&#xff08;包括當前計算結果和符號&#xff09;&#xff0c;以便在括號結束后正確恢復計算上下文。代碼通過遍歷字符串&#xff0c;識別數字、加號、減號和括號。遇到數字時構造完整數值&#xff1b;遇到…

源哈希(sh)解析

源哈希&#xff08;Source Hashing&#xff09;是一種負載均衡算法&#xff0c;它根據請求的源 IP 地址&#xff08;或其他標識符&#xff09;生成哈希值&#xff0c;然后根據這個哈希值將請求分配到特定的后端服務實例。這種方法常用于確保來自同一客戶端的請求始終被路由到同…

axios的使用以及封裝

前言&#xff1a; 在現代前端開發中&#xff0c;網絡請求是不可避免的核心功能之一。無論是獲取后端數據、提交表單信息&#xff0c;還是與第三方 API 交互&#xff0c;高效且可靠的 HTTP 請求庫至關重要。axios 作為一款基于 Promise 的 HTTP 客戶端&#xff0c;憑借其簡潔的 …

github上部署自己的靜態項目

前置知識1、要在github部署項目要提交打包后的靜態文件(html,css&#xff0c;js)到倉庫里2、我們看下github所提供給我們的部署方式有啥&#xff0c;如下所見&#xff1b;要么是/root文件夾&#xff08;就說倉庫里全是打包后的產物&#xff1a;html,css&#xff0c;js要全部放到…

能源管理綜合平臺——分布式能源項目一站式監控

綜合性的能源企業管理面臨著項目多、分布散、信息孤島等問題&#xff0c;分布式的多項目能源在線監控管理平臺是一種集成了多個能源項目的數據采集、監控、分析和管理的系統。平臺集成GIS能力&#xff0c;能夠展示項目的整體分布態勢&#xff0c;對不同地點、不同類型的能源項目…

修改阿里云vps為自定義用戶登錄

win系統上找到控制面板-->用戶賬戶-->更改賬戶類型點擊更改賬戶類型&#xff0c;此時我們看到vps的默認管理員賬戶Administrator。為了防止vps被別人使用默認賬戶Administrator攻擊&#xff0c;我們添加一個用戶賬戶&#xff0c;點擊添加用戶賬戶。 用戶名建議奇葩點&…

Linux: perf: debug問題一例,cpu使用率上升大約2%;多線程如何細化cpu及perf數據分析

文章目錄 前提面臨的問題內核級別函數的差別繼續debug總結根據pid前提 一個進程安置在一個CPU上,新功能上線之后,固定量的業務打起來,占用的CPU是42%。之前沒有新功能的情況下,CPU占用是40%。差了大約2%。而且這個進程里的線程數非常多,有50多個線程。從差距看變化不大,…

計算階梯電費

實現一個 Python 程序&#xff0c;根據使用的電量&#xff08;從控制臺中讓用戶輸入&#xff09;計算需要交的電費&#xff0c;電量分為兩個階梯&#xff0c;小于 200 度和大于 200 度&#xff0c;如果電量小于等于 200 度&#xff0c;電價就是 0.5 元/度&#xff0c;如果電量大…

替代MT6701,3D 霍爾磁性角度傳感器芯片

KTH5502 是一款基于垂直霍爾技術的高精度絕對角度傳感器芯片&#xff0c;支持全角度&#xff08;0–360&#xff09;測量。 芯片內部集成 X、Y 軸的垂直霍爾元件和 Z 軸的水平霍爾元件&#xff0c;能夠同時感知磁場在 X、Y、Z 三個 方向的變化。得益于垂直霍爾技術優異的正交匹…

華為 Mate 80 影像配置揭秘:硬軟雙升

7 月 7 日&#xff0c;知名數碼博主爆料了華為 Mate 80 系列的影像配置&#xff0c;引發廣泛關注。從曝光信息來看&#xff0c;Mate 80 系列在影像方面延續華為的技術探索&#xff0c;通過硬件升級與算法優化&#xff0c;力圖為用戶帶來更出色的拍攝體驗。? 爆料顯示&#xff…

Android studio升級AGP需要注意哪些

deep seek回答&#xff1a; 深度思考完成 用時26秒 嗯&#xff0c;用戶詢問的是在Android Studio中升級AGP需要注意哪些事項。這個問題很實用&#xff0c;因為AGP升級確實是個容易踩坑的過程。讓我看看搜索結果里有什么關鍵信息。 首先注意到搜索結果里有幾個高可信度的資料專…

MapReduce數據處理過程2萬字保姆級教程

目錄 1. MapReduce 的核心思想:分而治之的藝術 2. Hadoop MapReduce 的架構:從宏觀到微觀 3. WordCount 實例:從代碼到執行的完整旅程 4. 源碼剖析:Job.submit 的魔法 5. Map 任務的執行:從分片到鍵值對 6. Shuffle 階段:MapReduce 的幕后英雄 7. Reduce 任務的執行…

Rust單例模式:OnceLock的使用指南

想象一下你在構建一個需要全局數據庫連接的Rust應用。傳統語言里&#xff0c;單例模式常常伴隨著鎖的沉重和初始化競態的焦慮。但在Rust的世界里&#xff0c;OnceLock就像個輕巧的守門人&#xff0c;只允許一次安全的通行。 簡潔的OnceLock實現 看看這段代碼如何優雅地解決單…

JavaScript性能優化實戰:表格控件高效開發指南

引言 在現代Web應用開發中&#xff0c;電子表格功能已成為數據分析、報表展示等場景的核心需求。SpreadJS作為一款高性能的純前端電子表格控件&#xff0c;能夠完美兼容Excel文件格式&#xff0c;支持百萬級數據量和復雜公式計算。然而隨著數據規模的增長和業務邏輯的復雜化&a…