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.mzph.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…