当前位置: 首页 > 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.lryc.cn/news/618940.html

相关文章:

  • 【Vue 3 响应式系统深度解析:reactive vs ref 全面对比】
  • 【实时Linux实战系列】基于RFID的实时资产追踪系统
  • 当赞美来敲门:优雅接纳的艺术
  • 21.Linux HTTPS服务
  • GitHub的简单使用方法----(5)
  • 文件IO的学习
  • 论文Review 激光动态物体剔除 Dynablox | RAL2023 ETH MIT出品!
  • web前端第二次作业
  • 5G专网项目外场常见业务测试指南(六)-PingInfoView
  • 衡石HENGSHI SENSE6.0亮点功能-应用创作
  • 衡量机器学习模型的指标
  • HDI 线路板,如何突破普通线路板局限?
  • 基恩士3D视觉用于ABB机器人的KeyenceRobotVisionSetup.sys系统模块程序解析(九、KeyAbsMove)
  • centos 7 如何安装 ZipArchive 扩展
  • 百胜软件×华为云联合赋能,“超级国民品牌”海澜之家新零售加速前行
  • C语言栈的实现
  • NY198NY203美光固态闪存NY215NY216
  • 计算机毕设不知道选什么题目?基于Spark的糖尿病数据分析系统【Hadoop+Spark+python】
  • 鲲鹏arm服务器安装neo4j社区版,实现图书库自然语言检索基础
  • 25C机场航班调度程序(JS 100)
  • Neo4j Cypher
  • RK3568 Linux驱动学习——Linux LED驱动开发
  • Linux NAPI 实现机制深度解析
  • 【Oracle APEX开发小技巧16】交互式网格操作内容根据是否启用进行隐藏/展示
  • 2025年渗透测试面试题总结-16(题目+回答)
  • 力扣(LeetCode) ——移除链表元素(C语言)
  • 飞算AI:企业智能化转型的新引擎
  • 【电子硬件】EMI中无源晶振的优势
  • SpringBoot项目部署
  • string 类运算符重载