1.华小智系列 - Python基础(案例版)
配套书籍:《Python大数据分析与机器学习商业案例实战》第16章
中文分词(Chinese Word Segmentation) 指的是将一个汉字序列切分成一个个单独的词,我们知道,在英文的行文中,单词之间是以空格作为分界符的,而中文的词语则没有一个形式上的分界符,因此在分词这一层面,中文比英文要复杂一些。
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,看看短词的内容。
统计高频词汇的词频相对而言并不复杂,需要用到一个小技巧:引入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)
在进行词云图绘制前首先需要安装一个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') # 导出图片到代码所在文件夹
了解了上面的知识点后,就可以结合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')
拓展: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(请注明缘由)。