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

本文主要是介绍《机器学习》【项目】 爬虫爬取数据、数据分词、贝叶斯算法、判断分类 <完整实战详解> (全篇完结),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、回顾爬虫

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:   # 判断是否有按钮标签,没有按钮标签的话则会直接结束循环breakelse: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 pdcp_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:  # 如果分的词在停用词中,那么跳过当前循环,继续下一次循环continueline_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 pdcp_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)):   # 遍历训练集的每一条特征数据,即每个用户的评价词组,以空格为分隔符,将每个用户的所有词组转变为字符串形式存入列表wordwords.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那么将其存入列表aa.append(a0)
a1 = pd.DataFrame({'content':a},)  # 将列表a转变为DF类型,并设置列名为contenta2 = 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.chinasem.cn/article/1123033

相关文章

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

vite搭建vue3项目的搭建步骤

《vite搭建vue3项目的搭建步骤》本文主要介绍了vite搭建vue3项目的搭建步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1.确保Nodejs环境2.使用vite-cli工具3.进入项目安装依赖1.确保Nodejs环境

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

Nginx搭建前端本地预览环境的完整步骤教学

《Nginx搭建前端本地预览环境的完整步骤教学》这篇文章主要为大家详细介绍了Nginx搭建前端本地预览环境的完整步骤教学,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录项目目录结构核心配置文件:nginx.conf脚本化操作:nginx.shnpm 脚本集成总结:对前端的意义很多