NLP分词与Word2Vec词向量深度解析
- 一、英文分词
-
- [1. 词级分词](#1. 词级分词)
- [2. 字符级分词](#2. 字符级分词)
- [3. 子词级分词](#3. 子词级分词)
- 二、中文分词
-
- [1. 字符级分词](#1. 字符级分词)
- [2. 词级分词](#2. 词级分词)
- [3. 子词级分词](#3. 子词级分词)
- 三、分词工具
-
- [1. jieba 分词器](#1. jieba 分词器)
- [2. One-hot 编码](#2. One-hot 编码)
- [3. Word2Vec 词嵌入](#3. Word2Vec 词嵌入)
一、英文分词
按照分词粒度的不同,可将英文分词划分为三种类型:词级分词(Word-Level) 、字符级分词(Character-Level) 和 子词级分词(Subword-Level)。下面逐一展开介绍。
1. 词级分词
词级分词是指将文本按照完整的词语进行切分,是最传统、最直观的分词方式。在英文中,空格和标点通常充当天然的分隔符。

词级分词虽然便于理解和实现,但在实际应用中容易遭遇 OOV(Out-of-Vocabulary,未登录词) 问题。所谓OOV,是指在模型使用阶段,输入文本中出现了不在预先构建词表中 的词语,例如网络热词、专有名词、复合词及拼写变体等。由于模型无法识别这些词,通常会将它们统一替换为特殊标记(如 <UNK>),从而导致语义信息丢失,影响模型的理解与预测能力。
2. 字符级分词
字符级分词(Character-level Tokenization)是以单个字符为最小单位进行切分的方法。文本中的每一个字母、数字、标点乃至空格,都会被视作一个独立的 token。

在这种分词方式下,词表仅由所有可能出现的字符组成,因此词表规模极小 ,覆盖率极高,几乎不存在 OOV 问题。无论输入中出现什么新词或拼写变体,只要字符在词表中,都能被正常表示。
然而,单个字符本身所承载的语义信息极弱,模型必须依赖更长的上下文来推断词义和结构,这显著增加了建模难度和训练成本。同时,输入序列也会变得更长,影响模型效率。
3. 子词级分词
子词级分词是一种介于词级与字符级之间的分词方法,它将词语切分为更小的语义单元------子词(subword),例如词根、前缀、后缀或常见的词片段。
与词级分词相比,子词分词能显著缓解 OOV 问题 ;与字符级分词相比,它又能更好地保留语义结构。

子词分词的核心思想是:即使一个完整的词没有出现在词表中,只要它可以被拆分为词表中已有的子词单元,模型就能识别和表示它,从而避免整体被替换为 <UNK>。
常见的子词分词算法包括 BPE(Byte Pair Encoding) 、WordPiece 和 Unigram Language Model。
其中,BPE 是最早被广泛应用的子词分词方法。其基本思想是:
- 训练阶段:首先将语料中的词汇拆分为单个字符,构建初始词表;然后迭代统计语料中出现频率最高的相邻字符对,将其合并为新的子词单元并加入词表。此过程持续进行,直到词表大小达到预设上限。
- 分词阶段:将新文本拆分为最小单位(如字符),然后按顺序应用训练中学习到的合并规则,逐步合并,直到无法继续。最终得到由子词组成的分词结果。

子词级分词已成为现代英文 NLP 模型中的主流方法,如 BERT 、GPT 等模型均采用了基于子词的分词机制。
二、中文分词
1. 字符级分词
字符级分词是中文处理中最简单的一种方式,即按照单个汉字进行切分。文本中的每一个汉字都被视为一个独立的 token。
由于汉字本身通常具有独立的语义,因此字符级分词在中文中具备天然的可行性。相比英文中的字符分词,中文的字符分词更加"语义友好"。
2. 词级分词
词级分词是将中文文本按照完整词语进行切分的传统方法,切分结果更贴近人类的阅读习惯。

由于中文没有空格等天然词边界,词级分词通常依赖词典 、规则 或模型来识别词语边界。
3. 子词级分词
虽然中文没有英文中典型的前缀、后缀、词根等子词结构,但子词分词算法(如 BPE)仍可直接应用于中文。它们以汉字为基本单位,通过学习语料中高频出现的字组合(如"自然"、"语言"、"处理"),自动构建子词词表。这种方式无需人工词典,具有较强的适应能力。

在当前主流的中文大模型(如通义千问、DeepSeek)中,子词分词已成为广泛采用的文本切分策略。
三、分词工具
目前市面上可用于中文分词的工具种类繁多,按实现方式可分为两大类:
- 基于词典或规则的传统方法 :以"词"为单位进行切分,代表工具包括 jieba 、HanLP 等
- 基于子词建模算法(如BPE) :从数据中自动学习高频组合,构建子词词表,代表工具包括 Hugging Face Tokenizer 、SentencePiece 、tiktoken 等
1. jieba 分词器
关于 jieba 库的详细介绍,可参考:
2. One-hot 编码
关于 One-hot 编码的详细介绍,可参考:
3. Word2Vec 词嵌入
3.1 Word2Vec 概述
Word2Vec 的设计理念源自分布假设(Distributional Hypothesis) ------即一个词的含义由它周围的词决定。

基于这一假设,Word2Vec 构建了一个简洁的神经网络模型,通过学习词与上下文之间的关系,自动为每个词生成一个能反映语义特征的稠密向量表示。
Word2Vec 提供了两种典型的模型结构:
| 模型 | 输入 | 输出 |
|---|---|---|
| CBOW(Continuous Bag-of-Words) | 上下文词(前后若干个词) | 预测目标中心词 |
| Skip-gram | 中心词 | 预测上下文词(前后若干个词) |


只要按照上述目标训练模型,就能得到语义化的词向量。
3.2 Word2Vec 原理
Word2Vec 不依赖人工标注,而是直接利用大规模原始文本(如书籍、新闻、网页等)作为数据源,从中自动构造训练样本。
由于两种模型的输入和输出都是词语,首先需要对原始文本进行分词 ,将连续文本转换为 token 序列。同时,模型无法直接处理文本符号,仍需将词语转换为 one-hot 编码,作为模型的输入和输出进行计算。

Skip-Gram
训练样本
Skip-Gram 的目标是根据中心词预测上下文,其训练样本格式为:

模型结构
Skip-Gram 模型结构如下:

Skip-Gram 模型损失值的计算流程如下:

前向传播过程:
- 输入中心词:以"地铁"为例,用 one-hot 向量表示
- 查找词向量 :将 one-hot 向量与参数矩阵
W相乘,取出"地铁"对应的词向量(W即为词向量矩阵,每一行对应一个词的向量) - 预测上下文 :将中心词向量与参数矩阵
W'相乘,得到对整个词表的预测得分 - Softmax 输出:得分通过 Softmax 转为概率分布,表示各词作为上下文的可能性
- 计算损失:与真实上下文词"乘坐"、"上班"进行比对,计算交叉熵损失并求和,得到总损失
在反向传播过程中,参数矩阵 W 中"地铁"对应的词向量会被更新。模型通过不断训练,逐步优化向量,最终得到具有语义的词向量。
CBOW
训练样本
CBOW 的目标是根据上下文预测中心词,其训练样本格式为:

模型结构
CBOW 模型结构如下:

CBOW 模型损失值的计算流程如下:

CBOW 前向传播过程:
- 输入上下文词:以"乘坐"、"上班"为例,每个词用 one-hot 向量表示
- 查找词向量 :每个 one-hot 向量与参数矩阵
W相乘,查出对应的词向量 - 平均上下文向量:将多个上下文词向量取平均,得到整体的上下文表示
- 预测中心词 :将平均后的上下文向量与参数矩阵
W'相乘,得到对整个词表的预测得分 - Softmax 输出:将得分输入 Softmax,得到每个词作为中心词的概率分布
- 计算损失:将预测结果与真实中心词"地铁"的 one-hot 向量进行比对,计算交叉熵损失
在反向传播过程中,参数矩阵 W 中"乘坐"和"上班"对应的词向量会被更新。模型通过不断训练,逐步优化这些向量,最终得到具有语义的词向量。
3.3 获取 Word2Vec 词向量
词向量的获取通常有两种方式:直接使用公开词向量 或 在自有语料上自行训练。
使用公开词向量
国内一些大公司提供了训练好的中文词向量,可从以下仓库下载:
词向量文件的通用格式如下:
<词汇总数> <向量维度>
word1 val11 val12 ... val1N
word2 val21 val22 ... val2N
...
可使用 KeyedVectors.load_word2vec_format() 加载词向量文件:
python
from gensim.models import KeyedVectors
model_path = 'sgns.weibo.word.bz2'
model = KeyedVectors.load_word2vec_format(model_path)
自行训练词向量
1. 准备语料
Word2Vec 的训练语料需要是已分词的文本序列:
python
sentences = [
['我', '每天', '乘坐', '地铁', '上班'],
['我', '每天', '乘坐', '公交', '上班']
]
2. 训练模型
Gensim 提供了便捷的 Word2Vec 训练 API:
python
from gensim.models import Word2Vec
model = Word2Vec(
sentences, # 已分词的句子序列
vector_size=100, # 词向量维度
window=5, # 上下文窗口大小
min_count=2, # 最小词频(低于将被忽略)
sg=1, # 1: Skip-Gram, 0: CBOW
workers=4 # 并行训练线程数
)
3. 保存词向量
python
model.wv.save_word2vec_format('my_vectors.kv')
4. 加载词向量
python
from gensim.models import KeyedVectors
my_model = KeyedVectors.load_word2vec_format('my_vectors.kv')
3.4 应用 Word2Vec 词向量
训练好的词向量通常用于初始化下游 NLP 任务的嵌入层。
在现代深度学习 NLP 模型中,嵌入层本质上是一个查找表(lookup table):输入是词在词汇表中的索引,输出是该词对应的向量表示。
嵌入层的参数矩阵通常有两种初始化方式:
| 方式 | 说明 |
|---|---|
| 随机初始化 | 向量随机生成,通过反向传播逐步学习 |
| 预训练词向量初始化 | 加载 Word2Vec 等预训练向量作为初始参数,可注入丰富语言知识,尤其在低资源任务中优势明显 |
加载预训练词向量后,可选择是否让嵌入层继续参与训练(即 fine-tune 或 freeze)。