1.华小智系列 - Python基础(案例版)

《Python基础》目录

  • 第六讲:综合实战2 - 大数据分词与词云图绘制
    • 1、大数据分词技巧
    • 2、词频统计技巧
    • 3、词云图绘制
    • 4、微博词云图绘制
    • 5、课程相关资源

第六讲:综合实战2 - 大数据分词与词云图绘制

配套书籍:《Python大数据分析与机器学习商业案例实战》第16章
中文分词(Chinese Word Segmentation) 指的是将一个汉字序列切分成一个个单独的词,我们知道,在英文的行文中,单词之间是以空格作为分界符的,而中文的词语则没有一个形式上的分界符,因此在分词这一层面,中文比英文要复杂一些。

1、大数据分词技巧

1.jieba库的安装
在进行文本大数据分词前首先需要安装一个中文分词库jieba库,安装方法可以通过PIP安装法来安装,以Windows系统为例:Win + R快捷键调出运行框,输入cmd后回车,然后在弹出框中输入“pip install jieba”的方法来进行安装,如果安装失败可以尝试清华镜像pip安装法。
安装完jieba库之后就可以利用它进行分词操作了。首先回顾下13.3.2节演示的简单案例,然后我们再进行一些更深入的讲解,演示代码如下:

import jieba
word = jieba.cut('我爱北京天安门')
for i in word:print(i)

其中第1行代码引入jieba库;第2行代码通过cut()函数对里面的文本内容进行分词,分词后的结果赋给变量word;第3和4行代码通过for循环,打印分词后的结果,结果如下所示:

我
爱
北京
天安门

中文分词的核心就是利用jieba库的cut()函数来进行分词,上面演示的案例较为简单,下面以一个较长的文本内容来进行中文分词及词频统计。

2.读取文本内容,并进行分词
信托行业报告
(电脑浏览器端打开,然后点击可以下载)

下图所示为2017年的信托行业年度报告,其共有约20万字,对于业务分析人员来说,他其实关心的是这近20万字的报告中哪些内容更重要,一个简单实现手段就是看哪些词出现的频率最高,那么其对应内容的重要程度可能就越高,如果要实现这么一个功能,就需要先进行中文大数据分词然后进行词频统计。

对该txt文件中的文本内容进行分词的代码如下:

import jieba
report = open('信托行业年度报告.txt', 'r').read()
words = jieba.cut(report)

第1行引入jieba库;第2行通过open()函数打开txt文件,参数’r’表示以读取方式打开txt文件,并通过read()函数读取其中的文本内容;第3行这通过cut()函数对读取到的文本进行分词操作。
注意这里得到的words并不是一个列表,而是一个迭代器,所谓迭代器其实和列表很相似,为方便理解,可以把它理解成一个“隐身的列表”。想要获取迭代器里的元素,不能够直接通过print(words)来获取结果,而需要通过for循环才来查看迭代器里的元素,如下所示:

for word in words:print(word)

此时的结果如下图所示:

这样就能把分完的词一一打印出来了,但现实生活中我们可能只需要其中的三字词汇或者四字词汇,那么这时候就需要用到下面的处理手段了。到这里,其实分词这一关键步骤已经做完了,下面就是把结果更好地呈现出来了。
3.提取分词后的4字词
有的时候我们并不关心所有长度的词汇,因为有的两字词汇虽然出现的频率多,但其实可能没有什么特别的含义。这里我们以提取大于等于四个字的词汇为例讲解下如何按特定的要求来获取词汇,代码如下:

words = jieba.cut(report)
report_words = []
for word in words:  # 将大于等于4个字的词语放入列表if len(word) >= 4:report_words.append(word)
print(report_words)

首先创建一个report_words的列表,然后遍历words中的每一个元素,如果该词汇的长度大于等于4则把它放到report_words列表中,最后把它打印出来,结果如下:

可以看到里面有的词重复出现了很多次,比如上图圈出来的一些“信托公司”。那么这个report_words列表还可以再深度挖掘,比如希望能够统计出这个列表里的高频词汇,那么就需要用到下面的小技巧了。感兴趣的读者也可以代码中的数字4改成3或者2,看看短词的内容。

2、词频统计技巧

统计高频词汇的词频相对而言并不复杂,需要用到一个小技巧:引入collections库中的Counter()函数就可以统计列表中每个词语的频次了,代码如下:

from collections import Counter
result = Counter(report_words)
print(result)

这样便可以打印输出每个词的出现频次,如果你想看出现频次最多的前50名,那么可以利用most_common()函数来获取高频词及其出现次数,代码如下:

result = Counter(report_words).most_common(50)  # 取最多的50组

将result打印出来可以看到运行效果如下:

可以看到里面的一些高频词还是能体现出整个信托行业的一个情况的,比如最近几年的信托行业年度报告里便频繁提到信息技术与人工智能这类词,那这个可能也的确是行业未来发展的一个趋势。
完整代码如下:

import jieba  # 分词库,需要单独pip安装
from collections import Counter  # 自带的库,无需安装# 1.读取文本内容,并利用jieba.cut功能来进行自动分词
report = open('信托行业报告.txt', 'r').read()  # 可以自己打印下report看一下,就是文本内容
words = jieba.cut(report)  # 将全文分割,获取到的是一个迭代器,需要通过for循环才能获取到里面的内容# 2.通过for循环来提取words列表中大于等于4个字的词语
report_words = []
for word in words:if len(word) >= 4:  # 将大于等于4个字的词语放入列表report_words.append(word)
print(report_words)# 3.获得打印输出高频词的出现次数
result = Counter(report_words).most_common(50)  # 取最多的50组
print(result)

3、词云图绘制

在进行词云图绘制前首先需要安装一个wordcloud库,安装方法可以通过PIP安装法来安装,以Windows系统为例:Win + R快捷键调出运行框,输入cmd后回车,然后在弹出框中输入“pip install wordcloud”的方法来进行安装,如果直接安装失败可以尝试清华镜像pip安装法。
(1)词云图初步绘制
在5.1.1节我们已经获取到了分词后的结果report_words,上一节获取的都是4字以上的词语,也可以将代码中的数字4改成自定义的数字。在绘制词云图前,首先引入相关库:

from wordcloud import WordCloud  # 这个库需要单独pip安装下

引入相关库后,就可以通过如下代码绘制词云图了:

content = ' '.join(report_words)  # 把列表转换成字符串
wc = WordCloud(font_path='simhei.ttf',  # 字体background_color='white',  # 背景颜色width=1000,  # 宽度height=600,  # 高度).generate(content)  # 生成词云图
wc.to_file('词云图.png')  # 导出成png图片

第1行代码通过1.2.3节提到的join()函数(用法为:‘连接符’.join(列表名)),将列表转为字符串,并通过’ '一个空格连接列表中的元素,这样处理后的内容才符合等会词云图生成函数的数据要求;
第2-6行代码通过WordCloud()函数生成词云图,其中也可以把括号里的内容写到一行里,这里为了方便阅读,每行写一个参数。其中字体:simhei是黑体的意思,电脑默认都有该字体,simhei.ttf则是黑体字体文件。设置完参数后,便可以通过generate()函数生成词云图。
第7行代码通过to_file()函数将图片导出,这里使用的是3.3.2节提到的相对路径,也即代码所在文件夹,结果如下图所示:

(2)绘制特定形状的词云图
上面的图片还不是特别好看,这里来讲解下如何生成特定形状的词云图,首先引入相关库:

from PIL import Image
import numpy as np

PIL库是专门处理图片的库,如果电脑没有这个库的话,安装方法为:pip install pillow;numpy库是用来处理数据的库,如果是Anaconda安装的话,默认已经安装好了这个库,在笔者的《Python金融大数据挖掘与分析》第6章也有该库的详细讲解,这里简单了解即可。
引入相关库后,就可以绘制指定形状的词云图了,代码如下:

blackgroud_pic = '微博.jpg'  # 图片路径
images = Image.open(blackgroud_pic)  # 打开图片
maskImages = np.array(images)  # 将图片转为数字格式,感兴趣的可以打印它看看content = ' '.join(report_words)
wc = WordCloud(font_path='simhei.ttf',  # 字体background_color='white',  # 背景颜色width=1000,  # width是宽度,height=600,  # height是高度mask=maskImages  # 设置图片形状).generate(content)
wc.to_file('词云图+自定义形状.png')

第1行代码就是需要绘制的形状图片,例如这边要绘制的图片形状就是微博的logo形状,这里就传入“微博.jpg”,这里采用的是3.3.2节提到的相对路径,也即代码所在文件夹下的图片;
第2行代码通过PIL库的Image模块打开图片;
第3行代码通过np.array()将图片转为数组格式,其实就是将图片每一个像素点的RGB值生成一个多维数组,感兴趣的读者可以将其打印观察下,如下所示,其中255 255 255就是白色的RGB值。这三行代码了解即可,本质就是将图片转为数字格式,实际过程中直接照用就行。

[[[255 255 255][255 255 255][255 255 255]……

第10行代码设置mask形状参数,传入的就是第3行代码转为数字格式的maskImages。
最终生成结果如下图所示,此时已经有了微博logo的形状,不过颜色还是默认的颜色。

(3)绘制特定形状加特定颜色的词云图
这一节讲解下如何在生成特定形状的基础上,再加上特定颜色,首先引入相关库:

from wordcloud import WordCloud, ImageColorGenerator
from imageio import imread  # 这个库是自带的,用来读取图像

其中第1行代码从wordcloud再额外引入ImageColorGenerator模块,用来获取颜色;第2行代码引入imageio库的imread模块,用来读取图像,如果没有该库的可以pip安装下。
引入相关库后,就可以绘制指定颜色的词云图了,在之前代码基础最下面加上如下代码:

back_color = imread(blackgroud_pic)  # 读取图片
image_colors = ImageColorGenerator(back_color)  # 获取颜色
wc.recolor(color_func=image_colors)  # 词云图加上颜色wc.to_file('词云图+自定义形状+颜色.png')

第1行代码通过imread()函数读取图片,其中blackgroud_pic就是上一节的“微博.jpg”;第2行代码通过ImageColorGenerator()函数获取图片颜色;第3行代码通过recolor()函数给图片加上指定颜色,最终导出图片如下所示,可以看到除了形状外,也加上了微博logo的特定颜色:

完整代码如下:

import jieba  # 这个库需要单独pip安装下
from collections import Counter  # 这个库是自带的
from wordcloud import WordCloud, ImageColorGenerator  # 需要单独安装下
from PIL import Image  # 没有的话,通过pip install pillow安装
import numpy as np  # 这个库是自带的
from imageio import imread  # 这个库是自带的,用来读取图像# 1.读取文本内容,并利用jieba.cut功能俩进行自动分词
report = open('信托行业报告.txt', 'r').read()
words = jieba.cut(report)# 2.通过for循环来提取words列表中大于4个字的词语
report_words = []
for word in words:if len(word) >= 4:report_words.append(word)
print(report_words)# 3.绘制词云图(加上形状和颜色参数)
# 3.1 获取词云图形状参数mask
blackgroud_pic = '微博.jpg'
images = Image.open(blackgroud_pic)
maskImages = np.array(images)# 3.2 绘制词云图
content = ' '.join(report_words)
wc = WordCloud(font_path='simhei.ttf',  # 字体background_color='white',  # 背景颜色width=1000,  # width是宽度,height=600,  # height是高度mask=maskImages  # 设置图片形状).generate(content)# 3.3 修改词云图的底层颜色,这个blackgroud_pic就是之前的背景图片
back_color = imread(blackgroud_pic)  # 读取图片
image_colors = ImageColorGenerator(back_color)  # 获取颜色
wc.recolor(color_func=image_colors)  # 词云图加上颜色wc.to_file('词云图+自定义形状+颜色.png')  # 导出图片到代码所在文件夹

4、微博词云图绘制

了解了上面的知识点后,就可以结合3.6节相关知识点,绘制爬取到的微博相关内容的词云图了,首先引入相关库:

import jieba  # 这个库需要单独pip安装下
from collections import Counter  # 这个库是自带的
from wordcloud import WordCloud, ImageColorGenerator  # 需要单独pip安装
from PIL import Image  # 安装方法:pip install pillow
import numpy as np  # 这个库是自带的
from imageio import imread  # 这个库是自带的,用来读取图像
import requests
import re

然后通过3.6节相关知识点爬取并汇总每条新闻信息:

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'}# 1.获取网页源代码
url = 'https://s.weibo.com/weibo?q=阿里巴巴'
res = requests.get(url, headers=headers, timeout=10).text# 2.解析网页源代码提取信息
p_source = '<p class="txt" node-type="feed_list_content" nick-name="(.*?)">'
source = re.findall(p_source, res)
p_title = '<p class="txt" node-type="feed_list_content" nick-name=".*?">(.*?)</p>'
title = re.findall(p_title, res, re.S)# 3.清洗 & 打印 & 汇总数据
title_all = ''  # 创建一个空字符串,用来汇总数据
for i in range(len(title)):title[i] = title[i].strip()title[i] = re.sub('<.*?>', '', title[i])title_all = title_all + title[i]  # 通过字符串拼接,汇总数据print(str(i + 1) + '.' + title[i] + '-' + source[i])

这里较之前的代码多了一个汇总数据的过程,也就是上面的第14行和第18行代码,通过字符串拼接可以将所有新闻汇集成一个大字符串。
然后通过5.3.1节相关知识点进行分词,代码如下:

# 4.读取文本内容,并利用jieba.cut功能俩进行自动分词
words = jieba.cut(title_all)  # 传入的就是上面汇总的title_all# 5.通过for循环来提取words列表中大于2个字的词语
report_words = []
for word in words:if len(word) >= 2:report_words.append(word)
print(report_words)# 6.获得打印输出高频词的出现次数
result = Counter(report_words).most_common(50)  # 取最多的50组
print(result)

最终通过5.3.2节相关代码绘制词云图:

# 7.绘制词云图(加上形状和颜色)
# 7.1 获取词云图形状参数mask
blackgroud_pic = '微博.jpg'
images = Image.open(blackgroud_pic)
maskImages = np.array(images)# 7.2 绘制词云图
content = ' '.join(report_words)
wc = WordCloud(font_path='simhei.ttf',  # 字体,simhei是黑体的意思background_color='white',  # 背景颜色width=1000,  # width是宽度,height=600,  # height是高度mask=maskImages  # 设置图片形状).generate(content)# 7.3 修改词云图的底层颜色,这个blackgroud_pic就是之前的背景图片
back_color = imread(blackgroud_pic)  # 读取图片
image_colors = ImageColorGenerator(back_color)  # 获取颜色
wc.recolor(color_func=image_colors)  # 词云图加上颜色wc.to_file('微博内容词云图.png')

最终生成图片如下所示:
汇总代码如下:

import jieba  # 这个库需要单独pip安装下
from collections import Counter  # 这个库是自带的
from wordcloud import WordCloud, ImageColorGenerator  # 这个库需要单独pip安装下
from PIL import Image  # 这个库是自带的,如果没有的话,就pip安装下:pip install pillow
import numpy as np  # 这个库是自带的
from imageio import imread  # 这个库是自带的,用来读取图像
import requests
import re
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'}# 1.获取网页源代码
url = 'https://s.weibo.com/weibo?q=阿里巴巴'
res = requests.get(url, headers=headers, timeout=10).text# 2.解析网页源代码提取信息
p_source = '<p class="txt" node-type="feed_list_content" nick-name="(.*?)">'
source = re.findall(p_source, res)
p_title = '<p class="txt" node-type="feed_list_content" nick-name=".*?">(.*?)</p>'
title = re.findall(p_title, res, re.S)# 3.清洗 & 打印 & 汇总数据
title_all = ''  # 创建一个空字符串,用来汇总数据
for i in range(len(title)):title[i] = title[i].strip()title[i] = re.sub('<.*?>', '', title[i])title_all = title_all + title[i]  # 通过字符串拼接,汇总数据print(str(i + 1) + '.' + title[i] + '-' + source[i])# 4.读取文本内容,并利用jieba.cut功能俩进行自动分词
words = jieba.cut(title_all)  # 将全文分割,获取到的是一个迭代器,需要通过for循环才能获取到里面的内容# 5.通过for循环来提取words列表中大于2个字的词语
report_words = []
for word in words:if len(word) >= 2:report_words.append(word)
print(report_words)# 6.获得打印输出高频词的出现次数
result = Counter(report_words).most_common(50)  # 取最多的50组
print(result)# 7.绘制词云图(加上形状和颜色)
# 7.1 获取词云图形状参数mask
blackgroud_pic = '微博.jpg'
images = Image.open(blackgroud_pic)
maskImages = np.array(images)# 7.2 绘制词云图
content = ' '.join(report_words)
wc = WordCloud(font_path='simhei.ttf',  # 字体,simhei是黑体的意思,电脑默认都有该字体background_color='white',  # 背景颜色width=1000,  # width是宽度,height=600,  # height是高度mask=maskImages  # 设置图片形状).generate(content)# 7.3 修改词云图的底层颜色,这个blackgroud_pic就是之前的背景图片
back_color = imread(blackgroud_pic)  # 读取图片
image_colors = ImageColorGenerator(back_color)  # 获取颜色
wc.recolor(color_func=image_colors)  # 词云图加上颜色wc.to_file('微博内容词云图.png')

5、课程相关资源

拓展:Python进阶的其他应用
https://shimo.im/docs/vp6KVJXR8tqWxgXR/ 《华小智智能平台课程(课表)》,可复制链接后用石墨文档 App 或小程序打开

Python软件下载地址
2020软件最新安装教程(附软件):https://shimo.im/docs/Y6cG9gx8djkvT86R/ 《Python 2020最新安装教程(巨详细版)》

备选:Anaconda(这个就是Python的安装包)&Pycharm&Wampserver网盘下载地址:
链接: https://pan.baidu.com/s/1DWJ5ptC7jrkNr5IXPkD9Rw 提取码: p8w8

课程源代码地址
获取方式1:石墨文档获取

(电脑浏览器端打开(需微信扫码登录石墨文档),然后点击下载)

获取方式2:个人网站获取
访问笔者个人网站的下载专区:edu.huaxiaozhi.com/download,然后点击下载。

获取方式3:微信号获取
添加如下微信:huaxz001,和小助理沟通获取源代码。

京东链接:https://search.jd.com/Search?keyword=王宇韬,搜索“王宇韬”,在淘宝、当当也可购买。加入学习交流群,可以添加如下微信:huaxz001(请注明缘由)。

各类课程可在网易云、51CTO** 搜索王宇韬,进行查看。

本课程 Python基础(案例版):可在网易云、51CTO 查看。(点击可直接获取。)

小白都能学会的Python基础 第六讲:综合实战2 - 大数据分词与词云图绘制相关推荐

  1. 小白都能学会的Python基础 第五讲:综合实战1 - 商业实战之德勤笔试题

    1.华小智系列 - Python基础(案例版) <Python基础>目录 第五讲:综合实战1 - 商业实战之德勤笔试题 1.德勤笔试题分析 2.笔试题讲解 3.课程相关资源 第五讲:综合实 ...

  2. 小白都能学会的Python基础 第四讲:Python函数与模块

    1.华小智系列 - Python基础(案例版) <Python基础>目录 第四讲:Python函数与模块 1.函数的定义与调用 2.函数参数与返回值 2.1 参数再研究 2.2 返回值 2 ...

  3. 小白都能学会的Python基础 第七讲:综合实战3 - 文字识别、人脸识别实战

    1.华小智系列 - Python基础(案例版) <Python基础>目录 第七讲:综合实战3 - 文字识别.人脸识别实战 1.Python图片文字识别(OCR) 2.Python人脸识别( ...

  4. 小白都能学会的Python基础 第二讲:Python基础知识

    1.华小智系列 - Python基础(案例版) <Python基础>目录 第二讲:Python基础知识 1.变量.行与缩进 2.数据类型:数字与字符串 3.列表与字典 4.运算符介绍与实践 ...

  5. python网易云收费_小白都能学会的Python爬虫网易云音乐

    配置基础 python Selenium Chrome浏览器(其它的也可以,需要进行相应的修改) 分析 如果爬取过网易云的网站的小伙伴都应该知道网易云是有反爬取机制的,POST时需要对一些信息的参数进 ...

  6. 小学生都能学会的Python基础语法——代码规范判断语句循环语句

    前言: Python 语言与 Perl,C 和 Java 等语言有许多相似之处.但是,也存在一些差异,在本章中我们将来学习 Python 的基础语法,让你快速学会 Python 编程. 一.代码的执行 ...

  7. 初学者都能学会的Python基础网页抓爬万能代码(仅限无反爬网站)

    今天我要和大家分享一个比较基础.简单的抓爬网页文本内容的代码. 实现这个功能非常简单,他主要就是基于一个最最基础的python爬虫包--requests. 抓爬普通网页我们只需要把它分成几步就可以完成 ...

  8. 小白都能学会的python+opencv,带你从人脸识别做到车牌识别,成为别人口中赞叹的高手!

    一.第一步,对于小白来说,用什么编辑很难选择,怎么下载免费的编辑器也不会,会用电脑下载的又总是被下载许多附带的垃圾软件,这个问题让我来解决,这里我们首先需要安装两个软件以及配置一个pip豆瓣源,第一个 ...

  9. 人人都能学会的python编程教程(基础篇)完整版

    人人都能学会的python编程教程1:第一行代码 人人都能学会的python编程教程2:数据类型和变量 人人都能学会的python编程教程3:字符串和编码 人人都能学会的python编程教程4:关系运 ...

最新文章

  1. Python 3 利用机器学习模型 进行手写体数字检测
  2. python 列表 随机采样_Python 随机抽样
  3. windows2008下 IIS7 HTTP 错误 404.2 - Not Found 解决方法(图文)
  4. html5中的css特性,浅谈HTML5 CSS3的新交互特性
  5. 中国十大科技进展2项,世界十大科技进展6项生物相关;相比工程,生物与国际差距还是较大...
  6. mysql 实现master-slave 同步
  7. linux 临时去掉cp别名_Linux 命令别名
  8. python爬虫模拟点击下拉菜单和_python+selenium爬虫过程中的模拟点击问题
  9. 后台管理系统、商品管理、商品发布、商品回收、订单管理、退款管理、运营管理、商城设置、导航分类、营销管理、优惠券套餐、数据统计、活跃用户、数据埋点、财务管理、对账单、财务数据、账户资产、电商后台
  10. CoreAnimation-CATransform3D特效
  11. CENTOS利用Keepalived构建双主MySQL+双机热备
  12. Mybatis 查询出来的数据数量正确,但是具体数据为null
  13. 【YY手机】用AVR单片机制作手机系列教程-基础篇
  14. 错误:“应用程序无法启动,因为应用程序的并行配置不正确。请参阅应用程序事件日志,或使用命令行sxstrace.exe工具” 的解决
  15. 蓝墨云班课计算机网络答案,基于蓝墨云班课的 《计算机网络与应用》实验课 教学改革探究...
  16. Python地理地图可视化:plotly连接mapbox多个地理经纬度中心点line+marker
  17. 创新工场 DeeCamp 2019 人工智能训练营启动报名,计划招收至少 600 名大学生...
  18. AndroidStudio 制作一个超简易记账本App(1.0)【含详细步骤】
  19. Teach repeat replan 安装中遇到的问题记录
  20. 【linux】记一次linux(centos)被暴力破解事件,从修改linux默认登录端口为普通账号授权到linux基础操作命令

热门文章

  1. 鼠标右键一直旋转无反应的解决方法
  2. 消防部队应急通信保障---多链路聚合通信系统音视频图传方案详解
  3. linux filo顺序是什么意思,嵌入式系统复习 南京邮电大学 期末复习 答案 提纲
  4. JpGraph生成图表
  5. 2020最新软件著作权申请流程(阿里云代理)
  6. 聆听音乐,阅毒木圣经
  7. 2021/4/27课堂总结和作业
  8. 论坛discuz建站视频教程共90集
  9. 从键盘输入10个整数,检查整数5是否包含在这些数据中,若是的话,找出它是第几个被输入的。
  10. 求助一个关于顶帖机的思路