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

机器学习处理文本数据

这段代码使用了 scikit-learn 库中的CountVectorizer类,目的是将文本数据转换为数值特征(词袋模型),以便用于机器学习算法。让我逐步解释:

  1. 导入库

    from sklearn.feature_extraction.text import CountVectorizer
    

    导入了 scikit-learn 的CountVectorizer类,它用于将文本转换为词频矩阵。

  2. 定义文本数据

    text = ['aaa bbb ccc','aaa aaa ccc bbb','ccc bbb ccc','bbb bbb ccc aaa']
    

    这是一个包含 4 个文本字符串的列表,每个字符串由空格分隔的词语组成。

  3. 初始化 CountVectorizer

    cv = CountVectorizer(max_features=6, ngram_range=(1,3))
    
    • max_features=6:只保留出现频率最高的 6 个特征
    • ngram_range=(1,3):不仅考虑单个词(1-gram),还考虑 2 个词的组合(2-gram)和 3 个词的组合(3-gram)
  4. 拟合和转换文本数据

    cv_fit = cv.fit_transform(text)
    
    • fit:学习文本数据中的词汇表
    • transform:将文本转换为词频矩阵
  5. 输出结果

    • print(cv_fit):输出稀疏矩阵表示,显示非零元素的位置和计数
    • print(cv.get_feature_names_out()):输出提取的特征名称(词汇)
    • print(cv_fit.toarray()):将稀疏矩阵转换为稠密数组显示

运行这段代码会得到:

  • 特征名称(6 个最常见的 1-gram、2-gram 或 3-gram)
  • 每个文本在这些特征上的词频计数

例如,特征可能包括'aaa''bbb''ccc'等单个词,以及'aaa bbb''bbb ccc'等词组,具体取决于它们在文本中出现的频率。

这种文本向量化是自然语言处理中的基础步骤,将文本数据转换为机器学习算法可以理解的数值形式。

这段代码主要实现了中文文本数据的预处理流程,目的是将原始的好评 / 差评文本转换为可用于机器学习模型训练的特征数据,核心步骤包括数据读取、中文分词、停用词过滤、标签构建以及文本向量化。

逐部分解析:

1. 数据读取(读取好评 / 差评文本)

python

运行

import pandas as pd# 读取差评文本
cp_content = pd.read_csv("差评.txt", encoding='gbk')
# 读取好评文本(处理无表头、分隔符等问题)
hp_content = pd.read_csv('好评.txt',encoding='utf-8',header=None,  # 说明文件无表头sep='\t',     # 以制表符为分隔符engine='python',names=['content']  # 给列命名为'content'
)

  • 作用:从本地文件读取 “差评” 和 “好评” 文本数据,用pandas转换为 DataFrame 格式,方便后续处理。
  • 注意:两个文件编码不同(差评用gbk,好评用utf-8),需对应正确编码避免读取乱码;好评文件无表头,用names手动指定列名为content
2. 中文分词(用 jieba 对文本拆分)

python

运行

import jieba# 处理差评:分词
cp_seg = []
contents = cp_content.content.values.tolist()  # 提取差评内容为列表
for content in contents:results = jieba.lcut(content)  # 用jieba精确分词(返回词语列表)if len(results) > 1:  # 过滤掉分词后长度≤1的内容(可能是无效文本)cp_seg.append(results)
# 保存分词结果到Excel
cp_fc_results = pd.DataFrame({'content': cp_seg})
cp_fc_results.to_excel('cp_fc_results.xlsx', index=False)# 处理好评:同样的分词流程
hp_seg = []
contents = hp_content.content.values.tolist()
for content in contents:results = jieba.lcut(content)if len(results) > 1:hp_seg.append(results)
hp_fc_results = pd.DataFrame({'content': hp_seg})
hp_fc_results.to_excel('hp_fc_results.xlsx', index=False)

  • 作用:中文文本需要先拆分为词语(分词)才能进行后续处理,这里用jieba.lcut实现精确分词。
  • 细节:过滤掉分词后长度≤1 的文本(可能是无意义的短句),并将分词结果保存为 Excel,方便中间检查。
3. 停用词过滤(去除无意义词汇)

python

运行

# 读取停用词表(如“的”“是”“在”等无实际意义的词)
stopwords = pd.read_csv("StopwordsCN.txt", encoding='utf-8', engine='python', index_col=False)# 定义过滤停用词的函数
def drop_stopwords(contents, stopwords):seg_clean = []for content in contents:  # 遍历每条分词后的文本line_clean = []for word in content:  # 遍历每个词语if word in stopwords:  # 如果词语是停用词,则跳过continueline_clean.append(word)  # 保留非停用词seg_clean.append(line_clean)return seg_clean# 对差评分词结果过滤停用词
contents = cp_fc_results.content.values.tolist()
stopwords_list = stopwords.stopword.values.tolist()  # 提取停用词为列表
cp_fc_clean_s = drop_stopwords(contents, stopwords_list)# 对好评分词结果过滤停用词
contents = hp_fc_results.content.values.tolist()
hp_fc_clean_s = drop_stopwords(contents, stopwords_list)

  • 作用:去除文本中无实际意义的 “停用词”(如虚词、标点等),减少噪声,保留关键信息。
  • 注意:停用词表(StopwordsCN.txt)需提前准备,函数drop_stopwords会逐词检查并过滤。
4. 构建训练数据集(添加标签并合并)

python

运行

# 为差评和好评添加标签(注意:这里可能有笔误,通常差评/好评应设为不同标签)
cp_train = pd.DataFrame({'seg_clean': cp_fc_clean_s, 'label': 1})  # 差评标签设为1
hp_train = pd.DataFrame({'seg_clean': hp_fc_clean_s, 'label': 1})  # 好评标签也设为1(不合理)
# 合并差评和好评数据集
pj_train = pd.concat([cp_train, hp_train])
# 保存合并后的训练数据
pj_train.to_excel('pj_train.xlsx', index=False)

  • 作用:为文本添加分类标签(用于后续机器学习分类),并合并为一个完整的训练集。
  • 问题:这里可能存在逻辑错误 —— 通常 “差评” 和 “好评” 应作为两类标签(如差评 = 0,好评 = 1),但代码中都设为 1,后续模型无法区分,需要修正。
5. 划分训练集和测试集

python

运行

from sklearn.model_selection import train_test_split# 拆分数据:特征为分词后的文本(seg_clean),标签为label
x_train, x_test, y_train, y_test = train_test_split(pj_train['seg_clean'].values,  # 特征(文本)pj_train['label'].values,      # 标签random_state=100  # 随机种子,保证结果可复现
)

  • 作用:将数据集分为训练集(用于模型训练)和测试集(用于评估模型),random_state固定随机拆分方式。
6. 文本向量化(将词语转换为数值特征)

python

运行

# 将训练集的分词列表转换为字符串(CountVectorizer需要输入字符串)
words = []
for line_index in range(len(x_train)):words.append(' '.join(x_train[line_index]))  # 用空格连接词语,如["我", "喜欢"]→"我 喜欢"# 初始化CountVectorizer(词袋模型)
from sklearn.feature_extraction.text import CountVectorizer
VEC = CountVectorizer(max_features=4000,  # 只保留出现频率最高的4000个特征lowercase=False,    # 不转换为小写(中文无需小写处理)ngram_range=(1, 3)  # 考虑1-gram(单个词)、2-gram(两个词组合)、3-gram(三个词组合)
)# 拟合向量器(学习词汇表)并转换训练集
VEC.fit(words)
x_train_vec = VEC.transform(words)  # 得到词频矩阵(每行是一个文本的特征向量)

  • 作用:将文本(字符串)转换为机器学习模型可识别的数值特征。CountVectorizer通过统计词语(或词组)的出现次数,生成 “词频矩阵”。
  • 细节:ngram_range=(1,3)会保留词组信息(如 “服务 差”“性价比 高”),比仅用单个词更能捕捉语义;max_features=4000限制特征数量,避免维度爆炸。

整体流程总结

这段代码完整实现了从 “原始文本” 到 “模型输入特征” 的预处理流程:
读取数据 → 中文分词 → 过滤停用词 → 构建带标签的数据集 → 拆分训练 / 测试集 → 文本向量化

主要用于后续的文本分类任务(如区分好评 / 差评),但需注意标签设置错误的问题(差评和好评标签应不同)。

http://www.xdnf.cn/news/1289863.html

相关文章:

  • linux 开机进入initramfs无法开机
  • 串口通信学习
  • 数据分析专栏记录之 -基础数学与统计知识
  • Spring-Cache 缓存数据
  • windows git安装步骤
  • XGBoost 的适用场景以及与 CNN、LSTM 的区别
  • 网络协议——HTTP协议
  • Linux服务:Apache 虚拟主机配置指南:多站点部署三种方式详解
  • 【超详细!题解|两种做法】洛谷P3196 [HNOI2008] 神奇的国度[MCS算法]
  • 深入剖析 React 合成事件:透过 onClick 看本质
  • 过程设计工具深度解析-软件工程之详细设计(补充篇)
  • Nginx 高级配置
  • 【后端】Spring @Resource和@Autowired的用法和区别
  • 通用同步/异步收发器USART串口
  • excel-随笔记
  • [ 数据结构 ] 时间和空间复杂度
  • Python初学者笔记第二十二期 -- (JSON数据解析)
  • VGG改进(2):基于Local Attention的模型优化
  • 【图像算法 - 13】基于 YOLO12 与 OpenCV 的实时目标点击跟踪系统(系统介绍 + 源码详细)
  • 获取数组,字符串,集合的长度
  • C++——高性能组件
  • 算法打卡力扣第88题:合并两个有序数组(easy)
  • 解释 Spring MVC 的工作原理
  • _init__.py的作用
  • 智能装配线cad【8张】三维图+设计说明书
  • linux 执行ls命令文件夹显示全白色
  • Langchain入门:文本摘要
  • 多轮问答与指代消解
  • 一维数组的创建、初始化与使用指南
  • “生成式UI革命”:Tambo AI如何让你的应用“开口说话、动手搭界面” | 全面深剖、案例实践与未来展望