目录
简介
一、词向量转换相关概念
二、算法应用
完整案例演示:词频向量化过程
1. 导入工具库(类)
2. 准备文本数据
3. 初始化向量化器(关键参数说明)
4. 拟合转换文本数据
5. 解析稀疏矩阵输出
6. 获取特征名称(词汇表)
7. 转换为稠密矩阵(直观展示)
8. 完整对照表
关键结论
三、案例分析(中文文本情感分类的前期数据处理与特征工程流程)
1.数据集
2.整体功能概述
3.代码分步详解
简介
jieba库、朴素贝叶斯算法和TF-IDF值是自然语言处理(NLP)中常用的工具和技术,各自在文本处理的不同阶段发挥作用。 在自然语言处理的世界里,如何让计算机 “读懂” 人类语言一直是核心难题,而词向量转换正是破解这一难题的关键钥匙。本次机器学习专题,我们就来深入探讨这一基础又核心的技术。词向量转换的本质,是将文本中离散的词语转化为连续的数值向量。这一步看似简单,却实现了从 “机器无法理解的文字” 到 “可计算的数字” 的跨越,为后续的文本分类、情感分析、机器翻译等任务铺平了道路。
一、词向量转换相关概念
1.为什么需要词向量转换
人类语言丰富多样,单词具有语义、语法和语境等多重信息。但计算机擅长处理数值数据,原始文本无法直接被计算机理解和分析。词向量转换通过将单词转换为数值向量,把语言信息编码成计算机能处理的形式。这样,计算机可以利用这些向量进行计算,从而挖掘文本中的有用信息,实现对文本的理解和处理。
2.词向量转换的分类
特征提取库中导入向量转化模块,自然语言转换成数据的形式,才能保证模型进行训练。
- 1、基于统计的方法 统计每个单词在这句话中出现的次数
- 2、基于神经网络模型训练的方法
今天讲述的是基于统计的方法进行词向量转换,第二种要利用深度学习的知识,后面再说。
二、算法应用
我们以一个小例子来说明理解词向量转换的代码过程
完整案例演示:词频向量化过程
1. 导入工具库(类)
from sklearn.feature_extraction.text import CountVectorizer
CountVectorizer(词频向量化器)类,是用于将文本转换为词频向量的工具,详细参数如下:
CountVectorizer(
input='content', # 输入类型:'content'(直接文本)、'filename'(文件路径)、'file'(文件对象)
encoding='utf-8', # 文本编码格式
decode_error='strict', # 解码错误处理:'strict'(报错)、'ignore'(忽略)、'replace'(替换)
strip_accents=None, # 去除重音符号:None(不处理)、'ascii'(仅ASCII字符)、'unicode'(所有字符)
lowercase=True, # 是否将文本转为小写(默认True)
preprocessor=None, # 自定义预处理函数(输入文本字符串,返回处理后的字符串)
tokenizer=None, # 自定义分词函数(输入文本字符串,返回分词列表)
stop_words=None, # 停用词:None(不处理)、'english'(内置英文停用词)、自定义列表
token_pattern=r'(?u)\\b\\w\\w+\\b', # 分词正则表达式(默认匹配2个及以上字符的单词)
ngram_range=(1, 1), # 提取n元词范围,如(1,2)表示同时提取1元词和2元词
analyzer='word', # 分析单位:'word'(按词)、'char'(按字符)、'char_wb'(按字符,不跨越词边界)
max_df=1.0, # 最大文档频率(过滤高频词):0~1(比例)或整数(文档数)
min_df=1, # 最小文档频率(过滤低频词):0~1(比例)或整数(文档数)
max_features=None, # 保留的最大特征数(按词频排序取前N个)
vocabulary=None, # 自定义词汇表(字典或列表,指定要提取的词)
binary=False, # 是否将词频转为二进制(1表示出现,0表示未出现,默认False)
dtype=np.int64 # 输出矩阵的数据类型
)
2. 准备文本数据
定义了一个文本列表 texts ,包含 4 个字符串元素:
texts = ['apple banana orange', 'apple banana banana', 'orange pear', 'pear']
3. 初始化向量化器(关键参数说明)
创建了 CountVectorizer 实例,并设置了两个参数:
cv = CountVectorizer(
max_features=6, # 仅保留语料库中出现频率最高的6个特征**
ngram_range=(1, 3) # 提取1元词(unigram)、2元词(bigram)、3元词(trigram)**
)
4. 拟合转换文本数据
cv.fit_transform(texts) 对文本进行拟合和转换:
- fit :分析文本,构建词汇表
- transform :将文本转换为词频矩阵【稀疏矩阵三元组】
cv_fit = cv.fit_transform(texts) # fit构建词汇表 + transform生成矩阵
5. 解析稀疏矩阵输出
print(cv_fit) 输出的是一个稀疏矩阵三元组表示,格式为 (文档索引[行标], 特征索引[列标]) 词频
print(cv_fit)
输出结果:
(0, 0)1 # **文档0中特征0出现1次**
(0, 3)1 # **文档0中特征3出现1次**
(0, 4)1 # **文档0中特征4出现1次**
(0, 1)1 # **文档0中特征1出现1次**
(1, 0)1 # **文档1中特征0出现1次**
(1, 3)2 # **文档1中特征3出现2次**
(1, 1)1 # **文档1中特征1出现1次**
(1, 2)1 # **文档1中特征2出现1次**
(2, 4)1 # **文档2中特征4出现1次**
(2, 5)1 # **文档2中特征5出现1次**
(3, 5)1 # **文档3中特征5出现1次**
6. 获取特征名称(词汇表)
cv.get_feature_names_out() 返回所有提取的特征名称(词汇表),根据示例会输出类似:
feature_names = cv.get_feature_names_out()
print(feature_names)
输出结果:
['apple' 'apple banana' 'apple banana banana' 'banana' 'orange' 'pear']
说明:
-
特征顺序由算法自动生成(优先高频词,同频按字母序)
-
包含所有1-3元词组:apple(unigram)、apple banana(bigram)、apple banana banana(trigram)等
7. 转换为稠密矩阵(直观展示)
cv_fit.toarray() 将稀疏矩阵转换为稠密矩阵(二维数组),每行代表一个文档,每列代表一个特征,值为该特征在对应文档中的出现次数:
import numpy as np
dense_matrix = cv_fit.toarray()
print(dense_matrix)
输出结果:
[[1 1 0 1 1 0] # **文档0:apple/apple banana/banana/orange各1次**
[1 1 1 2 0 0] # **文档1:apple/apple banana/apple banana banana/banana(2次)**
[0 0 0 0 1 1] # **文档2:orange/pear各1次**
[0 0 0 0 0 1]] # **文档3:pear 1次**
8. 完整对照表
|
apple banana orange |
1 |
1 |
0 |
1 |
1 |
0 |
|
apple banana banana |
1 |
1 |
1 |
2 |
0 |
0 |
|
orange pear |
0 |
0 |
0 |
0 |
1 |
1 |
|
pear |
0 |
0 |
0 |
0 |
0 |
1 |
关键结论
特征生成逻辑:
ngram_range=(1,3)会生成所有连续1-3个词的组合(如"apple banana"是bigram,"apple banana banana"是trigram)。
特征筛选机制:
max_features=6强制只保留语料库中出现频率最高的6个特征(本例中为:apple, apple banana, apple banana banana, banana, orange, pear)。
矩阵解读:
-
行:文档索引(0~3对应4个文本)
-
列:特征索引(0~5对应6个特征)
-
值:特征在文档中的出现次数(非布尔值)
注:实际特征顺序可能因sklearn版本差异而不同,但矩阵数值关系保持不变。可通过get_feature_names_out()验证具体映射关系。
三、案例分析(中文文本情感分类的前期数据处理与特征工程流程)
这里有从苏宁上爬取的关于手机的评论,一个好评与一个差评文件
1.数据集
差评

好评

2.整体功能概述
这段代码主要实现了 中文文本情感分类的前期数据处理与特征工程流程 ,包括:
3.代码分步详解
1.库与模块导入
from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd
import jieba
- CountVectorizer :用于将文本转换为词频矩阵(scikit-learn 工具);
- pandas (别名 pd ):处理表格型数据(读取文件、DataFrame 操作);
- jieba :中文分词库,把连续的中文文本拆分为词语列表。
2. 读取原始数据
hp_content = pd.read_table("好评.txt", encoding='gbk')
cp_content = pd.read_table("差评.txt", encoding='gbk')
- 用 pd.read_table 读取本地文本文件, encoding='gbk' 适配 GBK 编码(需确保文件实际编码一致,否则会报错 );
- pd.read_table是 pandas 库中用于读取分隔符分隔文本文件(如 TSV、CSV 等)的核心函数,本质是将表格型文本数据加载为 pandas DataFrame。它默认以制表符(\\t) 作为分隔符,是 pd.read_csv的“兄弟函数”(read_csv默认以逗号 ,分隔)。
- hp_content 、 cp_content 是 DataFrame 类型,存储 “好评”“差评” 文本数据,默认有一列 content 存文本内容。
3.中文分词(差评 + 好评)
差评分词 :
cp_segements = []
contents = cp_content.content.values.tolist()
for content in contents:
results = jieba.lcut(content) # 精确模式分词,返回词语列表
if len(results) > 1: # 过滤分词后长度<1的(避免空内容)
cp_segements.append(results)
cp_fc_results = pd.DataFrame({'content': cp_segements})
cp_fc_results.to_excel('cp_fc_results.xlsx', index=False)
- 先提取 cp_content 中 content 列的文本,转成列表遍历;
- jieba.lcut(content) 对单条文本分词,结果是 list (如 “这个产品好” → ["这个", "产品", "好"] );
- 用 DataFrame 存储分词结果,再导出为 Excel( index=False 不存行索引 )。
好评分词 (逻辑与差评完全一致 ):
hp_segements = []
contents = hp_content.content.values.tolist()
for content in contents:
results = jieba.lcut(content)
if len(results) > 1:
hp_segements.append(results)
hp_fc_results = pd.DataFrame({'content': hp_segements})
hp_fc_results.to_excel('hp_fc_results.xlsx', index=False)
4. 读取停用词
stopwords = pd.read_csv(
'StopwordsCN.txt',
encoding='utf-8',
engine='python',
header=None,
names=['word'],
sep='\\t'
)
- 读取停用词表(通常是纯文本,每行一个停用词 );
- header=None 表示文件无表头, names=['word'] 手动设列名, sep='\\t' 用制表符分隔(按实际文件格式调整 );
- 最终 stopwords 是 DataFrame ,一列 word 存停用词。
5. 定义并调用 “去除停用词” 函数
def drop_stopwords(contents, stopwords):
segments_clean = []
for content in contents: # 遍历每条分词后的文本(列表套列表结构)
line_clean = []
for word in content: # 遍历单条文本的词语
if word in stopwords: # 若词语在停用词表中,跳过
continue
line_clean.append(word) # 否则保留词语
segments_clean.append(line_clean) # 收集单条文本清洗后的词语列表
return segments_clean
- 输入: contents 是分词后的文本列表(如 [["这个","产品","好"], …] ), stopwords 是停用词列表;
- 输出:清洗后的词语列表(过滤掉停用词 )。
调用函数处理差评、好评数据 :
# 处理差评
contents = cp_fc_results.content.values.tolist() # 从 DataFrame 提取分词结果(列表格式)
stopwords = stopwords.word.values.tolist() # 停用词 DataFrame → 列表
cp_fc_contents_clean_s = drop_stopwords(contents, stopwords)
# 处理好评(逻辑同上)
contents = hp_fc_results.content.values.tolist()
hp_fc_contents_clean_s = drop_stopwords(contents, stopwords)
6. 构建带标签的训练数据集
cp_trian = pd.DataFrame({'segments_clean': cp_fc_contents_clean_s, 'label': 1}) # 差评标签设为 1
hp_train = pd.DataFrame({'segments_clean': hp_fc_contents_clean_s, 'label': 0}) # 好评标签设为 0
pj_train = pd.concat([cp_trian, hp_train]) # 合并差评、好评数据
pj_train.to_excel("pj_train.xlsx", index=False) # 导出合并结果
- label 是情感标签: 1 代表 “差评”, 0 代表 “好评”;
- pd.concat 按行合并两个 DataFrame ,形成完整训练数据集
7. 拆分训练集、测试集
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(
pj_train['segments_clean'].values, # 特征:清洗后的分词列表
pj_train['label'].values, # 标签:情感类别(0/1)
random_state=0
)
- train_test_split 按默认比例(一般 75% 训练、25% 测试 )拆分数据;
- x_train / x_test 是特征数据(分词列表 ), y_train / y_test 是对应标签。
8. 文本转词频特征(为模型做准备)
words = []
for line_index in range(len(x_train)):
words.append(' '.join(x_train[line_index])) # 分词列表 → 用空格连接成字符串(如 ["这个","产品"] → "这个 产品" )
print(words)
from sklearn.feature_extraction.text import CountVectorizer
vec = CountVectorizer(max_features=4000, ngram_range=(1, 3)) # 初始化向量器
vec.fit(words) # 基于训练集构建词汇表
x_train_vec = vec.transform(words) # 训练集文本 → 词频矩阵
print("a")
-
构建可入模的文本格式 : CountVectorizer (词频向量化器)要求输入是 “用空格连接的字符串”,所以用 ' '.join(…) 把分词列表转成字符串(如 ["这个","产品"] → "这个 产品" )。
-
CountVectorizer 配置与作用 :
- max_features=4000 :只保留词频最高的 4000 个词(控制特征数量,避免维度爆炸 );
- ngram_range=(1, 3) :提取 1 元词(单个词)、2 元词(两个词组合,如 “这个 产品” )、3 元词(三个词组合 );
- vec.fit(words) :扫描 words 里的文本,统计词频并构建词汇表(后续用这个词汇表转换文本 );
- vec.transform(words) :将训练集文本转换为 稀疏矩阵 (每行是一条文本,每列是一个词,值是词频 ),供机器学习模型(如逻辑回归、SVM )使用。
9. 模型训练与评估
# 训练朴素贝叶斯模型
classifier = MultinomialNB(alpha=0.1) # alpha为平滑参数
classifier.fit(x_train_vec, y_new)
# 评估训练集性能
train_predict = classifier.predict(x_train_vec)
print("训练集:")
print(metrics.classification_report(y_new, train_predict))
# 评估测试集性能
test_words=[]
for line_index in range(len(x_test)):
test_words.append(' '.join(x_test[line_index]))
test_predict = classifier.predict(vec.transform(test_words))
print("测试集:")
print(metrics.classification_report(y_test, test_predict))
10. 实际预测应用
# 接收用户输入并进行预测
s = input("请输入评价:")
# 单个文本预处理函数
def preprocess_single_text(text, stopwords):
segments = jieba.lcut(text) # 分词
clean_segments = [word for word in segments if word not in stopwords] # 去停用词
return ' '.join(clean_segments) # 转为字符串
processed_text = preprocess_single_text(s, stopwords_list)
s_predict = classifier.predict(vec.transform([processed_text])) # 预测
# 输出结果
print("\\n预测结果:", "好评" if s_predict[0] == 0 else "差评")


