-
文本预处理负责把"杂乱的文字"整理成"规整的语言单元";
-
文本表示负责把"规整的语言单元"转换成"模型可以计算的数字"。
第一部分:文本预处理

一、什么是文本预处理
现实中的文本通常不是干净、统一、可以直接送入模型的数据。
例如:
<p>今天天气真好!!!😊</p>
点击链接:https://xxx.com
我超喜欢NLP,666666~
里面同时存在:
- HTML标签;
- 网址;
- 表情符号;
- 重复标点;
- 中英文混合;
- 网络用语;
- 无意义重复字符;
- 大小写和编码差异。
文本预处理就是在正式建模前,根据任务需要,对这些内容进行清洗、规范化和切分,使数据更适合后续分析。页面给出的核心顺序是:
编码处理
↓
文本清洗
↓
分词
↓
词性标注
不过这个顺序不是绝对不变的。实际项目中应根据任务决定哪些信息保留、删除或转换。
二、文本清洗
文本清洗的目标不是单纯地"删得越多越好",而是:
删除与任务无关的噪声,同时保留可能影响模型判断的信息。
1. 编码格式统一
计算机中的文字需要通过字符编码保存。常见编码包括:
- UTF-8;
- GBK;
- ASCII;
- UTF-16。
不同文件如果使用不同编码,可能出现:
正常文字:自然语言处理
乱码文字:鑷劧璇█澶勭悊
因此处理多来源文本时,通常需要先检测编码,再统一转换成UTF-8。页面还提到,可使用编码检测工具,并对无法解码的字符选择替换或忽略。
需要注意的是,Python 3中的字符串在程序内部通常已经是Unicode。只有在读取文件、网络响应或二进制内容时,才需要特别处理编码问题。
示意代码:
python
from pathlib import Path
file_path = Path("data.txt")
try:
text = file_path.read_text(encoding="utf-8")
except UnicodeDecodeError:
text = file_path.read_text(encoding="gbk")
print(text)
2. HTML标签和网页结构清理
从网页抓取的文本经常带有HTML标签:
<p>这是<b>自然语言处理</b>课程</p>
模型真正需要的可能只是:
这是自然语言处理课程
可以使用正则表达式删除简单标签:
python
import re
text = "<p>这是<b>自然语言处理</b>课程</p>"
clean_text = re.sub(r"<[^>]+>", "", text)
print(clean_text)
输出:
这是自然语言处理课程
不过对于复杂网页,正则表达式并不总是可靠。因为网页中还可能包含脚本、样式、嵌套标签和隐藏元素,实际项目通常会使用HTML解析库提取正文。
页面将HTML标签、控制字符、特殊标点和表情符号列为常见清洗对象。
3. 网址、邮箱和用户标识处理
社交媒体文本中经常出现:
访问 https://example.com 获取资料
联系 test@example.com
@小明 你觉得怎么样?
这些内容不一定要全部删除,可以根据任务转换为特殊标记:
访问 <URL> 获取资料
联系 <EMAIL>
<USER> 你觉得怎么样?
这样做的好处是:
- 避免词表中出现大量不同网址;
- 保留"这里出现了一个网址"的结构信息;
- 降低数据稀疏程度。
示例:
python
import re
def replace_special_content(text: str) -> str:
text = re.sub(r"https?://\S+", "<URL>", text)
text = re.sub(
r"\b[\w.-]+@[\w.-]+\.\w+\b",
"<EMAIL>",
text
)
text = re.sub(r"@\S+", "<USER>", text)
return text
4. 表情符号不能盲目删除
原页面提到,表情可以被移除,也可以转换成文字描述。
例如:
这个产品太好用了!😊
这个产品太好用了!😡
两句话的文字部分基本相同,但表情传达的态度完全不同。
因此:
- 做情感分析时,表情通常应该保留或转换;
- 做正式文档分类时,表情可能价值不大;
- 做社交媒体分析时,表情往往是重要特征。
可以转换为:
这个产品太好用了!<开心>
这个产品太好用了!<愤怒>
这说明文本清洗的原则是:
任务需要的信息要保留,任务不需要的信息才删除。
5. 重复字符和非标准表达
网络文本中经常出现:
太好看了啊啊啊啊啊!!!!
哈哈哈哈哈哈哈哈
666666666
可以进行适度压缩:
太好看了啊啊!!
哈哈哈
666
但是不能过度压缩,因为重复本身可能表示情绪强度:
好
好!!
好啊啊啊啊!!!
三者的情绪程度并不相同。
一种比较温和的处理方式是,把连续出现过多次的字符压缩到固定次数:
python
import re
def reduce_repeated_chars(text: str) -> str:
# 相同字符连续出现3次以上时,保留3次
return re.sub(r"(.)\1{2,}", r"\1\1\1", text)
6. 大小写和全半角统一
英文文本中常将字母统一为小写:
NLP
Nlp
nlp
统一后:
nlp
nlp
nlp
这样可以避免模型把它们当作三个不同词。
但某些任务中大小写具有意义:
US:美国
us:我们
Apple:公司名
apple:水果
因此在命名实体识别中,不一定适合全部转成小写。
中文数据还可能混合全角和半角字符:
123ABC
123ABC
可以统一成半角格式,避免同一内容被当成不同符号。
7. 数字和日期规范化
相同含义可能存在不同写法:
2026年8月4日
2026-08-04
2026/08/04
08/04/2026
可以根据任务统一成:
2026-08-04
数字也可以根据业务需求转换:
价格是2999元
价格是3,000元
价格约三千元
在价格分析中应尽量保留具体数字;在普通主题分类中,也可以转换为:
价格是<NUMBER>元
原页面将数字表示和日期格式统一归入噪声处理与规范化步骤。
8. 拼写和错别字处理
英文可能出现:
langauge → language
recieve → receive
中文可能出现:
自然语音处理 → 自然语言处理
人工只能 → 人工智能
纠错有两类风险:
第一,模型可能把正确的专业词误改掉。
第二,某些"错误写法"可能是用户真实的表达习惯,例如网络用语、品牌名或缩写。
因此,专业项目通常会建立:
- 专业词典;
- 自定义纠错表;
- 白名单;
- 高频错误映射表。
例如:
python
correction_map = {
"人工只能": "人工智能",
"自然语音处理": "自然语言处理"
}
for wrong, correct in correction_map.items():
text = text.replace(wrong, correct)
三、分词与Tokenization
1. 什么是Token
Token不一定等于传统意义上的"单词"。
它可以是:
- 一个汉字;
- 一个词;
- 一个子词;
- 一个标点;
- 一个特殊符号;
- 一个数字片段。
例如:
自然语言处理很有趣
按词切分:
自然语言 / 处理 / 很 / 有趣
按字切分:
自 / 然 / 语 / 言 / 处 / 理 / 很 / 有 / 趣
按子词模型切分后,还可能出现另一种结果。
分词本质上是把连续文本转换成模型能够逐个处理的基本单元。
2. 英文分词
英文单词之间通常有空格,因此表面上较容易切分:
Natural Language Processing is fascinating!
结果可能为:
Natural
Language
Processing
is
fascinating
!
但英文分词仍然存在复杂情况。
缩写
I'm
don't
can't
可能被拆成:
I + 'm
do + n't
ca + n't
连字符
state-of-the-art
可能作为一个整体,也可能拆分成多个部分。
多词表达
New York
machine learning
natural language processing
虽然由多个词组成,但整体上又表示一个固定概念。
所以英文分词并不只是简单调用:
text.split()
原页面以NLTK为例,并提醒需要处理缩写、连字符以及固定短语。
3. 中文分词

中文没有天然空格:
南京市长江大桥
可能切分为:
南京市 / 长江大桥
如果切分不当,也可能得到:
南京 / 市长 / 江大桥
页面将中文分词方法概括为三类。
基于词典的方法
系统先准备一个词典,然后在句子中寻找词典里的词。
常见思想包括:
- 正向最大匹配;
- 逆向最大匹配;
- 双向最大匹配;
- 最短路径。
例如:
研究生命起源
可能出现:
研究 / 生命 / 起源
也可能错误切成:
研究生 / 命 / 起源
这种方法速度快、容易理解,但对新词和歧义比较敏感。
基于统计的方法
把分词看作序列标注任务。
例如给每个字标注:
B:一个词的开头
M:词语中间
E:词语结尾
S:单独成词
句子:
自然语言处理
可以标记为:
自 B
然 M
语 M
言 E
处 B
理 E
常用统计模型包括HMM和CRF。
基于深度学习的方法
模型通过大量标注数据自动学习分词规律,例如:
- BiLSTM-CRF;
- Transformer;
- BERT类模型。
这类方法对上下文和歧义的处理通常更强,但训练与部署成本也更高。
4. 子词切分
现代预训练模型经常不直接以完整单词为最小单位,而是使用子词。
例如英文单词:
unbelievable
可能被拆成:
un
believ
able
这样做主要是为了处理两个问题:
词表不能无限大
如果把所有完整单词都放入词表,新词、专业词、变形词会不断增加。
未登录词问题
某个完整单词虽然没在训练词表中出现,但它的组成部分可能出现过。
例如:
microcomputerization
模型可能不认识完整词,但可以通过多个子词组合进行表示。
原页面介绍了三种常见子词方法:
- BPE:不断合并高频符号对;
- WordPiece:根据语言模型或似然标准选择子词;
- Unigram Language Model:先建立较大候选词表,再逐步删除贡献较低的子词。
需要注意:
分词器必须与模型一致。
例如,一个BERT模型在预训练时使用了特定词表和分词规则,使用该模型时不能随意替换成另一个分词器。
5. 常见工具如何选择
原页面列出了NLTK、spaCy、jieba、Stanford CoreNLP和Hugging Face Tokenizers等工具,并从语言、速度和使用场景进行了比较。
可以简单理解为:
| 工具 | 更适合的任务 |
|---|---|
| jieba | 中文入门、关键词提取、简单分词 |
| NLTK | 英文教学、语言学实验 |
| spaCy | 英文和多语言工程项目 |
| CoreNLP | 传统完整NLP流水线 |
| Hugging Face Tokenizers | BERT、GPT等预训练模型 |
| HanLP、THULAC等 | 中文分词、词性、实体和句法任务 |
四、停用词处理
停用词通常是频率很高、区分能力较弱的词,例如:
的、了、是、在、和
the、is、of、and
删除后:
原句:我非常喜欢自然语言处理的课程
结果:喜欢 / 自然语言处理 / 课程
不过停用词不能机械删除。
例如情感分析句子:
这个产品不好用
删除"不"后:
这个产品好用
意思完全反转。
再如:
我不讨厌这个功能
其中"不"同样影响最终情感。
因此:
- 词袋、TF-IDF、主题模型中经常去除停用词;
- BERT、GPT等预训练模型通常保留完整句子;
- 情感分析应谨慎处理否定词;
- 问答和机器翻译通常不能随意删词。
原页面正文主要聚焦清洗、分词和词性标注;停用词更适合作为实际预处理流程中的任务相关步骤,而不是固定必须执行的操作。
五、词性标注
1. 什么是词性标注
词性标注是在完成分词后,为每个Token标记语法类别。
例如:
小明 喜欢 学习 人工智能
标注为:
小明 人名或名词
喜欢 动词
学习 动词
人工智能 名词
英文示例:
Natural Language Processing is fascinating.
可能标注为:
Natural 形容词
Language 名词
Processing 名词
is 动词
fascinating 形容词
词性标注有助于分析句子结构、判断词义,并为句法分析、实体识别等任务提供基础。
2. 为什么词性依赖上下文
同一个词可能有不同词性。
例如"研究":
这是一个重要的研究。
这里的"研究"是名词。
我们正在研究这个问题。
这里的"研究"是动词。
因此词性不能只通过查词典决定,还要结合前后文。
3. 常见词性体系
英文常见Penn Treebank标签包括:
NN 名词
VB 动词
JJ 形容词
RB 副词
PRP 代词
中文工具常使用类似:
n 名词
v 动词
a 形容词
d 副词
r 代词
不同工具的标签体系可能不完全相同,因此实际使用时需要先查看工具文档。
4. 词性标注方法
词性标注的发展可以概括为:
人工规则
↓
统计模型
↓
神经网络
↓
预训练Transformer
基于规则的方法依赖词典和人工规则;统计方法包括HMM和最大熵模型;深度学习方法则使用RNN或Transformer自动学习上下文特征。页面也将方法概括为规则、统计和深度学习三类。
5. 如何评价标注效果
常见指标包括:
- 总体准确率;
- 未登录词准确率;
- 混淆矩阵。
未登录词准确率尤其重要,因为模型往往更容易正确标注训练时见过的词,而真正困难的是:
- 新人名;
- 新产品名;
- 专业术语;
- 网络新词。
页面将Accuracy、OOV Accuracy和混淆矩阵列为词性标注的主要评价方式。
六、完整预处理示例
原始文本:
<p>今天的NLP课程真滴太有趣啦!!!😊</p>
资料:https://example.com
第一步:删除HTML标签
今天的NLP课程真滴太有趣啦!!!😊
资料:https://example.com
第二步:替换网址
今天的NLP课程真滴太有趣啦!!!😊
资料:<URL>
第三步:规范化表达
今天的NLP课程真的太有趣了!<开心>
资料:<URL>
第四步:中文分词
今天 / 的 / NLP / 课程 / 真的 / 太 / 有趣 / 了 / ! / <开心>
资料 / : / <URL>
第五步:词性标注
今天 时间词
的 助词
NLP 专有名词
课程 名词
真的 副词
太 副词
有趣 形容词
了 助词
第六步:根据任务决定是否去停用词
如果做传统文本分类,可以考虑删除部分助词。
如果使用BERT进行情感分析,通常保留完整句子,让模型自己判断上下文关系。
第二部分:文本表示方法

七、为什么需要文本表示
完成清洗和分词后,我们得到的仍然是文字:
自然语言处理
但机器学习模型需要的是数值:
[0.21, -0.35, 0.87, 0.14, ...]
文本表示就是把字符、词语、句子或文档映射成向量。
理想的表示应尽量保存:
- 哪些词出现过;
- 词出现了多少次;
- 词语顺序;
- 词语之间的关系;
- 句子表达的语义;
- 上下文中的真实含义。
文本表示页面按照传统表示、词向量、上下文表示和文档级表示展开。
八、词袋模型

1. 基本思想
词袋模型把一篇文本看成装着若干词语的袋子。
假设有两句话:
句子1:我 喜欢 NLP
句子2:我 学习 NLP
建立词表:
[我, 喜欢, 学习, NLP]
句子1表示为:
[1, 1, 0, 1]
句子2表示为:
[1, 0, 1, 1]
每一个位置对应一个词,数字表示该词出现的次数。
词袋模型只关心词语是否出现或出现多少次,不考虑它们的位置。
2. 词袋模型的问题
下面两个句子:
小明喜欢小红
小红喜欢小明
词袋表示可能完全一样,因为都包含:
小明、喜欢、小红
但两句话表达的关系不同。
因此词袋模型的主要问题是:
- 丢失词序;
- 丢失语法结构;
- 无法区分同义词;
- 无法处理一词多义;
- 词表大时向量非常稀疏。
Stanford信息检索资料也指出,词袋向量会丢失词语的相对顺序,因此语序不同的句子可能得到相同表示。
3. 什么是稀疏向量
假设词表有10000个词,一句话只出现10个词。
那么它的向量中可能只有10个非零值:
[0, 0, 0, 1, 0, 0, ..., 2, ..., 0]
绝大多数位置都是0,这种表示称为高维稀疏表示。
它虽然容易解释,但会带来:
- 内存占用;
- 计算效率问题;
- 特征维度过高;
- 语义表达能力弱。
九、TF-IDF

1. 为什么需要TF-IDF
词袋模型中,所有词只是按次数统计。
但有些词虽然出现很多,却不一定重要:
的、了、是、and、the、is
而某些词在一篇文档中出现较多,在其他文档中很少出现,通常更能代表该文档的主题。
TF-IDF就是用来衡量一个词对某篇文档的区分能力。
2. TF
TF表示某个词在当前文档中的频率。
一种简单形式为:

例如,一篇文档共有100个词,"人工智能"出现5次:

3. IDF
IDF表示一个词在整个文档集合中的稀有程度:

假设有1000篇文档:
- "的"出现在990篇中;
- "Transformer"出现在20篇中。
那么"Transformer"的IDF会更大,因为它更有区分能力。
4. TF-IDF
最终权重为:

也就是:
在当前文档中出现得多,同时在其他文档中出现得少,权重就高。
页面给出了TF、IDF和二者相乘的基本计算关系。
5. TF-IDF的局限
TF-IDF仍然只是在统计词的重要程度,并不真正理解词义。
例如:
汽车
轿车
车辆
它们语义相近,但TF-IDF会把它们当作三个完全独立的维度。
因此TF-IDF适合:
- 关键词提取;
- 文本分类基线;
- 信息检索;
- 文档相似度初步计算。
但不适合要求深入语义理解的任务。
十、N-gram表示

N-gram通过连续的n个Token组成新特征,从而保留部分局部顺序。
句子:
我 喜欢 自然语言处理
Unigram
我
喜欢
自然语言处理
Bigram
我 喜欢
喜欢 自然语言处理
Trigram
我 喜欢 自然语言处理
N-gram可以区分:
不 好
好
也可以保留固定搭配:
机器 学习
自然 语言
人工 智能
但n越大,可能组合出的特征越多,导致维度迅速增加,而且它只能捕获局部范围内的顺序,仍然难以处理跨越很远的依赖关系。
十一、Word2Vec

1. 核心思想
Word2Vec不再为每个词构建一个巨大稀疏向量,而是把词映射为较低维的稠密向量:
苹果 → [0.23, -0.41, 0.72, ...]
香蕉 → [0.20, -0.38, 0.69, ...]
电脑 → [-0.61, 0.17, 0.08, ...]
因为"苹果"和"香蕉"经常出现在类似上下文中,它们的向量通常会更接近。
Word2Vec论文提出了两种高效学习连续词向量的模型架构,并通过上下文预测任务学习词语的语义和句法规律。
2. CBOW
CBOW的目标是:
根据周围的词,预测中间的词。
例如:
我 喜欢 ___ 语言 处理
根据上下文,模型预测:
自然
示意:
上下文词
我、喜欢、语言、处理
↓
神经网络
↓
预测中心词"自然"
CBOW通常训练速度较快,对高频词表现较稳定。
3. Skip-gram
Skip-gram的目标相反:
根据当前词,预测它周围可能出现的词。
中心词:
自然语言处理
预测上下文:
人工智能
分词
文本
模型
语义
示意:
中心词
自然语言处理
↓
神经网络
↓
预测周围上下文
页面将CBOW概括为用上下文预测当前词,将Skip-gram概括为用当前词预测上下文。
4. 静态词向量的局限
在Word2Vec中,一个词通常只有一个固定向量。
例如"苹果":
我吃了一个苹果。
苹果发布了新手机。
第一句中的"苹果"是水果,第二句是公司,但传统Word2Vec通常为它们使用同一个向量。
这就是静态词向量的主要局限:
同一个词在不同上下文中的表示不会动态变化。
十二、GloVe

GloVe同样学习词向量,但它更强调整个语料库中的全局词语共现统计。
例如:
- "冰"和"固体"经常共同出现;
- "蒸汽"和"气体"经常共同出现;
- "冰"和"水"也经常共同出现;
- "蒸汽"和"水"也经常共同出现。
通过比较不同词的共现关系,模型可以学习某些语义差异。
更准确地说,GloVe使用加权最小二乘目标,使词向量内积与词语共现次数的对数之间建立联系,同时加入偏置项。它结合了全局共现矩阵和局部上下文窗口的思想。
可以简单区分:
| 模型 | 主要依据 |
|---|---|
| Word2Vec | 局部上下文窗口中的预测任务 |
| GloVe | 全局词---词共现统计 |
| FastText | 字符子词信息 |
十三、FastText

FastText不是只把完整单词看成一个不可再分的单位,而是把词拆成字符级n-gram。页面强调,它能够利用子词信息处理未登录词,并且适合形态变化丰富的语言。
例如:
playing
played
player
它们都包含部分相似字符结构:
play
lay
pla
ing
ed
er
因此,即使某个完整单词没有在训练语料中出现,FastText仍然可能根据组成它的字符片段计算向量。
它适合:
- 拼写变化较多的文本;
- 词形丰富的语言;
- 专业词和新词;
- 数据量相对有限的场景。
十四、ELMo:上下文相关词向量
ELMo开始让同一个词根据句子上下文产生不同表示。
例如:
我去银行办理业务。
河流两边都有河岸。
英语中两个"bank"含义不同,ELMo会利用左右上下文为它们生成不同向量。
页面将ELMo的特点概括为:
- 使用双向LSTM语言模型;
- 表示依赖整个输入句子;
- 可以组合不同层次的内部表示。
与Word2Vec相比:
Word2Vec:
一个词 → 一个固定向量
ELMo:
一个词 + 当前句子 → 当前语境下的向量
十五、BERT表示
1. BERT解决了什么
BERT使用Transformer编码器,同时利用一个词左右两边的信息生成表示。
例如:
苹果很好吃。
苹果发布了新设备。
BERT会根据完整上下文,让两个"苹果"得到不同向量。
BERT论文将其描述为深层双向Transformer语言表示模型,可以在预训练后通过较小的任务层改造应用于问答、自然语言推断等任务。
2. 掩码语言模型
训练时随机遮住部分词:
我喜欢学习[MASK]语言处理。
模型需要预测:
自然
由于被遮住词的左侧和右侧都可见,模型能够学习双向上下文。
3. 预训练和微调
现代预训练模型常采用:
大规模通用语料预训练
↓
学习通用语言知识
↓
在具体任务数据上微调
↓
完成分类、NER、问答等任务
例如:
- 先用海量文本学习语言规律;
- 再用少量情感数据训练情感分类;
- 或用医学文本训练医疗实体识别。
页面将现代NLP概括为"预训练+微调"的范式。
4. BERT的输出是什么
假设输入被切成5个Token:
[CLS] 我 喜欢 NLP [SEP]
模型可能为每个Token输出一个768维向量:
输出形状:
[批次大小, Token数量, 隐藏层维度]
例如:
[1, 5, 768]
这意味着BERT并不是只输出一个句子向量,而是输出每个Token在当前上下文中的表示。
5. 如何得到句向量
常见方法包括:
取CLS位置
[CLS]位置向量 → 句子表示
对所有Token取平均
句向量 = 所有有效Token向量的平均值
使用Sentence-BERT
Sentence-BERT专门使用孪生或三元组结构训练语义句向量,使句子可以直接通过余弦相似度比较,更适合语义检索、聚类和相似句查找。
因此,补充理解是:
普通BERT主要产生上下文Token表示;Sentence-BERT更专门用于产生可比较的句子级向量。
十六、Doc2Vec
Doc2Vec是Word2Vec在文档级别的扩展。
Word2Vec学习:
词 → 向量
Doc2Vec学习:
整篇文档 → 向量
原页面介绍了两种结构:
- PV-DM:类似CBOW,并加入文档ID;
- PV-DBOW:类似Skip-gram,通过文档表示预测词。
Doc2Vec适合:
- 文档分类;
- 文档相似度;
- 推荐系统;
- 聚类。
但面对上下文语义要求较高的现代任务,Sentence-BERT等预训练句向量通常更常见。
十七、词向量平均与SIF
假设一句话包含三个词向量:
我 → v₁
喜欢 → v₂
NLP → v₃
最简单的句向量可以是:

这种方法简单快速,但把所有词看得同样重要。
SIF会降低高频词的权重,提高信息量较大词语的贡献。原页面把词向量平均、SIF、BERT句向量和Sentence-BERT列为常见句子与文档向量方法。
十八、LDA主题表示
LDA不是直接为每个词学习向量,而是把一篇文档表示为多个主题的概率组合。
假设有三个主题:
主题1:人工智能
主题2:体育
主题3:财经
某篇文档可能表示为:
人工智能:0.75
体育:0.05
财经:0.20
而每个主题又是多个词的概率分布:
人工智能主题:
模型 0.20
算法 0.18
神经网络 0.15
数据 0.10
页面将LDA描述为无监督主题模型:文档是主题的混合,主题是词的概率分布,可通过变分推断或Gibbs采样学习,并可用于聚类、推荐和摘要。
需要注意,LDA里的"主题"通常没有人工名称。模型输出的是一组高概率词,需要人根据这些词判断主题含义。
十九、各种文本表示方法对比
| 方法 | 是否保留词序 | 是否理解语义 | 向量特点 | 适合场景 |
|---|---|---|---|---|
| 词袋模型 | 否 | 否 | 高维、稀疏 | 简单分类、基线实验 |
| TF-IDF | 否 | 很弱 | 高维、稀疏 | 搜索、关键词、传统分类 |
| N-gram | 局部保留 | 较弱 | 维度更高 | 短语识别、传统分类 |
| Word2Vec | 通过上下文学习 | 有一定能力 | 低维、稠密、静态 | 词相似度、传统神经网络 |
| GloVe | 通过共现学习 | 有一定能力 | 低维、稠密、静态 | 通用词向量 |
| FastText | 包含子词信息 | 有一定能力 | 低维、稠密、静态 | 新词、词形变化 |
| ELMo | 是 | 较强 | 上下文动态表示 | 上下文词义 |
| BERT | 是 | 强 | 上下文Token向量 | 分类、NER、问答 |
| Sentence-BERT | 是 | 强 | 句子级稠密向量 | 检索、聚类、相似度 |
| Doc2Vec | 部分学习 | 一般 | 文档级向量 | 文档分类与相似度 |
| LDA | 不直接处理顺序 | 主题层面 | 主题概率分布 | 主题发现、文档聚类 |
文本表示页面将技术发展概括为:从简单统计表示,发展到静态词向量,再到上下文相关表示和文档级表示;方法选择需要综合考虑任务、数据规模、资源和语言特点。
二十、实际项目中怎么选择
1. 小数据、希望快速得到结果
可以使用:
清洗
→ 分词
→ TF-IDF
→ 逻辑回归或SVM
适合:
- 新闻分类;
- 垃圾邮件识别;
- 简单情感分类;
- 快速建立基线模型。
2. 需要计算词语相似度
可以使用:
Word2Vec
GloVe
FastText
如果数据中有大量专业新词、拼写变化或词形变化,可以优先考虑FastText。
3. 需要理解上下文
可以使用:
BERT及其变体
适合:
- 命名实体识别;
- 文本分类;
- 阅读理解;
- 关系抽取;
- 情感分析。
4. 需要句子检索和知识库召回
可以使用:
Sentence-BERT类句向量模型
流程为:
知识库文档
↓
切分成文本块
↓
转换成向量
↓
存入向量数据库
用户问题
↓
转换成向量
↓
查找最相似文本块
↓
交给大模型生成答案
这就是很多RAG知识库问答系统中的检索基础。
5. 需要发现文档主题
可以使用:
词袋或TF-IDF
↓
LDA主题模型
↓
得到文档---主题概率
适合:
- 新闻主题发现;
- 用户评论聚类;
- 文献主题分析;
- 大规模文档探索。
二十一、两个页面合并后的完整流程
以评论情感分析为例:
原始评论
"这个APP真好用!!!😊 http://xxx.com"
↓
编码统一
全部转换为UTF-8
↓
文本清洗
网址替换为<URL>
重复标点压缩
表情转换为<开心>
↓
规范化
统一大小写、全半角和特殊符号
↓
分词或子词切分
这个 / APP / 真 / 好用 / <开心>
↓
根据模型选择文本表示
├─ TF-IDF
├─ Word2Vec
└─ BERT向量
↓
分类模型
正面 / 负面 / 中性
↓
输出
正面情感
核心区别是:
文本预处理回答:
"文本要被整理成什么样?"
文本表示回答:
"整理后的文本怎样转换成数字?"
模型训练回答:
"怎样根据这些数字完成预测?"
二十二、容易出现的误区
误区一:所有符号都应该删除
错误。问号、感叹号、表情、否定词都可能影响情感和意图。
误区二:停用词一定要删除
错误。使用BERT、GPT等上下文模型时,通常应保留完整语言结构。
误区三:中文一定要先用jieba分词
错误。传统模型可能需要jieba分词,但BERT等模型应使用自身配套的Tokenizer。
误区四:TF-IDF能够理解语义
TF-IDF只能衡量统计重要性,不能真正识别同义词和多义词。
误区五:Word2Vec能够解决所有词义问题
Word2Vec是静态词向量,同一个词在不同句子中通常仍使用相同表示。
误区六:直接取BERT的CLS就一定是最佳句向量
CLS可以作为基线,但语义搜索和句子相似度任务通常应考虑专门训练的句向量模型,例如Sentence-BERT。
二十三、最终知识框架
一、文本预处理
│
├─ 1. 编码处理
│ ├─ 检测编码
│ ├─ 统一UTF-8
│ └─ 处理无法解码字符
│
├─ 2. 文本清洗
│ ├─ HTML标签
│ ├─ URL和邮箱
│ ├─ 控制字符
│ ├─ 特殊标点
│ ├─ 重复字符
│ ├─ 表情符号
│ └─ 广告与无关信息
│
├─ 3. 文本规范化
│ ├─ 大小写
│ ├─ 全角半角
│ ├─ 数字格式
│ ├─ 日期格式
│ └─ 拼写与错别字
│
├─ 4. Tokenization
│ ├─ 英文分词
│ ├─ 中文分词
│ │ ├─ 词典方法
│ │ ├─ 统计方法
│ │ └─ 深度学习方法
│ └─ 子词切分
│ ├─ BPE
│ ├─ WordPiece
│ └─ Unigram
│
├─ 5. 停用词处理
│ └─ 根据具体任务决定
│
└─ 6. 词性标注
├─ 规则方法
├─ 统计方法
└─ 深度学习方法
二、文本表示
│
├─ 1. 传统统计表示
│ ├─ 词袋模型
│ ├─ TF-IDF
│ └─ N-gram
│
├─ 2. 静态词向量
│ ├─ Word2Vec
│ │ ├─ CBOW
│ │ └─ Skip-gram
│ ├─ GloVe
│ └─ FastText
│
├─ 3. 上下文表示
│ ├─ ELMo
│ └─ BERT及其变体
│
├─ 4. 句子与文档表示
│ ├─ 词向量平均
│ ├─ SIF
│ ├─ BERT池化
│ ├─ Sentence-BERT
│ └─ Doc2Vec
│
└─ 5. 主题表示
└─ LDA
最重要的理解是:
原始文本不能直接被传统机器学习模型计算。文本预处理先改善数据质量,文本表示再把语言转成数值特征,而表示方法决定了模型能够保留多少词频、顺序、结构和语义信息。