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=1n?P(tokeni?)

因此,WordPiece 的訓練目標是最大化整個訓練語料的對數似然:
max?∑wordslog?P(word)\max \sum_{\text{words}} \log P(\text{word})maxwords?logP(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)=41??271?=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
英文地址,請注明出處:http://en.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>…