NLP核心技術解析:大模型與分詞工具的協同工作原理

文章目錄

    • 一、核心關系概述
    • 二、分詞工具的核心作用
    • 三、未登錄詞(OOV)問題
      • 3.1 問題本質分析
      • 3.2 解決方案
        • 3.2.1 預對齊詞匯表(最優解)
        • 3.2.2 子詞回退策略
        • 3.2.3 詞匯表擴展(適合專業領域)
      • 3.3 技術選型建議
      • 3.4 關鍵驗證方法
      • 3.5 總結
    • 四、分詞工具與Tokenizer的區別
    • 五、NLP 中的特殊標記
      • 5.1 特殊標記解釋
      • 5.2 示例
    • 六、大模型輸入的核心組成部分
      • 6.1 名詞解釋
      • 6.2 輸入示例
      • 6.3 關鍵總結

一、核心關系概述

分詞工具(如Jieba、SentencePiece)與 AI大模型(如GPT、BERT)的關系可總結為:

  • 分詞工具是AI大模型的“前處理引擎”,為大模型提供數據預處理支持
  • 大模型是任務的“智能大腦”,它利用分詞結果可以進行更高級的語言理解和生成任務

二、分詞工具的核心作用

  1. 文本標準化處理
    • 中文分詞示例:"深度學習" → ["深度", "學習"]
    • 解決英文子詞問題:"unhappiness" → ["un", "happiness"]
  2. 降低計算復雜度
    • 長文本分割為詞/子詞單元,減少模型計算量
  3. 跨語言適配
    • 針對不同語言特性設計(如中文需分詞,英文需處理子詞)

三、未登錄詞(OOV)問題

3.1 問題本質分析

分詞工具(如 Jieba)分出的詞匯后續由 Tokenizer(如 BERT)轉換為詞匯表中的索引時,若詞匯表中不包含某些詞,則會出現 OOV(Out-of-Vocabulary)問題,這會導致:

  • 稀有詞/專業術語被拆解為 <UNK>(未知標記)
  • 語義信息丟失(如 “量子計算” → [UNK]
  • 模型性能下降

3.2 解決方案

3.2.1 預對齊詞匯表(最優解)

原理:強制分詞工具只輸出 Tokenizer 詞匯表中存在的詞匯

from transformers import BertTokenizer
import jieba# 加載Tokenizer并提取詞匯表
tokenizer = BertTokenizer.from_pretrained("bert-base-chinese")
vocab = set(tokenizer.get_vocab().keys())  # 獲取所有合法token# 定制化分詞函數
def aligned_cut(text):words = []for word in jieba.lcut(text):# 檢查詞匯是否存在(處理子詞情況)if word in vocab:words.append(word)else:# 遞歸拆解未登錄詞(直到字符級)for char in word:if char in vocab:words.append(char)else:words.append("[UNK]")return words# 測試
text = "量子計算是未來趨勢"
print(aligned_cut(text))  # 輸出保證在vocab中的分詞
3.2.2 子詞回退策略

原理:利用 Tokenizer 的子詞分解能力處理未登錄詞

from transformers import AutoTokenizertokenizer = AutoTokenizer.from_pretrained("bert-base-chinese")def safe_tokenize(text):# 先用分詞工具粗分words = jieba.lcut(text)  # 再用Tokenizer的子詞處理tokens = []for word in words:tokens.extend(tokenizer.tokenize(word))  # 自動處理OOVreturn tokens# 測試
print(safe_tokenize("區塊鏈技術"))  # ['區', '塊', '鏈', '技術']
3.2.3 詞匯表擴展(適合專業領域)

步驟

  1. 收集領域專有詞匯(如醫療術語)

  2. 添加到分詞工具用戶詞典

    jieba.load_userdict("medical_terms.txt")  # 每行格式: `術語 詞頻 詞性`
    
  3. 微調 Tokenizer(需重新訓練模型)

    new_tokens = ["COVID-19", "mRNA疫苗"]
    tokenizer.add_tokens(new_tokens)  # 擴展詞匯表
    model.resize_token_embeddings(len(tokenizer))  # 調整模型嵌入層
    

3.3 技術選型建議

場景推薦方案優點缺點
通用領域子詞回退策略無需額外資源可能拆解專業術語
專業領域(如醫療/法律)詞匯表擴展+預對齊保持術語完整性需要領域詞典和模型微調
多語言混合文本使用SentencePiece分詞統一處理多種語言需替換原有分詞工具

3.4 關鍵驗證方法

  1. 覆蓋率測試

    def check_coverage(texts):vocab = set(tokenizer.get_vocab().keys())oov_rate = 0for text in texts:words = jieba.lcut(text)oov_rate += sum(1 for w in words if w not in vocab) / len(words)print(f"OOV率: {oov_rate/len(texts):.2%}")check_coverage(["量子物理", "臨床試驗"])  # 示例輸出: OOV率: 15.00%
    
  2. 可視化調試

    from transformers import pipeline
    nlp = pipeline("ner", model="bert-base-chinese")text = "患者有COVID-19癥狀"
    print(nlp(text))  # 檢查專業術語是否被正確識別
    

3.5 總結

通過 詞匯表預對齊 + 子詞回退 + 領域適配擴展 的組合策略,可確保:
? 分詞結果 100% 被 Tokenizer 接受
? 專業術語完整性保留
? 避免 <UNK> 導致的語義損失

最終效果取決于分詞工具與 Tokenizer 的協同設計,建議在預處理階段加入 OOV檢測模塊 進行質量監控。

四、分詞工具與Tokenizer的區別

特性jieba(傳統分詞工具)大模型Tokenizer(如BERT/GPT)
設計目標針對特定語言(如中文)的詞匯級分割將文本轉換為模型可處理的子詞/字符級ID
輸出單元詞語(如[“深度學習”, “是”, “未來”])子詞(如[“深”, “度”, “學習”, “是”, “未”, “來”])
語言適應性需針對不同語言訓練專用模型通過統一算法(如BPE/WordPiece)支持多語言
典型應用場景搜索引擎、文本分析等傳統NLP任務大模型的輸入預處理

問題:為什么大模型仍需自研Tokenizer?

  • 子詞平衡:Tokenizer通過算法(如BPE)解決OOV(未登錄詞)問題,而 jieba 無法動態生成子詞。
  • 多語言統一:大模型需處理混合語言文本(如中英混雜),jieba 僅支持中文。
  • 端到端訓練:Tokenizer的分詞方式與模型架構強相關(如BERT的WordPiece需與預訓練一致)。

五、NLP 中的特殊標記

在自然語言處理(NLP)任務中,特殊標記(Special Tokens)用于處理文本輸入和輸出的特定需求。以下是常見的特殊標記及其作用:

5.1 特殊標記解釋

  1. [CLS] (Classification Token)

    • 作用:用于分類任務的特殊標記。
    • 位置:通常添加到輸入文本的開頭。
    • 用途
      • 在 BERT 等模型中,[CLS] 標記的最終隱藏狀態(即模型輸出的對應向量)通常用作整個輸入序列的聚合表示,用于分類任務(如情感分析、文本分類)。
      • 例如,在句子分類任務中,模型會根據 [CLS] 標記的向量輸出分類結果。
  2. [SEP] (Separator Token)

    • 作用:用于分隔不同句子或文本段的特殊標記。
    • 位置
      • 在單句任務中,通常添加到句子末尾。
      • 在雙句任務(如句子對分類、問答任務)中,用于分隔兩個句子。
    • 用途
      • 幫助模型區分不同的句子或文本段。
      • 例如,在問答任務中,[SEP] 標記用于分隔問題和上下文。
  3. [MASK] (Mask Token)

    • 作用:用于掩碼語言模型(Masked Language Model, MLM)任務。
    • 位置:替換輸入文本中的某些詞(通常隨機選擇)。
    • 用途
      • 在 BERT 等模型的預訓練過程中,[MASK] 標記用于掩蓋部分輸入詞,模型需要預測被掩蓋的詞。
      • 例如,輸入 "I love [MASK] learning.",模型需要預測 [MASK] 位置的實際詞(如 "deep")。
  4. [PAD] (Padding Token)

    • 作用:用于填充輸入序列,使其達到固定長度。
    • 位置:添加到輸入序列的末尾。
    • 用途
      • 在批處理(Batching)過程中,不同序列的長度可能不同,[PAD] 標記用于將短序列填充到相同長度。
      • 模型通常會忽略 [PAD] 標記的計算(通過注意力掩碼實現)。
  5. [UNK] (Unknown Token)

    • 作用:用于表示詞匯表中未包含的詞(即未知詞)。
    • 位置:替換輸入文本中的未知詞。
    • 用途
      • 當輸入文本中的詞不在模型的詞匯表中時,模型會將其替換為 [UNK] 標記。
      • 例如,如果詞匯表中沒有 "ChatGPT",輸入 "I use ChatGPT." 可能會被轉換為 "I use [UNK]."

5.2 示例

以下是一個包含特殊標記的輸入示例(以 BERT 為例):

[CLS] I love deep learning . [SEP] It is a fascinating field . [SEP] [PAD] [PAD]

六、大模型輸入的核心組成部分

在自然語言處理(NLP)和大模型(如BERT、GPT等)中,input_idsattention_masktoken_type_ids 是模型輸入的核心組成部分,用于將原始文本轉換為模型可處理的數值化格式。以下是它們的詳細解釋和實際示例:

6.1 名詞解釋

  1. input_ids(文本的數值化表示)

    • 作用:將分詞后的文本(Tokens)轉換為模型詞匯表中對應的整數ID。

    • 生成方式

      • 分詞器(Tokenizer)先將文本拆分為詞/子詞(如"深度學習"["深", "度", "學", "習"])。
      • 然后查詢詞匯表,將每個Token映射為對應的ID(如"深"3918)。
    • 示例

      from transformers import AutoTokenizer
      tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese")
      text = "深度學習很重要"
      inputs = tokenizer(text)
      print(inputs["input_ids"])  # 輸出如:[101, 3918, 2428, 2110, 739, 2523, 7028, 6206, 102]
      
      • 101102 是BERT的[CLS][SEP]特殊標記的ID。
  2. attention_mask(注意力掩碼)

    • 作用:標識哪些Token是有效輸入,哪些是填充(Padding)部分。

      • 1:真實Token(模型需處理)。
      • 0:填充Token(模型忽略)。
    • 為什么需要:批量訓練時,不同文本長度不同,需填充到相同長度。

    • 示例

      print(inputs["attention_mask"])  # 輸出如:[1, 1, 1, 1, 1, 1, 1](無填充)
      

      如果填充到長度10:

      padded_inputs = tokenizer(text, padding="max_length", max_length=10)
      print(padded_inputs["attention_mask"])  # 輸出如:[1, 1, 1, 1, 1, 1, 1, 0, 0, 0]
      
  3. token_type_ids(或 segment_ids,句子分段標識):

    • 作用:區分輸入中的不同句子(如問答任務中的問題和上下文)。

      • 0:第一個句子。
      • 1:第二個句子。
    • 適用場景:BERT等模型處理句子對任務(如文本相似度、問答)。

    • 示例

      text_pair = ("深度學習是什么?", "它是AI的一個分支")
      inputs = tokenizer(*text_pair)
      print(inputs["token_type_ids"])  # 輸出如:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1]
      

6.2 輸入示例

from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese")# 處理單句
single_text = "你好,世界!"
inputs = tokenizer(single_text, return_tensors="pt")
print("單句輸入:")
print(f"input_ids: {inputs['input_ids']}") # 輸出 input_ids: tensor([[ 101,  872, 1962, 8024,  686, 4518, 8013,  102]])
print(f"attention_mask: {inputs['attention_mask']}") # 輸出 attention_mask: tensor([[1, 1, 1, 1, 1, 1, 1, 1]])
print(f"token_type_ids: {inputs['token_type_ids']}")  # 輸出 token_type_ids: tensor([[0, 0, 0, 0, 0, 0, 0, 0]])# 處理句子對
text_pair = ("今天天氣如何?", "今天下雨了。")
inputs_pair = tokenizer(*text_pair, return_tensors="pt")
print("\n句子對輸入:")
print(f"input_ids: {inputs_pair['input_ids']}") # 輸出 input_ids: tensor([[ 101,  791, 1921, 1921, 3698, 1963,  862, 8043,  102,  791, 1921,  678,7433,  749,  511,  102]])
print(f"attention_mask: {inputs_pair['attention_mask']}") # 輸出 attention_mask: tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])
print(f"token_type_ids: {inputs_pair['token_type_ids']}")  # 輸出 token_type_ids: tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1]])

6.3 關鍵總結

  • input_ids:文本的數字身份證,決定模型“看到”什么內容。
  • attention_mask:告訴模型“哪些部分需要關注”,優化計算效率。
  • token_type_ids:為模型標注“句子邊界”,解決上下文依賴問題。

這些輸入張量共同構成了大模型理解文本的基礎,類似于人類閱讀時需要的“文字+上下文+注意力焦點”。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/82105.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/82105.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/82105.shtml

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

相關文章

vscode預覽模式(點擊文件時默認覆蓋當前標簽,標簽名稱顯示為斜體,可通過雙擊該標簽取消)覆蓋標簽、新窗打開

文章目錄 VS Code 預覽模式如何取消預覽模式&#xff08;即“固定”標簽頁&#xff09;&#xff1f;預覽模式有什么用&#xff1f; VS Code 預覽模式 在 VS Code 中&#xff0c;當你單擊文件瀏覽器&#xff08;例如&#xff0c;資源管理器側邊欄&#xff09;中的某個文件時&am…

MIT XV6 - 1.1 Lab: Xv6 and Unix utilities - user/_sleep 是什么?做什么?

接上文 MIT XV6 - 1.1 Lab: Xv6 and Unix utilities - sleep 是怎樣練成的&#xff1f; user/_sleep 是什么&#xff1f; book-riscv-rev3.pdf 3.8節有對Xv6 binary文件的格式描述 Xv6 binaries are formatted in the widely-used ELF format, defined in (kernel/elf.h). An …

【AI科技】AMD ROCm 6.4 新功能:突破性推理、即插即用容器和模塊化部署,可在 AMD Instinct GPU 上實現可擴展 AI

AMD ROCm 6.4 新功能&#xff1a;突破性推理、即插即用容器和模塊化部署&#xff0c;可在 AMD Instinct GPU 上實現可擴展 AI 現代 AI 工作負載的規模和復雜性不斷增長&#xff0c;而人們對性能和部署便捷性的期望也日益提升。對于在 AMD Instinct? GPU 上構建 AI 和 HPC 未來…

【含文檔+PPT+源碼】基于微信小程序連鎖藥店商城

項目介紹 本課程演示的是一款基于微信小程序連鎖藥店商城&#xff0c;主要針對計算機相關專業的正在做畢設的學生與需要項目實戰練習的 Java 學習者。 1.包含&#xff1a;項目源碼、項目文檔、數據庫腳本、軟件工具等所有資料 2.帶你從零開始部署運行本套系統 3.該項目附帶的…

node.js模塊化步驟(各標準區別)CommonJS規范、AMD規范、UMD規范、ES Modules (ESM)

前后端建議統一使用ESM 文章目錄 Node.js模塊化發展歷程與標準對比一、模塊化的意義1.1 解決的核心問題1.2 沒有模塊化的問題 二、CommonJS規范2.1 核心特征2.2 實現示例 三、AMD (Asynchronous Module Definition)3.1 特點3.2 代碼示例 四、UMD (Universal Module Definition)…

人工智能與智能合約:如何用AI優化區塊鏈技術中的合約執行?

引言&#xff1a;科技融合的新風口 區塊鏈和人工智能&#xff0c;是當前最受矚目的兩大前沿技術。一個以去中心化、可溯源的機制重構信任體系&#xff0c;另一個以智能學習與決策能力重塑數據的價值。當這兩項技術相遇&#xff0c;會碰撞出什么樣的火花&#xff1f; 智能合約作…

RabbitMQ-api開發

前言 MQ就是接收并轉發消息 核心概念 admin是用戶 每個虛擬機上都有多個交換機 快速入門 引入依賴 <dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.22.0</version></dependen…

PostgreSQL Patroni集群組件作用介紹:Patroni、etcd、HAProxy、Keepalived、Watchdog

1. Watchdog 簡介 1.1 核心作用 ? 主節點故障檢測 Watchdog 會定時檢測數據庫主節點&#xff08;或 Pgpool 主節點&#xff09;的運行狀態。 一旦主節點宕機&#xff0c;它會發起故障切換請求。 ? 協調主備切換 多個 Pgpool 節點時&#xff0c;Watchdog 保證只有一個 Pg…

【多種不同提交方式】通過springboot實現與前端網頁數據交互(非常簡潔快速)

【多種不同提交方式】通過springboot實現與前端網頁數據交互 提示&#xff1a;幫幫志會陸續更新非常多的IT技術知識&#xff0c;希望分享的內容對您有用。本章分享的是springboot的使用。前后每一小節的內容是存在的有&#xff1a;學習and理解的關聯性。【幫幫志系列文章】&am…

使用 AI 如何高效解析視頻內容?生成思維導圖或分時段概括總結

一、前言 AI 發展的如此迅速&#xff0c;有人想通過 AI 提效對視頻的解析&#xff0c;怎么做呢&#xff1f; 豆包里面有 AI 視頻總結的功能&#xff0c;可以解析bilibili網站上部分視頻&#xff0c;如下圖所示&#xff1a; 但有的視頻解析時提示&#xff1a; 所以呢&#x…

鞅與停時 - 一種特別的概率論問題

討論一個有趣的概率問題&#xff1a; [P3334 ZJOI2013] 拋硬幣 - 洛谷 實際上是一個猴子打字問題&#xff0c;考慮一直無規律隨即打字的猴子&#xff0c;鍵盤上只有A-Z一共26個字母&#xff0c;對于一個特定的字符串 S S S &#xff1a; ABCABCAB &#xff0c;能否在有限的打…

arcgis和ENVI中如何將數據輸出為tif

一、arcgis中轉換為tif 右鍵圖層&#xff1a; Data -> Export Data, 按照圖示進行選擇&#xff0c;選擇tiff格式導出即可&#xff0c;還可以選擇其他類型的格式&#xff0c;比如envi。 二、 ENVI中轉換為tif File -> Save As -> Save As (ENVI, NITF, TIFF, DTED) …

如何用命令行判斷一個exe是不是c#wpf開發的

在powershell下執行 $assembly [Reflection.Assembly]::ReflectionOnlyLoadFrom("你的exe全路徑") $references $assembly.GetReferencedAssemblies() echo $assembly $references | Where-Object { $_.Name -match "PresentationFramework|PresentationCore…

2025.05.07-華為機考第三題300分

?? 點擊直達筆試專欄 ??《大廠筆試突圍》 ?? 春秋招筆試突圍在線OJ ?? 筆試突圍OJ 03. 城市緊急救援隊伍協同規劃 問題描述 智慧城市建設中,盧小姐負責設計一套緊急救援隊伍協同系統。城市被規劃為一個 n n n \times n

深入理解Redis SDS:高性能字符串的終極設計指南

&#x1f4cd; 文章提示 10分鐘掌握Redis核心字符串設計 | 從底層結構到源碼實現&#xff0c;揭秘SDS如何解決C字符串七大缺陷&#xff0c;通過20手繪圖示與可運行的C代碼案例&#xff0c;助你徹底理解二進制安全、自動擴容等核心機制&#xff0c;文末附實戰優化技巧&#xff…

jupyter notebook漢化教程

本章教程記錄&#xff0c;jupyter notebook漢化步驟&#xff0c;如果對漢化有需求的小伙伴可以看看。 一、安裝jupyter 如果你是安裝的anaconda的那么默認是包含了Jupyter notebook的&#xff0c;如果是miniconda或者基礎python&#xff0c;默認是不包含的jupyter組件的&#x…

模擬設計中如何減小失配

Xx 芯片測試結果顯示&#xff0c;offset 指標偏高&#xff0c;不符合指標要求。所以查看了資料&#xff0c;溫習了減小的失配的方法。 注意點一&#xff1a; 將所有offet折算到輸入端&#xff0c;得到以下公式&#xff1a; 可以看到a&#xff09;閾值電壓失配直接折算成輸…

C++ 與 Lua 聯合編程

在軟件開發的廣闊天地里&#xff0c;不同編程語言各有所長。C 以其卓越的性能、強大的功能和對硬件的直接操控能力&#xff0c;在系統開發、游戲引擎、服務器等底層領域占據重要地位&#xff0c;但c編寫的程序需要編譯&#xff0c;這往往是一個耗時操作&#xff0c;特別對于大型…

烤箱面包烘焙狀態圖詳解:從UML設計到PlantUML實現

題目&#xff1a;假設你正著手設計一個烤箱。建立一個跟蹤烤箱中面包狀態的狀態圖。要包括必要的觸發器事件、動作和監視條件。 一、狀態圖概述 狀態圖是UML&#xff08;統一建模語言&#xff09;中的一種行為圖&#xff0c;它用于描述系統中對象的狀態變化以及觸發這些變化的…

三款實用工具推薦:配音軟件+Windows暫停更新+音視頻下載!

各位打工人請注意&#xff01;今天李師傅掏出的三件套&#xff0c;都是經過實戰檢驗的效率放大器。先收藏再劃走&#xff0c;說不定哪天就能救命&#xff01; 一.祈風TTS-配音大師 做短視頻的朋友肯定深有體會——配個音比寫腳本還費勁&#xff01;要么付費買聲音&#xff0c…