NLP—词向量转换评论学习项目分析真实案例

发布于:2025-08-17 ⋅ 阅读:(20) ⋅ 点赞:(0)

任务:

训练出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:
                continue
            line_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_split

x_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:
                continue
            line_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(优质评价去停用词结果)。

核心术语解释

术语 / 函数 专业解释
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_split

x_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 要求的输入,保障后续词向量转换、模型训练能顺利运行。


网站公告

今日签到

点亮在社区的每一天
去签到