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

本文主要是介绍【综合小项目】—— 爬取数据、数据处理、建立模型训练、自定义数据进行测试,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、项目内容
  • 二、各步骤的代码实现
    • 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 timeif __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:continueline_clean.append(word)segments_clean.append(line_clean)return segments_cleanstopwords = 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.chinasem.cn/article/1128407

相关文章

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

一文教你如何将maven项目转成web项目

《一文教你如何将maven项目转成web项目》在软件开发过程中,有时我们需要将一个普通的Maven项目转换为Web项目,以便能够部署到Web容器中运行,本文将详细介绍如何通过简单的步骤完成这一转换过程... 目录准备工作步骤一:修改​​pom.XML​​1.1 添加​​packaging​​标签1.2 添加

MySQL大表数据的分区与分库分表的实现

《MySQL大表数据的分区与分库分表的实现》数据库的分区和分库分表是两种常用的技术方案,本文主要介绍了MySQL大表数据的分区与分库分表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. mysql大表数据的分区1.1 什么是分区?1.2 分区的类型1.3 分区的优点1.4 分

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

tomcat多实例部署的项目实践

《tomcat多实例部署的项目实践》Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,本文主要介绍了tomcat多实例部署的项目实践,具有一定的参考价值,感兴趣的可... 目录1.创建项目目录,测试文China编程件2js.创建实例的安装目录3.准备实例的配置文件4.编辑实例的

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

Redis 中的热点键和数据倾斜示例详解

《Redis中的热点键和数据倾斜示例详解》热点键是指在Redis中被频繁访问的特定键,这些键由于其高访问频率,可能导致Redis服务器的性能问题,尤其是在高并发场景下,本文给大家介绍Redis中的热... 目录Redis 中的热点键和数据倾斜热点键(Hot Key)定义特点应对策略示例数据倾斜(Data S

Python使用date模块进行日期处理的终极指南

《Python使用date模块进行日期处理的终极指南》在处理与时间相关的数据时,Python的date模块是开发者最趁手的工具之一,本文将用通俗的语言,结合真实案例,带您掌握date模块的六大核心功能... 目录引言一、date模块的核心功能1.1 日期表示1.2 日期计算1.3 日期比较二、六大常用方法详