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

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

目录

一、回顾爬虫

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

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取