NLP文本预处理与文本表示:知识点总结与详细讲解

  • 文本预处理负责把"杂乱的文字"整理成"规整的语言单元";

  • 文本表示负责把"规整的语言单元"转换成"模型可以计算的数字"。

第一部分:文本预处理

一、什么是文本预处理

现实中的文本通常不是干净、统一、可以直接送入模型的数据。

例如:

复制代码
<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

最重要的理解是:

原始文本不能直接被传统机器学习模型计算。文本预处理先改善数据质量,文本表示再把语言转成数值特征,而表示方法决定了模型能够保留多少词频、顺序、结构和语义信息。

相关推荐
水如烟1 小时前
孤能子视角:LLM是续指代投器——从“续指论”与“代投机制”看大语言模型的本质定位
人工智能
BerryS3N1 小时前
2026年AI前沿技术全景深度解析:大模型推理范式变革、Agentic AI工程架构与底层基础设施演进
人工智能·架构
天天爱吃肉82181 小时前
【重磅发布:拿下新超仁达代理权 】
大数据·人工智能·python·功能测试·汽车
HIT_Weston1 小时前
167、【Agent】【OpenCode】TuiThreadCmd(EvenSource)
人工智能·agent·opencode
TunerT_TQ1 小时前
Valhalla 静态工程审阅 #022|百度PaddlePaddle 源码证据驱动评测【大厂开源基础设施特辑】
人工智能·百度·开源·paddlepaddle·#深度学习·#飞桨
spter。1 小时前
AI 面试相同请求为什么会重复调用,如何解决
人工智能·面试·职场和发展
阿里云大数据AI技术1 小时前
基于阿里云EMR Serverless StarRocks AI Function和混合检索,构建智驾训练数据管理平台
人工智能
evans在进步2 小时前
Spring AI 从入门到实战:用 Java 实现大模型对话与 Tool Calling
java·人工智能·spring
智塑未来2 小时前
发那科又叫法兰克?译名误区拆解,数控自动化龙头全维度解析
大数据·人工智能·自动化
网易云信2 小时前
立即下载!帝王蟹(ClawHive)桌面客户端正式上线!
人工智能·agent