NLP—词向量转换评论学习项目分析真实案例
任务:
训练出1个智能判断评论的模型
1、数据集,爬虫爬取的数据,真实的用户(这个我文章有讲)
2、将文字转换为词向量。countvectorizer 转换好后是没有y数据的只有x数据,所以要自己加y标签
a、格式保持一致。jieba分词。用到停用词
3、搭建模型(贝叶斯)
代码评价分析
import pandas as pd
import jieba# 1. 数据读取与处理
cp_content = pd.read_table(r".\差评.txt", encoding='gbk')
yzpj_content = pd.read_table(r".\优质评价.txt", encoding='gbk')# 2. 分词(含对差评、优质评价分词)
## 2.1 对差评分词
cp_segments = []
contents = cp_content.content.values.tolist()
for content in contents:results = jieba.lcut(content)if len(results) > 1:cp_segments.append(results)
cp_fc_results = pd.DataFrame({'content': cp_segments})
cp_fc_results.to_excel('cp_fc_results.xlsx', index=False)## 2.2 对优质评价分词
yzpj_segments = []
contents = yzpj_content.content.values.tolist()
for content in contents:results = jieba.lcut(content)if len(results) > 1:yzpj_segments.append(results)
yzpj_fc_results = pd.DataFrame({'content': yzpj_segments})
yzpj_fc_results.to_excel('yzpj_fc_results.xlsx', index=False)# 3. 移除停用词
## 3.1 导入停用词库并定义去除停用词函数
stopwords = pd.read_csv(r".\StopwordsCN.txt", encoding='utf8', engine='python')def drop_stopwords(contents, stopwords):segments_clean = []for content in contents:line_clean = []for word in content:if word in stopwords:continueline_clean.append(word)segments_clean.append(line_clean)return segments_clean## 3.2 对差评分词结果去除停用词
contents = cp_fc_results.content.values.tolist()
stopwords_list = stopwords.stopword.values.tolist()
cp_fc_contents_clean_s = drop_stopwords(contents, stopwords_list)## 3.3 对优质评价分词结果去除停用词
contents = yzpj_fc_results.content.values.tolist()
yzpj_fc_contents_clean_s = drop_stopwords(contents, stopwords_list)# 4.1 给每个数据添加数字标签
import pandas as pd# 假设 cp_fc_contents_clean_s 和 yzpj_fc_contents_clean_s 已提前定义
cp_train = pd.DataFrame({'segments_clean': cp_fc_contents_clean_s, 'label': 1})
yzpj_train = pd.DataFrame({'segments_clean': yzpj_fc_contents_clean_s, 'label': 0})
pj_train = pd.concat([cp_train, yzpj_train])
pj_train.to_excel('pj_train.xlsx', index=False)# 4.2 数据切分:训练集特征、测试集特征、训练集标签、测试集标签
from sklearn.model_selection import train_test_splitx_train, x_test, y_train, y_test = train_test_split(pj_train['segments_clean'].values,pj_train['label'].values,random_state=0
)# 创建一个空列表,用于存储拼接后的字符串
words = []# 遍历x_train中的每个元素(假设x_train是一个二维列表)
for line_index in range(len(x_train)):# 将当前索引对应的子列表中的所有元素用空格连接成一个字符串# 并添加到words列表中words.append(' '.join(x_train[line_index]))# 打印最终拼接好的字符串列表
print(words)# 导入词向量转化库
from sklearn.feature_extraction.text import CountVectorizer# 初始化CountVectorizer,设置最大特征数、是否转小写、n元语法范围
vec = CountVectorizer(max_features=4000, lowercase=False, ngram_range=(1, 3))
# lowercase参数的功能:控制是否把所有词转换为小写,False 表示不转换
# max_features:表示只提取词频最高的前4000个词作为词库# 传入训练集文本构建词向量模型,以训练集单词构建词库
vec.fit(words)x_train_vec = vec.transform(words)
1. 库导入
- 导入
pandas
(别名pd
)和jieba
库。 pandas
用于处理表格型数据(如读取文本、存储结果),是文本数据预处理的核心工具。jieba
是中文分词工具,用于将连续的中文文本拆分为有语义的词语,为后续分析提供基础单元。
2. 原始数据读取
- 通过
pd.read_table()
函数读取本地文本文件:- 读取
差评.txt
得到差评数据cp_content
; - 读取
优质评价.txt
得到优质评价数据yzpj_content
。
- 读取
- 参数说明:
r".\文件名"
指定文件路径(r
表示原生字符串,避免路径符号冲突);encoding='gbk'
指定文件编码格式为gbk
,确保中文正常显示,避免乱码。
- 读取结果:
cp_content
和yzpj_content
均为DataFrame
对象(类似带表头的 Excel 表格),存储原始评价文本。
3. 文本分词处理
3.1 差评分词
cp_segments = []
contents = cp_content.content.values.tolist()
for content in contents:results = jieba.lcut(content)if len(results) > 1:cp_segments.append(results)
cp_fc_results = pd.DataFrame({'content': cp_segments})
cp_fc_results.to_excel('cp_fc_results.xlsx', index=False)
- 提取差评文本:通过
cp_content.content.values.tolist()
,从cp_content
中提取 “content” 列(存储评价文本的列)就是这个图标框,values是content的所有内容,tolist并转换为 Python 列表(每个元素为一条评价)
for content in contents:results = jieba.lcut(content)
- 分词操作:遍历每条评价,使用
jieba.lcut(content)
进行精确分词,返回词语列表(如 “物流太慢”→["物流", "太慢"])。
result可以看到内容
if len(results) > 1:cp_segments.append(results)
- 过滤无效文本:仅保留分词后词语数量
len(results) > 1
的结果(过滤空文本或单词语无意义文本),存入cp_segments
列表。
cp_fc_results = pd.DataFrame({'content': cp_segments})
cp_fc_results.to_excel('cp_fc_results.xlsx', index=False)
- 结果存储:将
cp_segments
转换为DataFrame
(列名为 “content”),通过to_excel('cp_fc_results.xlsx', index=False)
保存为 Excel 文件(index=False
表示不保留行索引)。
3.2 优质评价分词
- 流程与差评分词完全一致,最终得到
yzpj_fc_results.xlsx
(优质评价分词结果文件)。
4. 停用词移除
# 3. 移除停用词
## 3.1 导入停用词库并定义去除停用词函数
stopwords = pd.read_csv(r".\StopwordsCN.txt", encoding='utf8', engine='python')def drop_stopwords(contents, stopwords):segments_clean = []for content in contents:line_clean = []for word in content:if word in stopwords:continueline_clean.append(word)segments_clean.append(line_clean)return segments_clean
4.1 停用词库导入与函数定义
- 导入停用词库:通过
pd.read_csv(r".\StopwordsCN.txt", encoding='utf8', engine='python')
读取停用词文件(含 “的、了、在” 等无实际语义的词)。engine='python'
用于解决文件格式兼容问题,确保顺利读取。
- 定义去停用词函数
drop_stopwords(contents, stopwords)
:- 功能:接收分词后的文本列表(
contents
)和停用词列表(stopwords
),返回去除停用词后的干净文本列表。 - 逻辑:遍历每条分词文本中的每个词语,若词语不在停用词列表中则保留,最终汇总为清洗后的结果。
- 功能:接收分词后的文本列表(
4.2 应用去停用词函数
## 3.2 对差评分词结果去除停用词
contents = cp_fc_results.content.values.tolist()
stopwords_list = stopwords.stopword.values.tolist()
cp_fc_contents_clean_s = drop_stopwords(contents, stopwords_list)
提取一个contents然后在pandas方式读取提取stopwords都转化成列表,最后传入到cp_fc_contents_clean_s
- 差评清洗:提取差评分词结果(
cp_fc_results.content.values.tolist()
),结合停用词列表(stopwords.stopword.values.tolist()
),通过drop_stopwords
得到cp_fc_contents_clean_s
(差评去停用词结果)。 - 优质评价清洗:流程与差评一致,得到
yzpj_fc_contents_clean_s
(优质评价去停用词结果)。
核心术语解释
术语 / 函数 | 专业解释 |
---|---|
DataFrame | pandas 的表格型数据结构,含行和列,类似 Excel 表格 |
jieba.lcut() | jieba 库的精确分词函数,返回按语义拆分的词语列表 |
segments | 此处指 “分词后的词语列表” |
stopwords | 无实际语义的干扰词(如 “的、了”),需从文本中移除 |
index=False | 保存文件时不包含行索引(避免多余的数字列) |
5. 文本分类模型构建与训练
5.1 数据标签添加与整合
python
运行
import pandas as pd# 假设 cp_fc_contents_clean_s 和 yzpj_fc_contents_clean_s 已提前定义
cp_train = pd.DataFrame({'segments_clean': cp_fc_contents_clean_s, 'label': 1})
yzpj_train = pd.DataFrame({'segments_clean': yzpj_fc_contents_clean_s, 'label': 0})
pj_train = pd.concat([cp_train, yzpj_train])
pj_train.to_excel('pj_train.xlsx', index=False)
- 核心作用:为清洗后的文本数据添加分类标签(区分差评和优质评价),并整合成一个完整数据集。
- 具体操作:
cp_fc_contents_clean_s
是去除停用词后的差评文本列表,用label=1
标记(1 代表差评)。yzpj_fc_contents_clean_s
是去除停用词后的优质评价文本列表,用label=0
标记(0 代表优质评价)。pd.concat([cp_train, yzpj_train])
将两个带标签的数据集纵向合并,得到包含所有样本的pj_train
。to_excel(...)
将合并后的数据集保存为 Excel 文件,方便后续复用。
5.2 数据切分与特征转换
5.2.1 划分训练集与测试集
python
运行
from sklearn.model_selection import train_test_splitx_train, x_test, y_train, y_test = train_test_split(pj_train['segments_clean'].values,pj_train['label'].values,random_state=0
)
- 核心作用:将数据集分为用于模型训练的 “训练集” 和用于评估模型的 “测试集”。
- 参数与结果:
- 输入:
pj_train['segments_clean'].values
是文本特征数据(即清洗后的评价内容);pj_train['label'].values
是对应的标签(0 或 1)。 - 输出:
x_train
:训练集的文本特征(用于训练模型)。x_test
:测试集的文本特征(用于评估模型)。y_train
:训练集的标签(与 x_train 对应)。y_test
:测试集的标签(与 x_test 对应,用于判断预测是否正确)。
random_state=0
:固定随机种子,确保每次运行划分结果一致,便于调试。
- 输入:
5.2.2 文本格式转换(核心改造:构建可入模的字符串格式)
python
运行
# 创建一个空列表,用于存储拼接后的字符串
words = [] # 遍历 x_train 中的每个元素(x_train 是二维列表,每个子列表是分词结果)
for line_index in range(len(x_train)): # 将当前样本的分词列表,用空格拼接成字符串(如 ["物流","慢"] → "物流 慢" ) words.append(' '.join(x_train[line_index])) # 打印拼接结果,验证格式(可选,确认是否转为空格连接的字符串)
print(words)
改造逻辑说明:
- 原始
x_train
是分词列表的列表(如[["物流","慢"], ["包装","好"]]
),但词向量工具CountVectorizer
要求输入是字符串格式(如"物流 慢"
)。 - 因此新增循环 +
' '.join(...)
,将每个样本的分词列表拼接为空格分隔的字符串,存入words
,让后续词向量转换能正常运行。
5.2.3 词向量转换(基于改造后的文本,完成数字特征转换)
python
运行
# 导入词向量转化库
from sklearn.feature_extraction.text import CountVectorizer # 初始化 CountVectorizer,配置特征提取规则
vec = CountVectorizer( max_features=4000, # 仅保留 4000 个最常见的词/词组,避免特征冗余 lowercase=False, # 不转换为小写(中文无需,保留分词原始形态) ngram_range=(1, 3) # 提取 1 词、2 词、3 词的组合(如 "物流" "物流 慢" "物流 慢 包装" )
) # 用训练集文本构建词库(学习哪些词/词组是重要特征)
vec.fit(words) # 将训练集文本转换为词频矩阵(数字特征)
x_train_vec = vec.transform(words)
关键逻辑:
vec.fit(words)
:让模型学习words
里的词汇规律,统计词频并构建 “词库”(保留 4000 个特征)。x_train_vec
:转换后得到稀疏矩阵(每行对应一个样本,每列对应一个特征,值为该特征在样本中的出现次数 ),可直接用于模型训练。
衔接前后流程说明
改造集中在 5.2.2 文本格式转换 环节:
- 原始流程可能默认文本已是字符串格式,但实际因分词后是列表,必须新增 “列表转字符串” 的循环。
- 改造后,
words
成为符合CountVectorizer
要求的输入,保障后续词向量转换、模型训练能顺利运行。