机器学习处理文本数据

这段代码使用了 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:  # 如果词语是停用词,则跳过
                continue
            line_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限制特征数量,避免维度爆炸。

整体流程总结

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

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

相关推荐
是Dream呀9 分钟前
YOLOv10深度解析:革命性的实时目标检测技术
人工智能·代码规范
syounger30 分钟前
汉高携手SAP推出AI驱动的退换货与争议管理解决方案
人工智能
AI程序员35 分钟前
全面解读 Vibe Coding:概念、流程、实践与未来
人工智能
阿里云大数据AI技术1 小时前
从“字”到“画”:基于Elasticsearch Serverless 的多模态商品搜索实践
大数据·人工智能·搜索引擎
恒点虚拟仿真2 小时前
人工智能+虚拟仿真,助推医学检查技术理论与实践结合
人工智能·ai·虚拟仿真·虚拟仿真实验·人工智能+虚拟仿真·医学检查虚拟仿真
cver1232 小时前
垃圾分类检测数据集-15,000 张图片 智能垃圾分类 回收站与环保设施自动化 公共区域清洁监测 环保机器人 水域与自然环境垃圾监测
人工智能·计算机视觉·分类·数据挖掘·机器人·自动化·智慧城市
陈敬雷-充电了么-CEO兼CTO2 小时前
OpenAI开源大模型 GPT-OSS 开放权重语言模型解析:技术特性、部署应用及产业影响
人工智能·gpt·ai·语言模型·自然语言处理·chatgpt·大模型
桃源学社(接毕设)2 小时前
基于Django珠宝购物系统设计与实现(LW+源码+讲解+部署)
人工智能·后端·python·django·毕业设计
鹿导的通天塔2 小时前
高级RAG 00:检索增强生成(RAG)简介
人工智能·后端