(超详细期末复习版)Python数据处理综合运用之词云统计

目录

题目(本题只有问题1,问题2直接搜索就有了,他们比我写得更好):

解题路线:

1.首先简单学习request库

2.稍微了解HTML结构和正则表达式

3.找到确定信息(可以直接第四步,这一步无所谓的)

4.提取中文

5.切分并打印专业相关词汇出现次数

6.统计出现最多的十个词汇

7.词云图片制作

源代码(网站和正则表达式需要自己完成,教程在前面第一点第二点,第三点也算吧)

8. 最后

 

题目(本题只有问题1,问题2直接搜索就有了,他们比我写得更好):

 

请同学们利用requests库,在网上获得某些内容。并作以下分析: (1)设计正则表达式,匹配跟自己专业相关的词汇(例如:“人工智能”“大数据”“网络安全”、“智能科学”等。【请自行思考并选取跟自己专业相关的词汇,至少选取5个词汇】)出现的次数,并打印出来。 (2)利用词云库wordcloud,对报告内容进行词云统计,输出最终词云图片。 

解题路线:

1.request库的get方法去连接网络,然后获取源代码,进行正则表达获取内容

2.使用jieba库的lcut方法进行切分,然后匹配自己专业关联的词汇,并进行计数

3.统计内容中出现最多的十个词汇(三万多字,近一万词汇,太多了,进行词云图片将会是纯色,字太多叠加了,所以十个即可),将其做成词云图片

题目并不复杂,但是要求知识有点多,我们一步步来。

1.首先简单学习request库

该题目需要爬取信息,首先应该想到的是爬虫,但是这道题并不需要很深的技术,只需要简单的掌握request.get(url)和一些正则表达式,其中url为网址

因为爬取的信息是中文,所以需要在get()后面加上content.decode('utf-8')

r=requests.get(url).content.decode('utf-8')
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

就是这样,这句代码对于爬取中文网页信息来说是一个比较特定的代码,你也可以把content改成txt,不过有时候会错误

你们记住这个代码即可,以后可以自行搜索相关意思

这个代码运行之后, 变量 r 获得的是一整个网页的源代码,而我们想要的内容就在这些源代码里面

2.稍微了解HTML结构和正则表达式

这时候,我觉得各位应该要稍微了解一下HTML的结构

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
</html>
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

这是一个空的HTML源代码,我们网页的绝大部分内容都存在于<body>...</body>这两个标签之中,而Title,也就是标题,就不在其中,下面做个例子获取网页的标题(就是网页的名字):

import requests,re
url=''#网站可以自己找,网页名字几乎都是这样的结构
r=requests.get(url).content.decode('utf-8')
pt=re.compile('(\<title\>)([\S\s]+)(\<\/title\>)')
print(pt.search(r).group(2))
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

这个还需要导入re库,需要用到他的compile方法,进行正则表达式筛选标题

pt=re.compile('(\<title\>)([\S\s]+)(\<\/title\>)')这个也可以去掉转义字符\,变成这个

pt=re.compile('(<title>)([\S\s]+)(</title>)')
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

还是严谨一点为好,我就加上转义字符了

compile括号里面分成三部分,整个就是group(),第一部分就是group(1),所以我们想要的标题就是group(2),也就是第二部分

建议使用 [\S\s]+ 这个正则表达式取获取,获取<title>..</title>这两个标签里面全部信息

pt.search(r).group(2)  ,用pt的正则表达式找到<title>Title</title>的位置,此时group(2),就是我们想要的

通过这个例子,想必各位应该获得一点经验了

3.找到确定信息(可以直接第四步,这一步无所谓的)

为了避免爬取到多余的信息,我有几个"笨蛋"方法介绍给各位查找到信息的源代码

网页右键选审查元素,可以看到源代码

当你鼠标移到相关内容的源代码的时候,内容会有反应,一般是有区域颜色出现,表示这里就是源代码的内容

相关图片违规了就不发了,不过意思应该懂吧0.0

然后你就不断展开,再试探,直到找到包含相关内容最近的一组标签,比如这个网站内容是这个:

<div class="article ">...</div>

 中间的...就是我的内容,正则表达式就是这样:

(\<div class="article "\>)([\S\s]+)(\<\/div\>)

 当然这是个笨方法,你也可以直接把变量 r 这个源代码直接输出,去扒拉源代码,看看内容全文在哪个标签里面

其实还不懂的话可以直接不理它的,直接进入第四步,毕竟我们提几个关键词,多余的汉字总不会超过那几个关键词的频率吧

4.提取中文

#去除非中文
p=pt.search(r).group(2)#完成匹配,如果第三步不要,就把这句删掉,换成p=r
#p=r


a=re.findall('[\u4e00-\u9fa5]',p)#完成提取全部中文
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

p此时是获取了关于内容的源代码,其中有很多HTML语句,都是英语,我们可以采取findall的方法,用正则表达式去p中获取全部中文,

[\u4e00-\u9fa5] 是匹配中文的一个标准正则表达式,

我就不在后面加‘+’,如果加了,就是[\u4e00-\u9fa5]+,这样匹配返回的是中文句子形式,不方便后面判断,如果不加,就是全部单个中文字符的列表,

这时候我们在后面加上一句:

a.append('66');#因为经过上面提取中文,是没有数字了的,所以后面加个数字,便于下面while循环检测是否到了最后
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

在列表最后面添加字符'66',是为了方便后面的while判断,因为三万多字,不知道准确数字,所以列表下标不确定,添加'66'后就好判断了

之后再把这些单个中文全部集合在一起,方便后面的切分

i=0
quanwen=''
while a[i]!='66':
    m=str(a[i])
    quanwen=quanwen+m   #字符串间可以直接加,来组成新的字符串
    i=i+1
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

5.切分并打印专业相关词汇出现次数

切分用到jieba库,直接用lcut方法切分即可

b=jieba.lcut(quanwen)
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

不过切分之前,你想让一些词汇不被分开,可以自己组建词典,比如这样:

jieba.add_word("信息化")
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

然后下面定义一个关于自身专业相关词汇的列表,比如我的是:

cihui=['网络','智能化','信息化','安全','科学']

之后再从里面挨个挑出来进行计数,具体代码如下:

d = {}  # 定义一个空字典
t=0#记录储存了多少个数
cihui=['网络','智能化','信息化','安全','科学']
for i in cihui:
    d[i] = b.count(i) #count是一个计数方法,b是上面全部词语列表
print(d)#打印出现次数
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

现在问题1中的两个就完成一个了,还是挺好玩的

6.统计出现最多的十个词汇

下面代码几乎跟我上一篇文章一样,如果你不懂jieba库,也就是第五步你也不懂,可以先观看我上一篇文章,这是链接http://t.csdn.cn/lR6li


#进行统计前十个出现最多的数
g = {}  # 定义一个空字典
p1=0#记录储存了多少个数
for i in b:  #
    if len(i)==1:#清理单个中文词汇
        continue
    if i=='宋体':
        continue#因为一些网站,会表明字体,再写内容,所以爬取信息的时候,这个字体信息也会爬取,可以自己扒源代码看看是什么字体,就排除好了
    else:
        g[i] = b.count(i) #count是一个计数方法

items=list(g.items())#列表化
items.sort(key=lambda x:x[1], reverse=True)#x:x[1]以第二个元素排序,x:x[0]以第一个元素排序
#记录前十个
items=items[0:10]
#print(items)'''可以自己输出是不是前十个'''
i=0
item1=[]#初始化
while i<10:
    key,count=items[i]#将key提取出来并组成新的列表
    item1.append(key)#这样添加,而item1[i]=key,这句浓厚C语言的习惯这个是不行的
    i=i+1
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

这段代码注释还是蛮多的,我就不解释了,

具体更细一点的代码,就看我上一篇文章

7.词云图片制作

w = wordcloud.WordCloud( width=1000,height=700,font_path="msyh.ttc",max_words=25,background_color = "white")
w.generate(' '.join(item1))
w.to_file('词云照片.png')
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

除了导入wordcloud库之外,就三个部分

第一句是返回对象,这里面的参数可以自己改改玩玩,你们直接搬运就好了,最后一个参数是颜色,换上你喜欢的背景颜色吧

第二句是生成,需要注意的是那个单引号中间是有个空格的,然后后面连上join函数,item1就是前十最多词汇,' '.join(item1),这句话的意思是让后面列表类型的item1里面全部数,用空格隔开,输出就这样的:

2c2b5a51ed434e16b7bdef106bb5b9cd.png

 这样就可以通过generate方法来生成词云,

第三步就是保存生成的词云照片,没有就生成,有就覆盖

 

源代码(网站和正则表达式需要自己完成,教程在前面第一点第二点,第三点也算吧)

#数据处理综合运用
#1.爬取信息
import requests,wordcloud,re,jieba
url=''#自己找网站放入引号里面
r=requests.get(url).content.decode('utf-8')
#有些网站不给爬,或者爬取困难,就换一个网站
pt=re.compile('')#第三步.自己在里面添加正则表达式,不懂的话就删掉这句,不过我非常建议各位学会这个方法

#去除非中文
p=pt.search(r).group(2)#完成匹配,如果第三步不要,就把这句删掉,换成p=r
#p=r

a=re.findall('[\u4e00-\u9fa5]',p)#完成提取全部中文

a.append('66');#因为经过上面提取中文,是没有数字了的,所以后面加个数字,便于下面while循环检测是否到了最后

i=0
quanwen=''
while a[i]!='66':
    m=str(a[i])
    quanwen=quanwen+m   #字符串间可以直接加,来组成新的字符串
    i=i+1

#这些词语加不加都无所谓,
jieba.add_word("网络")
jieba.add_word("智能化")
jieba.add_word("信息化")
jieba.add_word("安全")
jieba.add_word("科学")
#我们专业相关于人工智能、大数据、网络安全、智能科学、软件工程等等四个字的词汇,除了人工智能提起一次外,其他为0
#但是上面两个词的词汇,就非常多也符合,我已经查过了,四个字的词汇就一两次提起,做不了wordcloud
#所以我们采用两个词的词汇,毕竟问题也没有要求多少个字的词汇0.0
b=jieba.lcut(quanwen)
print(b)
'''
因为不同网站,有些网站还可能在正文中插入一些图片,然后图片下面还有文字,
然后这些文字肯定也会被读取到,因为他们与正文都是在同一个代码段,幸好我们主要的是关键词
所以不必理会,直接提取,也不碍事
'''
'''
接下来是实验4的计数,挑选你自己的专业相关的词汇,
'''
d = {}  # 定义一个空字典
t=0#记录储存了多少个数
cihui=['网络','智能化','信息化','安全','科学']
for i in cihui:
    d[i] = b.count(i) #count是一个计数方法,b是上面全部词语列表
print(d)#打印出现次数

#下面是wordcloud

#进行统计前十个出现最多的数
g = {}  # 定义一个空字典
p1=0#记录储存了多少个数
for i in b:  #
    if len(i)==1:#清理单个中文词汇
        continue
    if i=='宋体':
        continue#因为一些网站,会表明字体,再写内容,所以爬取信息的时候,这个字体信息也会爬取,可以自己扒源代码看看是什么字体,就排除好了
    else:
        g[i] = b.count(i) #count是一个计数方法

items=list(g.items())#列表化
items.sort(key=lambda x:x[1], reverse=True)#x:x[1]以第二个元素排序,x:x[0]以第一个元素排序
#记录前十个
items=items[0:10]
print(items)
i=0
item1=[]#初始化
while i<10:
    key,count=items[i]#将key提取出来并组成新的列表
    item1.append(key)#这样添加,而item1[i]=key,这句浓厚C语言的习惯这个是不行的
    i=i+1


w = wordcloud.WordCloud( width=1000,height=700,font_path="msyh.ttc",max_words=25,background_color = "white")
w.generate(' '.join(item1))
w.to_file('词云照片.png')
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

c5c424ed0bd34e11a7ea20f4cd7666f9.png

8. 最后

代码不是完整的,希望各位稍微学习一下,有些网站是防爬的,爬取不出来信息,源代码没有想要的内容的话,你就换一个网站好了

网站就不给你们了,自己搜索就可以搜到了,每个网站的源代码都不同,所以我那个正则表达式估计也不一样,不过我上面有教各位怎么去写

6f33bd29c2ac4efea9f858ac4b1e5ae6.png

 懂了没 ,懂了没,懂了没!怕你们不懂,我注释写得够多了吧!!!!,顺便期末复习了

 

到此,问题1就正式结束啦!!!!!

问题2去搜其他人的就好啦,我时间不够了,很抱歉

有用吗?有用吗?有用吗?

有用!!     就点个免费的赞吧~~

 

  • 21
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值