【课程总结】Day6(上):机器学习项目实战--外卖点评情感分析预测

news2024/10/5 16:31:01

机器学习项目实战:外卖点评情感分析预测

项目目的

基于中文外卖评论数据集,通过机器学习算法,对评论内容进行情感预测。

数据集

  • 地址:http://idatascience.cn/dataset-detail?table_id=429
  • 数据集字段
字段名称字段类型字段说明
label整型情感标签(1为正面,0为负面)。
review字符型评论内容。
  • 数据集样例:

    labelreview
    1很快,好吃,味道足,量大
    1没有送水没有送水没有送水
    1非常快,态度好。
    1方便,快捷,味道可口,快递给力
    1菜味道很棒!送餐很及时!
    1今天师傅是不是手抖了,微辣格外辣!
    1送餐快,态度也特别好,辛苦啦谢谢
    1超级快就送到了,这么冷的天气骑士们辛苦了。谢谢你们。麻辣香锅依然很好吃。
    1经过上次晚了2小时,这次超级快,20分钟就送到了……
    1最后五分钟订的,卖家特别好接单了,谢谢。

项目流程

在《【课程总结】Day1:人工智能的核心概念》一文中,初步梳理过人工智能的开展流程,在本次实战项目中,我们将结合实战深入理解项目流程。

分析输入/输出

通过分析,本次项目我们要解决的问题:给定一段中文评论,判断其是正面评论还是负面评论。

该问题是一个典型的分类问题,分析相关输入/输出如下:

  • 输入:一段中文评论
  • 输出:1为正面,0为负面
构建数据集
机器学习数据集特点

一般来说,机器学习的特征数据具有以下特点:

  • 特征与特征之间相互独立
  • 数据集是一个表格类数据
  • 数据成行成列
  • 一行一个样本,一列一个特征

通过分析上述的数据集,可以看到该数据集基本满足上述特点,但是仍然存在一个比较大的问题:数据集是汉字,机器无法处理(因为机器学习底层是对数字的处理),所以我们首先需要对数据数字化(也叫汉字向量化)。

汉字向量化

在机器学习中,汉字向量化是将汉字表示为计算机可识别的数值形式的过程。常用的方法有:

  • One-Hot 编码

    这是传统机器学习中常用的一种向量化方法。在这种方法中,每个汉字被表示为一个固定长度的向量,向量的大小等于字典的大小,每个条目对应于预定义单词字典中的一个单词,其中只有一个位置是1,其余为0。

  • 词袋模型

    在词袋模型中,文本中的每个汉字被看作是独立的,没有关联性,然后根据字典统计单词出现的频数。这种方法虽然简单,但在文本向量化中具有一定的实用性。

以词袋模型为例:

如果将文本"方便,快捷,味道可口,快递给力"以字为单位进行切分,并使用词袋模型进行向量化,向量化过程如下:

  1. 构建字汇表:首先,将文本中的所有不重复的字作为字汇表。在这个例子中,字汇表为[“方”, “便”, “,”, “快”, “捷”, “味”, “道”, “可”, “口”, “快”, “递”, “给”, “力”]。

  2. 向量化过程:对于每个文本,统计字汇表中每个字在文本中出现的次数,形成一个向量表示。

在这个例子中,"方便,快捷,味道可口,快递给力"的向量表示如下:

"方"出现1次
"便"出现1次
","出现3次
"快"出现2次
"捷"出现1次
"味"出现1次
"道"出现1次
"可"出现1次
"口"出现1次
"递"出现1次
"给"出现1次
"力"出现1次
因此,根据字汇表的顺序,该文本的词袋模型向量化结果为:
1,1,3,2,1,1,1,1,1,1,1,1

代码实现
  • 第一步:读取csv文件

    import csv
    import numpy as np
    def read_file(file_path, skip_header=True):
        """
        读取CSV文件的内容。
        参数:
            file_path (str): CSV文件的路径。
            skip_header (bool): 是否跳过表头数据,默认为True。
        返回:
            list: 包含CSV文件内容的列表。
        """
        print(f'读取原始数据集文件: {file_path}')
        with open(file_path, 'r', encoding='utf-8') as f:
            if skip_header:
                # 跳过表头数据
                f.readline()
            reader = csv.reader(f)
            return [row for row in reader]  # 读取csv文件的内容
    
    read_file("./中文外卖评论数据集.csv")
    
  • 第二步:切分标签和数据

    def split_data(data):
        """
        将数据分割为标签和数据。
        参数:
            data (list): 数据行的列表,第一个元素是标签。
        返回:
            numpy.ndarray: 标签数组。
            numpy.ndarray: 连接元素后的数据数组。
        """
        label = [row[0] for row in data]
        data = [','.join(row[1:]) for row in data]
    
        # 转换为numpy数组
        n_label = np.array(label)
        n_data = np.array(data)
    
        return n_label, n_data
    
    listdata = read_file('./中文外卖评论数据集.csv')
    label, data = split_data(listdata)
    print(label)
    print(data)
    
  • 第三步:对汉字进行向量化处理

    
    def load_stop_words(file_path):
        """
        读取停用词文件。
        参数:
            file_path (str): 停用词文件的路径。
        返回:
            list: 包含停用词的列表。
        """
        print(f'读取停用词文件: {file_path}')
        # 从csv文件中读取停用词
        stopwords = []
        with open(file_path, 'r', encoding='utf-8') as f:
            # 跳过第一行表头
            f.readline()
            reader = csv.reader(f)
            for row in reader:
                stopwords.append(row[0])
        return stopwords
    
    def text_to_vector(data, stopwords=None):
        """
        将数据中的汉字向量化。
        参数:
            data (numpy.ndarray): 包含汉字的数组。
            stopwords (list): 包含停用词的列表。
        返回:
            list: 使用词袋模型向量化的数据。
        """
    
        print('开始数据集汉字的向量化处理')
        # 逐个汉字进行分词
        vector = []
        for review in data:
            words = []
            for word in review:
                if word not in stopwords:
                    words.append(word)
            vector.append(words)
    
        # 词袋模型的向量化
        # 举个例子,假设有以下数据:
        # 词汇表: {方, 便, 快, 捷, 味, 道, 可, 口, 递, 给, 力}
        # 初始向量: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
        # 向量化过程:
        # 第一次: [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]  # '方'出现1次
        # 第二次: [1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]  # '快'出现1次
        # 第三次: [1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0]  # '味'出现1次
        # 第四次: [1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0]  # '可', '口'各出现1次
    
        # 第一步:构建词汇表
        vocab = set([word for sublist in vector for word in sublist])
        vectorized_data = []
    
        # 第二步:遍历字的内容
        for words in vector:
            # 第三步:生成一个长度为len(vocab),内容都为0的向量
            bow_vector = [0] * len(vocab)
            # 第四步:找到词语在词汇表中的索引,然后在对应的位置上加1
            for word in words:
                if word in vocab:
                    index = list(vocab).index(word)
                    bow_vector[index] += 1
            vectorized_data.append(bow_vector)
    
        return vectorized_data
    
    
  • 第四步:保存向量数据到本地文件

    
    def process_data(label, vector, file_path_save):
        """
        处理数据的函数,包括读取文件、切分数据、向量化和保存向量化后的数据到新文件中。
        参数:
            label (numpy.ndarray): 标签数组。
            vector (list): 向量化数据。
            file_path_save (str): 向量化数据保存的路径。
        """
    
        print(f'向量化处理完毕,保存至: {file_path_save}')
        # 将向量化的数据保存到新文件中
        with open(file_path_save, 'w', encoding='utf-8') as f:
            writer = csv.writer(f)
            writer.writerow(['label'] + ['x' + str(i) for i in range(len(vector[0]))])
            for i in range(len(label)):
                writer.writerow([label[i]] + vector[i])
    process_data(label, vector, 'vectorized_data.csv')
    

    至此,数据的预处理已经完成,处理后的数据保存在vectorized_data.csv文件,其内容如下:


- label为标签

- x0~xn为特征数据
遴选算法

为了跑通逻辑,我们先选择决策树来验证上述数据集是否可用。

from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier


def decision_tree(train_data_file_path='vectorized_data.csv', test_size=0.2):
    """
    决策树模型的训练和评估。
    参数:
        train_data_file_path (str): 向量化数据的文件路径。
        test_size (float): 测试集的比例,默认为0.2。
    """
    print('开始加载训练数据...')
    # 读取文件
    with open(train_data_file_path, 'r', encoding='utf-8') as f:
        reader = csv.reader(f)
        data = [row for row in reader]

    # 数据切分
    label = [row[0] for row in data[1:]]
    vector = [row[1:] for row in data[1:]]

    # 训练集和测试集切分
    X_train, X_test, y_train, y_test = train_test_split(vector, label, test_size=0.2)

    print('开始训练决策树模型...')
    # 数据预测
    clf = DecisionTreeClassifier()
    clf.fit(X_train, y_train)
    y_pred = clf.predict(X_test)

    # 评估
    print('开始决策树预测...')
    accuracy = np.mean(y_pred == y_test)
    print(f'预测准确率:{accuracy}')

运行结果:

工程优化

通过上述验证数据集已经可以使用,整体流程已经没有问题。接下来我们对代码进行重构:

1、将整体代码使用面向对象封装为类实现

2、在汉字向量化处理中使用jieba的分词方式

3、在模型预测部分加入KNN、贝叶斯、线性回归、随机森林、SVC向量机的方式

由于重构的代码内容较多,本篇文章不再赘述,详情请见Github仓库

遴选算法

通过运行上述工程优化后的代码,执行结果如下:

  • 通过对比准确率,线性回归、SVC、随机森林的准确率较高。
  • 通过分析日志中的执行时间,SVC在使用jieba分词时的训练时间大概有9分钟,训练速度比较慢。
  • 因此,综合下来线性回归和随机森林是较为合适的机器学习模型。

内容小结

  • 机器学习时,数据一般有如下特点

    • 特征与特征之间相互独立
    • 数据集是一个表格类数据
    • 数据成行成列
    • 一行一个样本,一列一个特征
  • 如果数据是汉字,机器是无法处理的,其底层都是处理数字,我们需要将汉字向量化为数字

  • 汉字的向量化方法一般来说有OneHot编码和词袋模型

参考资料

知乎:文本表示之词袋模型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1792788.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++ | 构造函数】类的构造函数详解

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 ⏰发布时间⏰:2024-06-06 0…

华为设备配置静态路由和默认路由

华为设备配置静态路由和默认路由 理论部分知识: 路由分为两个大类:静态路由-----动态路由 静态路由:手工指定,适用于小规模的网络应用场景,如果网络规模变大,这样的方式非常不适合而且容易出错。 语法&…

【软件测试】6.设计测试用例的设计方法

目录 1.基于需求的设计方法 2.具体的设计方法 2.1等价类 2.2边界值 2.3正交法 2.4判定表法 2.5场景法 2.6 错误猜测法 1.基于需求的设计方法 基于需求的设计方法也是总的设计测试用例的方法,在工作中,我们需要参考需求文档/产品规格说明书来设计…

【AI大模型】Function Calling

目录 什么是Function Calling 示例 1:调用本地函数 Function Calling 的注意事项 支持 Function Calling 的国产大模型 百度文心大模型 MiniMax ChatGLM3-6B 讯飞星火 3.0 通义千问 几条经验总结 什么是Function Calling Function Calling 是一种函数调用机…

【游戏】Goc赚钱模拟器1.0版

Hello!大家好,我是学霸小羊,今天分享一个Goc游戏。 //注:以下代码为Goc原创代码。 大家可以在下面网址写入代码www.51goc.com慧通教育http://www.51goc.com注:Goc编辑器路径: www.51goc.com ➡ 登录 ➡ 游客登陆 ➡…

【OpenHarmony】ArkTS 语法基础 ⑤ ( ArkTS 状态管理 | @State 装饰器定义状态数据 | 使用状态数据渲染组件 )

文章目录 一、ArkTS 状态管理 - State 装饰器1、State 装饰器定义状态数据2、State 装饰器定义状态数据 - 示例分析3、使用 State 装饰器定义的状态数据渲染组件 - 示例分析 二、完整代码示例1、完整自定义组件代码示例2、展示效果 参考文档 : <HarmonyOS第一课>ArkTS开发…

实验七、创建小型实验拓扑《计算机网络》

早检到底是谁发明出来的。 一、实验目的 完成本实验后&#xff0c;您将能够&#xff1a; • 设计逻辑网络。 • 配置物理实验拓扑。 • 配置 LAN 逻辑拓扑。 • 验证 LAN 连通性。 二、实验任务 在本实验中&#xff0c;将要求您连接网络设备并配置主机实现基本的网络…

【Python】 深入理解Pandas中的iloc和loc:数据选择的艺术

基本原理 在Python的Pandas库中&#xff0c;数据选择是数据分析和处理的基础。iloc和loc是两种常用的数据选择方法&#xff0c;它们都允许用户根据索引位置或标签来选择数据。然而&#xff0c;它们在行为和用途上存在一些关键的差异。 iloc iloc是基于整数索引的&#xff0c…

微信小程序多端框架打包后发布到华为市场

app上架华为应用市场 一、android 发布到华为应用市场 1、华为应用市场注册开发者账号 https://developer.huawei.com/consumer/cn/?ha_sourcesem&ha_sourceId89000605 2、进行企业认证 3、app隐私弹窗 miniapp-privacy.json 1、协议弹窗内容&#xff1a; {"tit…

基于python的网上挂号预约系统-计算机毕业设计源码89352

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;医院当然也不例外。网上挂号预约系统是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;采用Py…

华为坤灵管理型交换机S300,S500,S310,S210,S220,S200 web端开局配置

一. 准备线缆 1.笔记本或没有COM口的电脑,需准备转接线,并安装好随线光盘的驱动,检查设备管理器中COM口是否正常 【GKREN】console调试线适用于华为h3c思科交换机usb转RJ45/RS232 2.连接电脑与交换机的CONSOLE口 二.准备软件putty。 Download PuTTY: latest release (0.81) …

Linux中Apache网站基于Http服务的访问限制(基于地址/用户)

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f468;‍&#x1f4bb;Linux高级管理专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月3日11点44分 &#x1f004;️文章质量&#xff1a;95分 为了更好地控制对网站资源的访问&#xff0c;可…

cmake使用(01)

顶层CMakeLists.txt cmake_minimum_required (VERSION 3.5)# 配置 交叉编译 放置在 project() 命令之前# /opt/fslc-wayland/2.5.2/sysroots/aarch64-fslc-linux/usr/bin/make: error # while loading shared libraries: libdl.so.2: cannot open shared object file: # No su…

spring boot3登录开发-2(3邮件验证码接口实现)

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 目录 写在前面 上文衔接 接口设计与实现 1.接口分析 2.实现思路 3.代码实现 1.定义验证码短信HTML模板枚举类 2.定义验证码业务接口 3. 验证码业务接口实现 4.控制层代码 4.测试 写…

用 Axios 封装一个双 token 无感刷新

为什么要用双Token无感刷新&#xff0c;它解决了什么问题&#xff1f; 为了保证安全性&#xff0c;后端设置的Token不可能长期有效&#xff0c;过了一段时间Token就会失效。而发送网络请求的过程又是需要携带Token的&#xff0c;一旦Token失效&#xff0c;用户就要重新登陆&…

Nginx 功能简介及代理配置

一、Nginx功能简介 Nginx是一款开源的高性能HTTP和反向代理服务器&#xff0c;具有轻量级的设计、高并发能力、内存占用低以及配置简单等特点&#xff0c;并且支持热部署。以下是Nginx的主要功能&#xff1a; 静态内容服务&#xff1a;Nginx可以作为一个高性能的静态文件服务…

笔记 | 软件工程01:从程序到软件

1 软件工程知识域 2 程序 2.1 何为程序及程序的质量要求 何为程序&#xff1a; 理解&#xff1a;软件工程可能就是在弥补OOP语言与自然语言之间还存在的鸿沟 2.1.1 程序质量的内在和外在体现 2.1.2 程序质量的语法和语义体现 2.2 编写代码的基本原则 2.3 程序质量保证方法 …

软件三班20240605

文章目录 1.创建工程和模块2.添加 web支持3.创建前端代码4.添加servlet 依赖5. 代码6.案例2 1.创建工程和模块 2.添加 web支持 方法1 方法2 3.创建前端代码 4.添加servlet 依赖 5. 代码 <!DOCTYPE html> <html lang"en"> <head><meta c…

xml创建模型组合体

XML创建模型组合体 创建步骤模型准备模型处理模型文件XML编写 效果 创建步骤 模型准备 CAD 提供的原始模型如下&#xff1a; 该模型存在的问题&#xff1a; 单位问题&#xff1a;CAD出图的是 mm 为单位&#xff0c;但是 mujoco 建模这边用的是以 m 为单位的&#xff1b;原点…