本章为AI算法自然语言处理入门实战,重点学习文本数字化核心方案:词袋模型(BOW)与 TF-IDF 权重算法。
结合课堂代码运行结果,深度拆解矩阵输出规则、权重计算逻辑,解决新手常见理解误区,夯实NLP基础。


📑 一、学习前言

计算机无法直接识别汉字、文本等非结构化数据,想要让模型处理文本、做分类、相似度计算、情感分析,第一步必须将文本转为数字向量
本节课学习两种最经典的文本向量化方式:

  1. 词袋模型 BOW:基于单词计数的简单文本特征提取
  2. TF-IDF:结合词频与全局权重的进阶文本特征提取,工业级常用方案

💻 二、课堂完整实战代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# 导入需要的库
# pandas:数据处理工具(本次辅助使用)
import pandas as pd
# CountVectorizer:实现词袋模型,统计单词出现次数
# TfidfVectorizer:实现TF-IDF算法,计算单词重要性权重
from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer

# ======================
# 1. 定义文本语料库
# 所有待处理的中文句子,空格分隔单词(分词后的格式)
# 索引从0开始:第0行到第4行,共5句话
# 核心规则:计算机从(0,0)位置开始计数,所有句子共用统一词汇表
# 补充句子:今天 今天 今天 用于测试TF-IDF权重规则
# ======================
corpus = [
'今天 天气 真好',
'今天 天气 不好',
'你的 心情 真好',
'今天 心情 不好',
'今天 今天 今天'
]

# ======================
# 2. 词袋模型(BOW)实现
# 核心思想:只统计单词出现次数,不考虑语序、语法、重要性
# ======================
# 创建词袋模型实例
Vectorizer_bow = CountVectorizer()
# fit_transform:两步合一
# fit:学习所有文本,生成固定词汇表(去重+排序)
# transform:将每句话转换为数字矩阵
X_bow = Vectorizer_bow.fit_transform(corpus)

# 输出词汇表:所有句子去重后的单词,固定排序
print("===== 词袋模型结果 =====")
print("词汇表:", Vectorizer_bow.get_feature_names_out())
# 稀疏矩阵:只存储非0数字,节省内存
print("稀疏矩阵表示: \n", X_bow)
# 稠密矩阵:完整展示所有数字(0和非0),方便查看
print("稠密矩阵表示: \n", X_bow.toarray())

# ======================
# 3. TF-IDF模型实现
# 核心思想:物以稀为贵,过滤高频无用词,突出关键词
# TF(词频):句子内出现越多越重要
# IDF(逆文档频率):全局出现越多越不重要
# ======================
# 创建TF-IDF模型实例
vectorizer_tfidf = TfidfVectorizer()
# 同词袋模型:生成词汇表+转换文本为权重矩阵
X_tfidf = vectorizer_tfidf.fit_transform(corpus)

# 输出TF-IDF结果
print(f"\n===== TF-IDF结果 =====")
print("词汇表 :", vectorizer_tfidf.get_feature_names_out())
# 权重矩阵保留2位小数,方便查看
print(f"TF-IDF的权重矩阵:\n", X_tfidf.toarray().round(2))

📚 三、核心工具基础概念

  1. CountVectorizer 词袋模型
    核心逻辑:忽略语序、忽略语法,只统计每个词语在单条文本中出现的次数
    fit:遍历全部文本,自动分词、去重,生成全局统一词汇表
    transform:根据固定词汇表,将每一句话转为数字向量
    输出结果:纯整数,代表单词出现频次

  2. TfidfVectorizer TF-IDF 模型
    TF-IDF 由两部分组成:
    TF 词频:单个词语在当前句子中出现的频率,出现越多权重越高
    IDF 逆文档频率:词语在全部文本中出现越泛滥、越通用,权重越低
    核心思想:物以稀为贵,抑制高频无用词,突出句子专属关键词
    输出结果:0~1 之间小数,代表词语重要性权重

🔤 四、全局词汇表规则解析
程序运行后自动生成统一词汇表,固定排序:[‘不好’, ‘今天’, ‘你的’, ‘天气’, ‘心情’, ‘真好’]
关键核心规则
所有句子共用同一套词汇表
词汇表有多少个词,最终矩阵就有多少固定列
单条句子中没有出现的词语,对应位置自动补 0
矩阵列数 ≠ 句子单词数,而是全部文本去重后的总单词数

📊 五、运行结果深度拆解

  1. 词袋模型输出特点
    矩阵数值为整数,直观展示每个词出现多少次
    缺陷:高频通用词(如「今天」)次数过高,会掩盖句子真实特征
  2. TF-IDF 权重矩阵逐行分析
    文本内容TF-IDF 权重向量核心解读
    今天 天气 真好今天权重偏低(全局高频);天气、真好权重更高,区分度更强
    今天 天气 不好通用词权重被压低,差异化词语权重提升
    你的 心情 真好「你的」仅单独出现,稀有度最高,全局权重峰值 0.66
    今天 心情 不好平衡通用词与小众词权重分布
    今天 今天 今天整段文本只有一个词汇,归一化后该词权重直接为 1.0

重点难点解答:第五行为什么是 [0. 1. 0. 0. 0. 0.]
全局词汇表一共 6 个词,矩阵必须固定 6 列,缺一不可
该句子只包含「今天」,其余 5 个词语均未出现,全部补 0
TF-IDF 默认开启向量归一化,单词语独占整段文本时,权重归一化为满分 1.0
通俗理解:所有单词统一占位,没出现就填 0,出现就按重要性打分

模型核心思想输出优点缺点
词袋 BOW只看词出现次数整数简单直观常见词权重过高
TF-IDF词频 × 逆文档频率0~1 小数突出关键词、过滤废话词计算稍复杂

📚 学习心得
这节内容是 NLP 入门最关键的一步:把文字变成计算机能计算的数字。
通过实战我真正理解了:
所有句子共用固定词汇表,按位置填空
词袋模型只计数,TF-IDF 看重要性
越稀有的词,权重越高,越能代表句子特征
矩阵的列数 = 词汇表大小,不是句子词数
把文本向量化搞懂,后面文本分类、情感分析、关键词提取就都通了!