当前位置: 首页 > news >正文

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_contentyzpj_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)
  1. 提取差评文本:通过cp_content.content.values.tolist(),从cp_content中提取 “content” 列(存储评价文本的列)就是这个图标框,values是content的所有内容,tolist并转换为 Python 列表(每个元素为一条评价)

for content in contents:results = jieba.lcut(content)
  1. 分词操作:遍历每条评价,使用jieba.lcut(content)进行精确分词,返回词语列表(如 “物流太慢”→["物流", "太慢"])。

result可以看到内容

if len(results) > 1:cp_segments.append(results)
  1. 过滤无效文本:仅保留分词后词语数量len(results) > 1的结果(过滤空文本或单词语无意义文本),存入cp_segments列表。
cp_fc_results = pd.DataFrame({'content': cp_segments})
cp_fc_results.to_excel('cp_fc_results.xlsx', index=False)
  1. 结果存储:将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 停用词库导入与函数定义
  1. 导入停用词库:通过pd.read_csv(r".\StopwordsCN.txt", encoding='utf8', engine='python')读取停用词文件(含 “的、了、在” 等无实际语义的词)。
    • engine='python'用于解决文件格式兼容问题,确保顺利读取。
  2. 定义去停用词函数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

  1. 差评清洗:提取差评分词结果(cp_fc_results.content.values.tolist()),结合停用词列表(stopwords.stopword.values.tolist()),通过drop_stopwords得到cp_fc_contents_clean_s(差评去停用词结果)。
  2. 优质评价清洗:流程与差评一致,得到yzpj_fc_contents_clean_s(优质评价去停用词结果)。

核心术语解释

术语 / 函数专业解释
DataFramepandas 的表格型数据结构,含行和列,类似 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 要求的输入,保障后续词向量转换、模型训练能顺利运行。

http://www.dtcms.com/a/327221.html

相关文章:

  • 本地(macOS)和服务器时间不同步导致的 Bug排查及解决
  • linux 执行ls命令文件夹显示全白色
  • 微前端架构:原理、场景与实践案例
  • Rust 性能提升“最后一公里”:详解 Profiling 瓶颈定位与优化|得物技术
  • 计算机视觉(6)-自动驾驶感知方案对比
  • 使用 NetBird 创建安全的私有网络,简化远程连接!
  • Golang 语言中 Context 的使用方式
  • Rust学习笔记(二)|变量、函数与控制流
  • 【七指共振擒牛战法】副图+选股指标——多维度捕捉主升浪的量化交易利器
  • 智慧校园|智慧校园管理小程序|基于微信小程序的智慧校园管理系统设计与实现(源码+数据库+文档)
  • [Robotics_py] 定位滤波器 | 预测与更新 | 扩展卡尔曼滤波器(`EKF`)
  • Linux操作系统应用软件编程——标准IO
  • Java Stream ReduceOps
  • 负载均衡详解
  • 小程序排名优化:用户行为数据背后的提升密码
  • PostgreSQL 范围、空间唯一性约束
  • 「ECG信号处理——(23)基于ECG和PPG信号的血压预测」2025年8月12日
  • SQL 生成日期与产品的所有组合:CROSS JOIN(笛卡尔积)
  • Linux 系统运维、网络、SQL Server常用命令
  • 机器学习 [白板推导](九)[变分推断]
  • DRAM、SRAM、NAND Flash、NOR Flash、EEPROM、MRAM存储器你分得清吗?
  • 用pom文件从nexus3拉依赖,无法拉取的一个问题
  • 逻辑删除 vs 物理删除:MyBatis-Plus 实现指南与实践
  • 可泛化逻辑推理Python编程作为医疗AI发展方向研究
  • 关于数据库的restful api接口工具SqlRest的使用
  • 如何在 Ubuntu 24.04 LTS Linux 中安装 JSON Server
  • 2025年国赛新规解读:8-12最新发布文件
  • 初识数据结构——优先级队列(堆!堆!堆!)
  • 偶遇冰狐智能辅助的录音
  • Python初学者笔记第二十四期 -- (面向对象编程)