Abid Ali Awan 2026-01-15
一份面向机器学习的 NLP 预处理指南
本文将介绍 spaCy、Hugging Face Transformers,以及分词在真实场景中的工作方式。
在自然语言处理(NLP)和机器学习领域,分词(Tokenization)是指将一段文本序列拆分为更小单元(称为“token”或“标记”)的过程。这些 token 可以小到单个字符,也可以大到完整单词。这一过程之所以重要,是因为它通过将人类语言分解为易于分析的小块,帮助机器理解语言。
什么是分词?
想象一下你正在教一个孩子阅读。你不会一开始就让他读复杂的段落,而是先从单个字母开始,再过渡到音节,最后才是完整的单词。类似地,分词将大量文本分解为更易消化和理解的单元,以便机器处理。
分词的主要目标是以一种对机器有意义的方式表示文本,同时不丢失其上下文信息。通过将文本转换为 token,算法可以更容易地识别模式。这种模式识别至关重要,因为它使机器能够理解并响应人类输入。例如,当机器遇到单词 “running” 时,它不会将其视为一个孤立的整体,而是作为一组可分析并从中推导出含义的 token。
为了更深入地理解其机制,考虑这句话:“Chatbots are helpful.” 如果我们按单词进行分词,它会变成一个单词数组:
["Chatbots", "are", "helpful"]
这是一种直接的方法,通常以空格作为 token 的边界。然而,如果我们按字符进行分词,这句话会被拆解为:
["C", "h", "a", "t", "b", "o", "t", "s", " ", "a", "r", "e", " ", "h", "e", "l", "p", "f", "u", "l"]
这种字符级的拆解更为细粒度,在某些语言或特定 NLP 任务中尤其有用。
本质上,分词类似于解剖句子以理解其结构。正如医生通过研究单个细胞来理解器官一样,NLP 从业者也使用分词来剖析并理解文本的结构和含义。
值得注意的是,尽管我们的讨论集中在语言处理中的分词,但“分词”一词在安全和隐私领域(尤其是数据保护实践,如信用卡分词)也有应用。在这些场景中,敏感数据元素会被替换为非敏感的等效项,即“token”。区分这两个语境非常重要,以避免混淆。
分词的类型
分词方法根据文本拆分的粒度和具体任务需求而有所不同。这些方法可以从将文本拆分为单个单词,到拆分为字符甚至更小的单元。以下是不同类型分词的详细介绍:
- 单词分词(Word Tokenization):将文本拆分为单个单词。这是最常见的方法,特别适用于英语等具有清晰单词边界的语言。
- 字符分词(Character Tokenization):将文本拆分为单个字符。这种方法对于缺乏清晰单词边界的语言,或需要细粒度分析的任务(如拼写纠错)非常有用。
- 子词分词(Subword Tokenization):在单词和字符分词之间取得平衡,将文本拆分为比单个字符大但比完整单词小的单元。例如,“Chatbots” 可能被分词为 “Chat” 和 “bots”。这种方法特别适用于通过组合较小单元形成意义的语言,或在 NLP 任务中处理词汇表外(out-of-vocabulary)的词。
下表说明了它们之间的区别:
| 类型 | 描述 | 应用场景 |
|---|---|---|
| 单词分词 | 将文本拆分为单个单词 | 适用于英语等具有清晰单词边界的语言 |
| 字符分词 | 将文本拆分为单个字符 | 适用于无清晰单词边界的语言,或需要细粒度分析的任务 |
| 子词分词 | 将文本拆分为大于字符但小于单词的单元 | 适用于形态复杂的语言,或处理词汇表外词 |
分词的应用场景
分词是数字领域众多应用的基石,使机器能够处理和理解海量文本数据。通过将文本分解为可管理的小块,分词促进了更高效、更准确的数据分析。以下是一些典型应用场景及现实案例:
搜索引擎
当你在 Google 等搜索引擎中输入查询时,它会使用分词来解析你的输入。这种拆解帮助引擎从数十亿文档中筛选出最相关的结果。
机器翻译
Google Translate 等工具利用分词将源语言句子切分为片段。一旦完成分词,这些片段即可被翻译,并在目标语言中重新组合,从而确保翻译保留原始上下文。
语音识别
Siri 或 Alexa 等语音助手严重依赖分词。当你提出问题或发出指令时,你的语音首先被转换为文本,然后进行分词,使系统能够处理并执行你的请求。
评论中的情感分析
分词在从用户生成内容(如产品评论或社交媒体帖子)中提取洞察方面起着关键作用。例如,电商平台的情感分析系统可能会对用户评论进行分词,以判断客户表达的是正面、中性还是负面情绪。例如:
- 原始评论:“This product is amazing, but the delivery was late.”
- 分词后:
["This", "product", "is", "amazing", ",", "but", "the", "delivery", "was", "late", "."]
随后,情感模型可以处理 “amazing” 和 “late” 这两个 token,赋予混合情感标签,为企业提供可操作的洞察。
聊天机器人与虚拟助手
分词使聊天机器人能够有效理解和响应用户输入。例如,客户服务聊天机器人可能会对如下查询进行分词:
“I need to reset my password but can't find the link.”
分词结果为:["I", "need", "to", "reset", "my", "password", "but", "can't", "find", "the", "link"]。
这种拆解帮助聊天机器人识别用户意图(“重置密码”),并做出适当回应,例如提供链接或操作说明。
分词面临的挑战
人类语言固有的细微差别和模糊性给分词带来了一系列独特挑战。以下是对其中一些障碍的深入探讨,以及近期应对这些挑战的技术进展:
歧义性(Ambiguity)
语言本质上具有歧义。例如句子 “Flying planes can be dangerous.” 根据分词和解释方式的不同,可能意味着“驾驶飞机很危险”,也可能指“飞行中的飞机很危险”。这种歧义可能导致截然不同的解读。
无清晰词边界的语言
中文、日文或泰语等语言没有明显的词间空格,使得分词更加复杂。确定一个词在哪里结束、另一个词从哪里开始,是这些语言中的重大挑战。
为解决此问题,多语言分词模型取得了显著进展。例如:
- XLM-R(Cross-lingual Language Model - RoBERTa):采用子词分词,并通过大规模预训练有效处理超过 100 种语言,包括那些没有清晰词边界的语言。
- mBERT(Multilingual BERT):使用 WordPiece 分词,在多种语言上表现出色,即使在低资源语言中也能很好地理解句法和语义结构。
这些模型不仅能有效分词,还能跨语言共享子词词汇表,从而改善对通常难以处理的文字的分词效果。
特殊字符的处理
文本通常不仅包含单词,还包含电子邮件地址、URL 或特殊符号,这些内容分词起来颇具挑战。例如,“john.doe@email.com” 应被视为一个 token,还是在句点或“@”符号处分割?先进的分词模型现在已整合规则和学习到的模式,以确保一致处理此类情况。
分词的实现工具
自然语言处理领域提供了多种工具,每种都针对特定需求和复杂性进行了优化。以下是一些主流分词工具和方法的指南:
Hugging Face Transformers
Hugging Face Transformers 库是现代 NLP 应用的行业标准。它与 PyTorch 无缝集成,提供最先进的 Transformer 模型,并通过 AutoTokenizer API 自动处理分词。主要特性包括:
- AutoTokenizer:自动为任意模型加载正确的预训练分词器。
- 快速分词器(Fast tokenizers):基于 Rust 构建,显著提升速度,适用于大规模数据集的快速预处理。
- 预训练兼容性:分词器与特定模型(如 BERT、GPT-2、Llama、Mistral 等)完美匹配。
- 支持子词分词:支持 Byte-Pair Encoding (BPE)、WordPiece 和 Unigram 分词,能高效处理词汇表外词和复杂语言。
spaCy
spaCy 是一个现代、高效的 Python NLP 库,特别适合需要速度和可解释性的生产系统。与 Hugging Face 不同,它使用基于规则的分词方法,以语言学准确性为目标。
何时使用 spaCy:
- 构建传统 NLP 流水线(如命名实体识别、依存句法分析)
- 不使用 Transformer 模型的项目
- 对性能要求高的系统,需要快速分词
NLTK(仅限教育用途)
NLTK(Natural Language Toolkit)是一个基础性的 Python NLP 库,主要用于学习和研究。尽管仍可使用,但其速度远低于现代替代方案,不推荐用于生产系统。
仅在以下情况使用 NLTK:
- 学习 NLP 概念
- 教育项目
- 语言学研究
对于所有生产应用,建议优先选择 spaCy 或 Hugging Face Transformers。
遗留说明:Keras Tokenizer
keras.preprocessing.text.Tokenizer自 Keras 3.0 起已被弃用,不应在新项目中使用。现代 Keras 项目应改用keras.layers.TextVectorization。对于 NLP 任务,推荐使用 Hugging Face Transformers。
高级分词技术
对于特殊用例或自定义模型构建,以下方法可提供细粒度控制:
- **Byte-Pair Encoding **(BPE):一种自适应分词方法,通过迭代合并文本中最频繁的字节对来构建词汇表。这是 GPT-2、GPT-3 及大多数现代大语言模型的默认分词方式。BPE 在处理未知词和多样文字时特别有效,无需语言特定的预处理。
- SentencePiece:一种无监督文本分词器,专为基于神经网络的文本生成任务设计。与 BPE 不同,它可以将空格视为 token,并能用单一模型处理多种语言,非常适合多语言项目和语言无关的分词。
这两种方法均可通过 Hugging Face Transformers 或作为独立库使用。
无分词建模(Tokenization-Free Modeling)
尽管分词目前对高效 NLP 至关重要,但新兴研究正在探索直接在字节或字符上运行、无需固定分词方案的模型。
最新进展:
- ByT5:一种在 UTF-8 字节上预训练的模型,而非子词 token,在保持与传统分词方法相当性能的同时,对字符级变化更具鲁棒性。
- CharacterBERT:学习字符级表示,并从字符序列动态构建词嵌入,无需固定词汇表。
- 分层 Transformer(Hierarchical transformers):通过分层编码策略接受原始字节,在几乎不损失效率的情况下实现端到端处理。
这些方法目前尚未大规模投入生产,主要仍处于研究阶段。然而,它们在跨语言和跨文字的鲁棒性方面展现出巨大潜力。
为何重要:无分词模型未来可能减少对语言特定预处理和词汇管理的依赖,使 NLP 系统更具普适性。然而,在当前应用中,传统分词仍是效率和实用性的标准选择。
结语
分词是每一个现代 NLP 应用的基础,从搜索引擎到大型语言模型无不依赖于此。
你所选择的分词方法和工具直接影响模型的准确性、推理速度和 API 成本,因此理解不同方法之间的权衡至关重要。通过为特定用例选择合适的分词策略,你可以显著提升生产系统的性能与效率。