【综合小项目】—— 爬取数据、数据处理、建立模型训练、自定义数据进行测试

news2024/11/13 10:58:37

文章目录

  • 一、项目内容
  • 二、各步骤的代码实现
    • 1、爬取数据
    • 2、数据处理
    • 3、建立模型训练
    • 4、自定义数据进行预测

一、项目内容

  • 1、爬取数据
    • 本次项目的数据是某购物平台中某个产品的优质评价内容和差评内容
    • 采用爬虫的 selenium 方法进行爬取数据内容,并将爬取的内容分别存放在两个文本文件中
  • 2、数据处理
    • 分别读取存放数据的两个文本文件
    • 分别对优质评价和差评的内容进行分词
    • 导入停用词库,对数据进行去除停用词的操作,去除停用词可以减少数据集的噪音,提高后续处理步骤的效率和准确性
      • 停用词:停用词(Stop Words)是指在文本处理、自然语言处理(NLP)或信息检索(IR)中,那些对于理解文档或查询的真实意图没有帮助或贡献很小,通常会被忽略或从文本中移除的词汇。这些词汇通常是语言中最常见、最普遍的词汇,如“的”、“是”、“在”、“了”、“和”等(在中文中),以及“the”、“is”、“at”、“of”、“and”等(在英文中)
  • 3、建立模型训练
    • 给每个数据添加数字标签
    • 数据切分:训练集特征、测试集特征、训练集标签、测试集标签
    • 将所有的词转换为词向量
    • 导入朴素贝叶斯分类器
  • 4、自定义数据进行测试
    • 可以自定义一些评价,通过处理后传入模型进行预测

二、各步骤的代码实现

1、爬取数据

  • 优质评价与差评的爬取步骤基本上都是一致的,因为二者的标签布局都是一样的,只是在url上有略微的区别

  • 具体的爬取步骤就不再细说了,在我之前所发布的爬虫内容中都有详解

  • 用的是爬虫的 selenium 方法,结合下面两张图片和代码内容理解(在网页界面中按F12查看元素结构)
    在这里插入图片描述
    在这里插入图片描述

  • 优质评价的获取

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.edge.options import Options
    import time
    
    if __name__ == '__main__':
        # 创建文本用于存放优质评价内容
        fp = open("hp.txt", "w", encoding="utf8")
        # 通过for循环爬取每一页的优质评价内容,由于内容太多,只爬取200页
        for i in range(1, 200):
            # 设置无头模式(爬取时不显示网页界面)
            opt = Options()
            opt.add_argument("--headless")
            driver = webdriver.Edge(options=opt)
    
            # driver = webdriver.Edge()
            # 请求页面
            driver.get(
                f"https://review.suning.com/cluster_cmmdty_review/cluster-38249278-000000012389328846-"
                f"0000000000-{i}-good.htm?originalCmmdtyType=general&safp=d488778a.10004.loverRight.166")
    
            # 强制等待
            time.sleep(3)
    
            # 获取存放优质评价内容的所有div标签内容
            div_list = driver.find_elements(By.XPATH, "//div[@class='rv-target-item']/div")
            # print(div_list)
            # 循环遍历每一个div标签,获取每个用户的优质评价
            for div in div_list:
                good_p = div.find_element(By.XPATH, "div/div/div[2]/div[2]/p").text
                # print(good_p)
                # 将优质评价内容存写入文本中,并进行换行
                fp.write(good_p + "\n")
            # 关闭请求
            driver.close()
        # 关闭文本文件
        fp.close()
    
  • 差评的获取

    if __name__ == '__main__':
        # 创建文本用于存放差评内容
        fp = open("cp.txt", "w", encoding="utf8")
        # for 循环爬取每一页的差评内容(差评一共只有两页)
        for i in range(1, 3):
            # 设置无头模式(爬取时不显示网页界面)
            opt = Options()
            opt.add_argument("--headless")
            driver = webdriver.Edge(options=opt)
    
            # driver = webdriver.Edge()
            # 请求页面
            driver.get(
                f"https://review.suning.com/cluster_cmmdty_review/cluster-38249278-000000012389328846-"
                f"0000000000-{i}-bad.htm?originalCmmdtyType=general&safp=d488778a.10004.loverRight.166")
    
            # 强制等待
            time.sleep(3)
    
            # 获取存放差评内容的所有div标签内容
            div_list = driver.find_elements(By.XPATH, "//div[@class='rv-target-item']/div")
            # print(div_list)
            # 循环遍历每一个div标签,获取每个用户的差评
            for div in div_list:
                good_p = div.find_element(By.XPATH, "div/div/div[2]/div[2]/p").text
                # print(good_p)
                # # 将差评内容存写入文本中,并进行换行
                fp.write(good_p + "\n")
            # 关闭请求
            driver.close()
        # 关闭文本文件
        fp.close()
    

2、数据处理

  • 1.读取数据

  • 2.分词

    • 可参考以下文章对jieba分词进行理解
    • 链接:https://blog.csdn.net/weixin_73504499/article/details/141688513?spm=1001.2014.3001.5501
  • 3.去停用词

    """数据读取和处理"""
    
    import pandas as pd
    
    """读取数据"""
    # 差评
    cp_content = pd.read_table("cp.txt")
    # 好评
    yzpj_content = pd.read_table("hp.txt")
    
    """分词"""
    import jieba
    
    # 对差评分词
    cp_segments = []
    contents = cp_content.content.values.tolist()  # 将content列数据取出并转化为list格式;目的是分别 jieba.lcut分词
    for content in contents:
        results = jieba.lcut(content)
        if len(results) > 1:  # 当分词之后,这条评论如果只有1个词内容,则丢弃
            cp_segments.append(results)  # 将分词后的内容添加到列表cp_segments中
    
    # 分词结果储存在新的数据框中
    cp_fc_results = pd.DataFrame({'content': cp_segments})
    
    # 对优质评价分词(与差评相同)
    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})
    
    """去停用词"""
    # 导入停用词库
    stopwords = pd.read_csv(r"StopwordsCN.txt", encoding='utf-8', engine='python', index_col=False)
    
    
    # 定义去除停用词函数
    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
    
    
    stopwords = stopwords.stopword.values.tolist()  # 停用词转为list格式
    # 差评去停用词
    contents = cp_fc_results.content.values.tolist()  # DataFrame格式转为list格式
    cp_fc_contents_clean_s = drop_stopwords(contents, stopwords)  # 调用去除停用词函数
    # 好评去停用词
    contents = yzpj_fc_results.content.values.tolist()  # DataFrame格式转为list格式
    yzpj_fc_contents_clean_s = drop_stopwords(contents, stopwords)  # 调用去除停用词函数
    

3、建立模型训练

  • 1.给每个数据添加数字标签

  • 2.数据切分:训练集特征、测试集特征、训练集标签、测试集标签

  • 3.将所有的词转换为词向量

    • 可参考以下文章对 CountVectorizer() 词向量方法进行理解
    • 链接:https://blog.csdn.net/weixin_73504499/article/details/141754383?spm=1001.2014.3001.5501
  • 4.导入朴素贝叶斯分类器

    """朴素贝叶斯分类"""
    
    '''1.给每个数据添加数字标签'''
    cp_train = pd.DataFrame({'segments_clean': cp_fc_contents_clean_s, 'label': 1})  # 差评为 1
    yzpj_train = pd.DataFrame({'segments_clean': yzpj_fc_contents_clean_s, 'label': 0})  # 好评为 0
    pj_train = pd.concat([cp_train, yzpj_train])   # 将差评与好评数据拼接在一起,成为一个完整的数据集
    
    '''2.数据切分:训练集特征、测试集特征、训练集标签、测试集标签'''
    
    from sklearn.model_selection import train_test_split
    # 默认切分为 训练集75% 测试集25%
    # 传入数据和标签,设定随机种子
    x_train, x_test, y_train, y_test = \
        train_test_split(pj_train['segments_clean'].values, pj_train['label'].values, random_state=0)
    
    """3.将所有的词转换为词向量"""
    
    '''将训练集数据转换为词向量 :CountVectorizer()方法 所能识别的列表类型'''
    train_words = []
    for line_index in range(len(x_train)):
        train_words.append(' '.join(x_train[line_index]))
    #print(train_words)
    
    # 导入词向量方法:CountVectorizer
    from sklearn.feature_extraction.text import CountVectorizer
    
    # lowercase参数的功能:把所有的词是否需要转换为小写。False
    # max_features:表示只提取前4000个词作为词库
    vec = CountVectorizer(max_features=4000, lowercase=False, ngram_range=(1, 1))
    vec.fit(train_words)
    
    '''4.导入朴素贝叶斯分类器'''
    from sklearn.naive_bayes import MultinomialNB
    # alpha 是一个平滑参数
    # 这个参数的作用是防止在训练过程中出现零概率的情况,即某个特征在某个类别中从未出现过
    classifier = MultinomialNB(alpha=0.1)
    # 对训练集进行训练
    classifier.fit(vec.transform(train_words), y_train)
    # 对训练集进行预测
    train_predict = classifier.predict(vec.transform(train_words))
    # print(train_predict)
    
    from sklearn import metrics
    # 对训练集预测结果进行评估
    print(metrics.classification_report(y_train, train_predict))
    
    # 将测试集数据转换成 词向量方法:vec = CountVectorizer() 可以识别的列表类型
    test_words = []
    for line_index in range(len(x_test)):
        test_words.append(' '.join(x_test[line_index]))
    # 对测试集进行预测
    test_predict = classifier.predict(vec.transform(test_words))
    # print(test_predict)
    # 对测试集预测结果进行评估
    print(metrics.classification_report(y_test, test_predict)
    
    • 结果如下:
      在这里插入图片描述
    • 通过召回率(recall)这一评价指标可以看出此模型的效果还是不错的,但是由于优质评价和差评数据量的严重不均衡导致了精确率(precision)和 F1值(F1-score)的效果并不是很好

4、自定义数据进行预测

  • 将处理自定义评价的内容封装在函数中,传入自定义的评价,输出预测结果是优质好评还是差评

    def zidingyi(s):
    	# 分词,并存入列表中
        s_fc_2 = []
        s_fc = jieba.lcut(sentence=s)
        s_fc_2.append(s_fc)
    
        # 去停用词
        s_fc_content = drop_stopwords(s_fc_2, stopwords)
    
        # 转换为词向量 CountVectorizer 所能识别的列表类型
        test_s = []
        for line_index in range(len(s_fc_content)):
            test_s.append(' '.join(s_fc_content[line_index]))
    	# 传入模型预测结果
        yc_predict = classifier.predict(vec.transform(test_s))
        print(yc_predict)
    
    
    zidingyi(s='这玩意真好,我很喜欢')
    zidingyi(s='垃圾玩意,包装太差,很廉价的感觉')
    
    • 结果如下:
      • 在添加数据标签时规定了优质评价为 0 ,差评 为 1
      • 可以看出此模型的预测效果还是很准确的
      • 少量的预测可能不具有说服力,可以多自定义一些评价传入模型进行预测
        在这里插入图片描述

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

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

相关文章

C_11_位段,共同体,枚举

位段 位段也称 位域 ​ 1 字节 8 位域 概述: 特殊的结构体 大小按位分配 示例1: struct packed_data {unsigned int a : 2; // 占2 位unsigned int a : 4; // 占4 位unsigned int a : 6; // 占6 位unsigned int i; // 占4字节 32位 1b8位 } data…

打字练习神器与基础打字指法

先奉上链接:Learn Touch Typing Free - TypingClub 最近观察到一位计算机的学长打字哒哒哒哒停不下来,研究了一下发现是自己的指法有问题,只能从头开始学起啦。如果刚学打字的朋友们一定要学习指法,打好基础! 基础指法…

基于微信小程序的挂号管理系统-小程序端

微信小程序端系统功能实现 登录功能 系统登录功能中,用户只需在登录界面输入正确的用户名和密码,即可快速进入系统。登录功能还采用了先进的加密技术,保障用户信息的安全性,让用户能够放心使用。 注册功能 系统注册功中&#xf…

js数据类型转换-----统一转成字符串String()

String&#xff08;&#xff09; 所有类型都可以转成字符串 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"…

告别无序 10款科研项目管理工具为您的科研之路加速

国内外主流的10 款科研单位科研项目管理系统对比&#xff1a;PingCode、Worktile、Wizard、ShowDoc、Asana、ClickUp、Notion、Wrike、Basecamp、智方科研管理系统。 在选择科研项目管理系统时&#xff0c;许多科研单位都面临着如何找到能够真正满足特定需求的系统这一挑战。市…

HALCON 深度学习异常检测实例

首先你需要下载软件&#xff0c;halcon 20的版本和 Deep Learning Tool 工具 注意了&#xff0c;下载的halcon 必须要专业版的电脑系统&#xff0c;win10或者win11 都可以但是版本必须是专业版的不能是家庭版的 详情可看我另一篇文章 halcon 深度学习软件工具安装以及用法…

《高等代数》行(列)和相等行列式

说明&#xff1a;此文章用于本人复习巩固&#xff0c;如果也能帮助到大家那就更加有意义了。 注&#xff1a;1&#xff09;行&#xff08;列&#xff09;和相等行列式的求解方法是将其于行都加到第一行&#xff08;列&#xff09;&#xff0c;然后再提取第一行 …

Xilinx系ZYNQ学习笔记(一)Vivado使用说明

系列文章目录 文章目录 系列文章目录前言启示界面介绍新建工程主界面RTL分析与描述设计与综合引脚分配约束设计实现比特流文件的下载固化程序 添加源文件 前言 最近买了块xilinx的FPGA进行学习 启示界面介绍 新建工程 主界面 鼠标放在选项上时会出现中文翻译 RTL分析与描述…

基于STM32心电模块学习笔记

一、项目简介 技术原理和优势:通过医疗电子单片机高级开发系统,读取人体生理参数监测系统发送过来的心率和心电导联信息数据包,并对这两个数据包进行解包,最后,将解包之后的心率值和心电导联信息显示在OLED显示屏上,如下图所示。该实验的数据源是人体生理参数监测系统,该…

牛牛替换(c语言)

1.//描述 //牛牛有一个长度为 n 的字符数组&#xff0c;他尝试把字符数组中其中一些字符替换成另一些字符。 //输入描述&#xff1a; //第一行输入一个正整数 n 表示字符数组的长度&#xff0c;四个个字符分别 a1 和 a2 &#xff0c; a3 和 a4&#xff0c; // 表示把字符数组中…

【Unity实战】Visual Studio Debug失败

Visual Studio&#xff0c;就像以前Eclipse在Java领域中的地位一样&#xff0c;至少在Jetbrains人人皆爱之前&#xff0c;它是主流。可能对于当下来说显得臃肿&#xff0c;而且没有Jetbrains智能准确的代码分析提示&#xff0c;但是依旧能用。而且开大工程来说&#xff0c;至少…

内存管理笔记

1、内存管理简介 在计算机系统中&#xff0c;变量、中间数据一般存放在系统存储空间中&#xff0c;只有在实际使用时才将它们从存储空间调入到中央处理器内部进行运算。通常存储空间可以分为两种&#xff1a;内部存储空间和外部存储空间。内部存储空间访问速度比较快&#xff…

【Redis】缓存(上)

为什么要使用缓存&#xff1f; 在日常开发中&#xff0c;通常使用Redis来做MySQL的缓存。究其原因&#xff0c;首先&#xff0c;根据二八定律&#xff0c;20%的数据可以应对80%的请求&#xff1b;其次&#xff0c;对于MySQL这样的关系型数据库来说&#xff0c;性能普遍都不是很…

复习:存储类别内存分配动态分配内存

目录 存储类别说明符 自动变量&#xff08;auto&#xff09; 寄存器变变量&#xff08;register&#xff09; 块作用域的静态变量&#xff08;static&#xff09; 外部链接的静态变量&#xff08;external&#xff09; 内存分配 概念回顾 动态分配内存 malloc函数 free函数 回…

若依框架(前后端分离)增加手机号验证码登录

这篇文章主要介绍了如何在若依架(前后端分离)版本中集成短信验证码登录功能。文章内容包括了前后端的详细实现步骤,并通过代码示例展示了如何生成验证码、验证验证码、验证码登录、自定义的认证处理等功能的实现。 前端部分: 登录界面改造:在现有的登录界面上增加短信验证…

Spring Boot集成google Authenticator实现mfa

1.什么时候mfa&#xff1f; 多重身份验证&#xff08;MFA&#xff09;是多步骤的账户登录过程&#xff0c;它要求用户输入更多信息&#xff0c;而不仅仅是输入密码。例如&#xff0c;除了密码之外&#xff0c;用户可能需要输入发送到其电子邮件的代码&#xff0c;回答一个秘密…

GoodSync - 本地云端备份同步工具

最近几年各种加密勒索软件层出不穷&#xff0c;个人数据受到威胁。如何让风险降到最低&#xff1f;养成好的备份习惯就很重要。 GoodSync 就是你值得信赖的同步备份工具&#xff0c;能够实现多合一管理网盘、文件安全备份或同步。 文件同步、备份好助手 要在多种设备中同步文…

9.1centos安装postgres

目录 一、安装并启动postgres 二、设置允许远程连接 三、重置密码 四、开放防火墙端口 五、重启服务后进入命令行模式 六、远程连接 一、安装并启动postgres # Install the repository RPM: sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpm…

用Python实现时间序列模型实战——Day 7: ARIMA 模型的诊断与调整

一、学习内容 1. 残差分析与模型诊断 残差分析&#xff1a; 在 ARIMA 模型拟合之后&#xff0c;我们需要检查模型残差是否满足白噪声的假设。如果模型残差表现为零均值、方差恒定且无自相关性&#xff0c;这说明模型已经捕捉了时间序列中的主要结构&#xff0c;剩下的残差是…

jarbas 靶机渗透(cms 渗透)

靶机信息 vulnhub 靶机 主机发现 (base) ┌──(root㉿kali)-[/home/kali/testJarbas] └─# sudo nmap -sn 192.168.50.0/24 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-08-28 15:45 CST Nmap scan report for 192.168.50.1 Host is up (0.00023s latency). MAC …