《机器学习》【项目】 爬虫爬取数据、数据分词、贝叶斯算法、判断分类 <完整实战详解> (全篇完结)

news2024/11/14 20:43:19

目录

一、回顾爬虫

1、什么是爬虫

2、实操爬虫

1)寻找标签位置

2)爬取苏某某购产品好评数据

运行代码:

3)爬取差评内容

二、数据分词

1、将获取到的好评和差评数据进行初步分词

1)初步分词

2)内容如下:

2、导入停用词词库

1)导入停用词库后对上述词组进行处理

2)得到除去了停用词的词组

三、词向量转化

1、建立训练集、测试集数据

运行结果为:

2、导入词向量转换库

1)什么是词向量转换库?

2)导入

四、导入贝叶斯分类器

1、导入分类器模型

2、代码如下

运行结果为:

3、输入数据进行测试

运行结果为:

4、至此,全项目完结


一、回顾爬虫

1、什么是爬虫

        爬虫是一种自动化程序,用于在互联网上抓取提取和分析网页数据。它通过模拟人类用户的行为,访问网页并提取所需的信息,然后将这些信息保存或使用于其他目的。爬虫可以自动化地访问大量网页,并将提取到的数据用于搜索引擎索引、数据分析、舆情监控等各种应用场景。

 

2、实操爬虫

1)寻找标签位置

 

2)爬取苏某某购产品好评数据
from selenium import webdriver   # 导入浏览器驱动
from selenium.webdriver.common.by import By   # 导入驱动中的方法,用来选择定位标签的方式
# 获取需要的网页的url地址
url = "https://review.suning.com/cluster_cmmdty_review/cluster-38249278-000000012389328846-0000000000-1-good.htm?originalCmmdtyType=general&safp=d488778a.10004.loverRight.166"
driver = webdriver.Edge()   # 打开驱动,运行浏览器,用于自动化模拟真人操作
driver.get(url)   # 使用驱动发送请求,参数为请求的网址,获取到的数据全部存放在驱动中
driver.refresh()  # 用于在点击下一页的时候刷新页面
file = open('1.txt','w',encoding='utf8')  # 创建并打开一个文件,用于存放爬取到的好评数据
while True:   # 创建一个死循环,用于点击下一页按钮后再次进行页面爬取
    li_hp = driver.find_elements(By.XPATH, '//div[@class="rv-target-item"]/div')  # 获取页面中所有的评价用户标签,返回的是一个列表,包含每个标签的信息
    print(li_hp) 

    for li in li_hp:  # 遍历每一个用户的标签
        hp = li.find_element(By.XPATH,'div//div[@class="topic-body"]/p').text  # 使用属性定位,直接到p标签下,p标签下存放的是评论内容,使用text返回所有文本内容
        # print(hp)
        file.write(hp)  # 将所有的评论写入文件
    next = driver.find_element(By.XPATH,'//a[@class="next rv-maidian "]')  # 此处为定位到下一页按钮的标签位置
    if not next:   # 判断是否有按钮标签,没有按钮标签的话则会直接结束循环
        break
    else:
        next.click()  # 有按钮标签,那么使用click点击标签

 

运行代码:

此时好评文件1.txt内的内容为:(我只爬取了3000条就中断了循环)

 

3)爬取差评内容

只需要将上述代码再复制一遍,然后将其中的URL更改为下列链接即可

URL = "https://review.suning.com/cluster_cmmdty_review/cluster-38249278-000000012389328846-0000000000-1-bad.htm?originalCmmdtyType=general&safp=d488778a.10004.loverRight.166"

此处讲解同上,差评的文件存放在名为2.txt下

内容如下:此处手动增加了一行名为content,用于后期将文件转换成DateFrame格式

 

二、数据分词

1、将获取到的好评和差评数据进行初步分词

        1)初步分词
import pandas as pd

cp_content = pd.read_table(r'.\2.txt',encoding='utf8')  # 导入差评文件,将其转变为DF文件,列名为手动填入的content
yzpj_content = pd.read_table(r".\1.txt",encoding='utf8')  # 导入优质评价,将其转变为DF文件,列名为手动填入的content

# 差评分词
import jieba   # 导入分词库
cp_seqments = []  # 建立一个空列表用于存放分词过后的差评的词组

contents = cp_content.content.values.tolist()  # 将差评的DF数据的列中的值转变为列表形式,content为列号,values为列中的值,tolist是转变为列表形式
for content in contents:  # 遍历列表中的每一条评论
    results = jieba.lcut(content)   # 对每一条评论进行分词
    if len(results) >1:  # 如果分出来的词组长度大于1,那么将其增加到列表中
        cp_seqments.append(results)

cp_fc_results = pd.DataFrame({'content':cp_seqments})   # 将差评的数据转变为DF类型,并设置列名为content,每一行为每条评论分词的所有词组
cp_fc_results.to_excel('cp_fc_results.xlsx',index=False)   # 将差评DF数据保存为excel类型文件,并设置数据中不含行索引,其中同样是列名为content,每一条数据为每个用户的评价分词词组

# 优质评价分词
yzpj_segments = []   # 同样的,设置一个空列表,用于存放分词后的好评数据的词组
contents = yzpj_content.content.values.tolist()  # 将每一条好评DF数据转变成列表形式
for content in contents:   # 遍历每一条好评数据,对其进行分词
    results = jieba.lcut(content)
    if len(results)>1:   # 判断分出来的词组长度是否大于1,用于去除大量的标点符号分词等无用词组
        yzpj_segments.append(results)

yzpj_fc_results = pd.DataFrame({'content':yzpj_segments})   # 将词组数据转变为DF类型
yzpj_fc_results.to_excel('yzpj_fc_results.xlsx',index=False)   # 将每个用户的好评的词组保存为Excel格式,一行代表一个用户的评价词组

 

得到两个excel文件

        2)内容如下:

 

2、导入停用词词库

         1)导入停用词库后对上述词组进行处理
# 以DF类型导入停用词,并设置内部解释器为python类型
stopwords = pd.read_csv(r'.\红楼梦\StopwordsCN.txt',encoding='utf8',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   # 返回值为处理完的所有用户的词组列表


# 调用去除停用词函数

contents = cp_fc_results.content.values.tolist()  # cp_fc_results为上述生成的差评词组的DF类型数据,取出每个用户的分词结果,并将其转变成列表形式
stopwords = stopwords.stopword.values.tolist()   # 取出停用词的每一条数据,并将其转变成列表形式
cp_fc_contents_clean_s = drop_stopwords(contents,stopwords)  # 调用上述排除停用词函数,排除所有的停用词

contents = yzpj_fc_results.content.values.tolist()   # 这里同样对好评的数据转变成列表数据
yzpj_fc_contents_clean_s = drop_stopwords(contents,stopwords)  # 调用函数去除停用词

print(yzpj_fc_contents_clean_s)

 

        2)得到除去了停用词的词组

 

三、词向量转化

1、建立训练集、测试集数据

import pandas as pd

cp_train= pd.DataFrame({'segments_clean':cp_fc_contents_clean_s, 'label':1})  # 将上述生成的差评词组列表转换成DF类型,并设置一个类别列,里面的值全为1
yzpj_train= pd.DataFrame({'segments_clean':yzpj_fc_contents_clean_s, 'label':0})  # 将好评的分词列表转换成DF类型后设置类别为0
pj_train = pd.concat([cp_train,yzpj_train])   # 合并两个二维数据
pj_train.to_excel('pj_train.xlsx',index=False)  # 将包含所有用户的词组及评级类别保存成excel类型文件

from sklearn.model_selection import train_test_split   # 导入切分库
x_train,x_test,y_train,y_test = train_test_split(pj_train['segments_clean'].values,pj_train['label'].values, random_state=0) # 将总体数据随机切分为训练集和测试集数据

words =[]  # 定义个空列表,用于存放每个用户的评价内容,为了转换为词向量CountVectorizer所能识别的列表类型
for line_index in range(len(x_train)):   # 遍历训练集的每一条特征数据,即每个用户的评价词组,以空格为分隔符,将每个用户的所有词组转变为字符串形式存入列表word
    words.append(' '.join(x_train[line_index]))
print(words)

 

运行结果为:

 

2、导入词向量转换库

1)什么是词向量转换库?

        词向量转换库是一种用于将文本数据中的词语转换为对应的数值向量表示的工具库。它将每个词语映射到一个高维空间中的向量,以捕捉词语之间的语义和上下文关系。

2)导入
# 导入词向量转化库
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(words)  # 传入训练集的所有文字,根据文字构建模型,要将训练集 的所有单词作为词库,一会还有测试集的文本,

 

四、导入贝叶斯分类器

1、导入分类器模型

from sklearn.naive_bayes import MultinomialNB,ComplementNB

        MultinomialNB:多项式朴素贝叶斯分类器。适用于离散特征(例如,文本中单词出现的次数)的分类问题。它使用多项式分布来建模特征的概率分布。

        ComplementNB:补充朴素贝叶斯分类器。它是对多项式朴素贝叶斯分类器的一种改进,尤其适用于不平衡的数据集。它使用补充概率进行模型训练。

2、代码如下

# 导入朴素贝叶斯分类器"

from sklearn.naive_bayes import MultinomialNB,ComplementNB  # 导入分类器模型
classifier = MultinomialNB(alpha = 0.1)  # 建立贝叶斯模型,并设置平滑系数为0.1
classifier.fit(vec.transform(words),y_train)  # 将上述通过词向量转化产生的文本数据转变成特征向量,然后对其进行训练
train_pr = classifier.predict(vec.transform(words))  # 对特征向量的训练集自己进行预测
#训练集数据预测得分

from sklearn import metrics
print(metrics.classification_report(y_train, train_pr))  # 打印训练集的分类结果,参数为标签类别及预测结果

#测试集数据进行分析
test_words =[]  # 设置一个空列表用于存放每个用户评价的词组列表数据
for line_index in range(len(x_test)):  # 将每个用户的评价分词词组列表转变成一个字符串类型,然后再存入列表
    test_words.append(' '.join(x_test[line_index]))

test_pr = classifier.predict(vec.transform(test_words))  # 测试集数据预测得分
print(metrics.classification_report(y_test, test_pr))  # 分类结果
运行结果为:

3、输入数据进行测试

s = '这个玩意真好,我很喜欢'  # 设置一条评论,用于判断是好评还是差评
a = []
a0 = jieba.lcut(s)   # 将字符串评价进行切分
for i in a0:  # 遍历分词后的每一个单个词组
    if len(a0) > 1:   # 判断如果词组长度大于1那么将其存入列表a
        a.append(a0)
a1 = pd.DataFrame({'content':a},)  # 将列表a转变为DF类型,并设置列名为content

a2 = a1.content.values.tolist()  # 对DF类型的a1,取出content列的所有的值,将其转变为列表类型
a1_clean_s=drop_stopwords(a1,stopwords)    # 调用上述的去停用词函数,得到干净词组数据

word_1 = []  # 定义个空列表
for line_index in range(len(a1_clean_s)):   # 遍历上述干净词组列表的每一个数据,将其以分隔符为空格的形式取出并拼接为字符串类型
    word_1.append(' '.join(a1_clean_s[line_index]))
predict_word_1 = classifier.predict(vec.transform(word_1))  # 将字符串转变为稀疏矩阵后对其进行测试,然后输出预测类型,上述设置的0为优质评价,1为差评

print(predict_word_1)
        运行结果为:

        预测成功!

4、至此,全项目完结

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

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

相关文章

华为云征文|1分钟熟悉Flexus X实例基础操作

前言 随着云计算技术的普及,越来越多的企业和个人开始将业务迁移到云端。华为云作为国内领先的云服务提供商,推出了高性能、高可用性的Flexus云服务器X,以满足不同用户的需求。本文将详细介绍如何购买Flexus云服务器X以及初次使用时的基本操…

物联网平台组件2: 平台校验规则

加载不通的规则引擎配置文件,使用DynamicExpresso校验采集数据,得出是否告警 rules.json {"Rules": [{"Description": "温度超过阈值警报","Condition": "temperature > 30","Action":…

2024 Xiangtan University Summer Camp-Div.2 个人题解 (待补完)

前言: 教练突然发在群里的一个比赛,想到自己好像也没什么事干,就参加了个div2(太菜了),我看着好像没啥人发这玩意的题解,cf上比赛结束了也看不了别人代码,就将自己的写出题的代码分享…

鸿蒙Next 单元测试框架——hypium

一 框架概述 单元测试框架(hypium)是HarmonyOS上的测试框架,提供测试用例编写、执行、结果显示能力,用于测试系统或应用接口。 表1 单元测试框架功能特性 二 安装使用 目前hypium以npm包的形式发布, 因此需要在Deveco Studio 工程级package.json内配…

Javascript集合引用类型(一)

思维导图 Javascript集合引用类型(一)思维导图 对象 数组与定型数组 Map、WeakMap、Set以及WeakSet类型 1. Object 创建的对象的两种方式:new 操作符和对象字面量 使用对象字面量的更多,因为代码量少; 2. Array Array构造函数,es6新增…

android studio avd设置中文输入法和时间

设置语言 打开avd 找到设置 找到语言 找到系统语言 把中文移动到第一个就是默认语言了 如果想删除英文可以点击三个点有个移除 随便找个输入框,默认就是中文了 设置时间 点击设置->系统->日期和时间 关掉自动设置 选择一下时区为上海即可

【Datawhale X 李宏毅苹果书 AI夏令营】深度学习自适应学习率(AdaGrad/RMSProp/Adam)及其调度

1、自适应学习率 理论上:在训练一个网络,训练到现在参数在临界点附近,再根据特征值的正负号判断该 临界点是鞍点还是局部最小值实际上:①在训练的时候,要走到鞍点或局部最小值非常困难;②多数还未走到临界…

第十周:机器学习笔记

第十周机器学习周报 摘要Abstract机器学习——self-attention(注意力机制)1. 为什么要用self-attention2. self-attention 工作原理2.1 求α的两种方式2.2 attention-score(关联程度) Pytorch学习1. 损失函数代码实战1.1 L1loss&a…

EmguCV学习笔记 VB.Net 8.4 pyrMeanShiftFiltering

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

如何构建大型超市数据处理系统?Java SpringBoot搭配MySQL,实现高效数据管理!

🍊作者:计算机毕设匠心工作室 🍊简介:毕业后就一直专业从事计算机软件程序开发,至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长:按照需求定制化开发项目…

深入了解Pod(一)

一、pod的配置文件 Pod配置文件的属性说明 属性名称 取值类型 是否必须 取值说明 version String √ 版本号 ,例如V1 kind String √ Pod metadata Object √ 元数据 metadata.name String √ Pod名称 metadata.namespace String √…

分销渠道|中小企业可以有推广计划吗?

大家好,我是林叔,专注于分享SaaS企业渠道分销的实战经验。今天,我们来聊聊一个常被中小企业主忽视但极具潜力的营销策略——推广计划。很多人可能觉得推广计划是大企业的专利,但实际上,对于中小企业而言,它…

pycharm怎样关联anaconda虚拟环境.conda executable not found

刚下载的pycharm和anaconda怎样进行关联。 打开pycharm时,点击右侧的conda环境时,出现anaconda.conda executable not found,说明你的anaconda和pycharm没有进行关联。 第一步:重启电脑 第二步:点击圆圈中的文件夹按…

laravel8快速开发简单博客系统(二)

目录 一、创建文章增删改成提交的控制器 1、注释文章查看权限,非登录状态可以查看文章列表页 2、创建提交控制器post 3、创建数据表 4、创建提交post资源路由 5、创建post控制器view目录post 二、文章添加功能实现 1.模板显示 2.复制home.blade.php模板到po…

Django+Vue宠物服务管理系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 需要的环境3.2 Django接口层3.3 实体类3.4 config.ini3.5 启动类3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质创作者&…

探讨离线AI知识库的技术实现:AntSKPro AI 离线知识库一体机

在现代社会,离线AI解决方案越来越受到关注。最近我接触到一款名为AntSKPro AI 离线知识库一体机的设备,它能在没有网络连接的情况下提供强大的AI支持。这里我想分享一下这款设备的一些技术亮点和使用体验。 技术架构与实现 AntSKPro AI 离线知…

Java 并发编程解析 | 如何正确理解Java领域中的内存模型,主要是解决了什么问题?

苍穹之边,浩瀚之挚,眰恦之美; 悟心悟性,善始善终,惟善惟道! —— 朝槿《朝槿兮年说》 写在开头 这些年,随着CPU、内存、I/O 设备都在不断迭代,不断朝着更快的方向努力。在这个快速发…

探索Python测试的奥秘:nose库的魔法之旅

文章目录 探索Python测试的奥秘:nose库的魔法之旅1. 背景:为什么要用nose?2. nose是什么?3. 如何安装nose?4. 五个简单的库函数使用方法4.1 nose.tools.assert_true4.2 nose.tools.assert_equal4.3 nose.tools.raises4…

【通过h5作为中转页跳转到微信小程序】

1。从小程序跳转小程序内部页面 <!DOCTYPE html> <html><head><title>H5跳转小程序</title><meta charset"UTF-8"><meta name"viewport"content"widthdevice-width, initial-scale1.0, minimum-scale1.0, ma…

解释:某树的孩子兄弟链是什么意思?

&#x1f31f; 嗨&#xff0c;我是命运之光&#xff01; &#x1f30d; 2024&#xff0c;每日百字&#xff0c;记录时光&#xff0c;感谢有你一路同行。 &#x1f680; 携手启航&#xff0c;探索未知&#xff0c;激发潜能&#xff0c;每一步都意义非凡。 孩子兄弟链&#xff…