使用wordcloud生成李子柒词云-趣玩Python系列五

最近在做一个的统计小工具,用到了词云和词频统计功能。 其实之前在做采集的项目时,这二个模块已经用得比较多了,在我看来,还是能归到趣玩Python系列当中的,希望对没有使用过的朋友有所帮助,直接进入正文吧!

最近李子柒更新了一个蓝印花布的视频,在微博爆火,当然,那是视频,在文章中没办法去抓里面的字幕,其实也可以实现(opencv进行处理),本文中就不再进行细说,如果有可能,下一个趣玩系列更新时我会写入到其中。

 

使用wordcloud生成李子柒词云-趣玩Python系列五

 

 

这次需要分析的文本我已经下载并保存好,起名为article.txt文件。另外我还准备了一个名为base_show.jpeg的背景文件,一会在使用的过程中我会进行使用说明。

1、先安装必要模块:

import re
import collections
import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np

 

2、新建main.py 文件 ,在头部进行引用

这次import re
import collections
import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np

 

3、定义初始化函数,初始化资源:

img = Image.open('base_show.jpeg')
img = np.array(img)

1>通过pillow的Image模块进行文件的打开一个背景图片,这个图片可以定义最后词云显示的形状。

注意:#统一使用plt进行显示,不管是plt还是cv2.imshow,在python中只认numpy.array

这里还可以使用cv2,或者 matplotlib.image 以及skimage.io 进行图片显示。

 

#读取图片资源
    fn = open('article.txt', encoding='utf-8')  # 打开文件    
    string_data = fn.read()  # 读出整个文件    
    fn.close()  # 关闭文件
    # 文本预处理    
    pattern = re.compile(u'\t|\n|\.|-|:|;|\)|\(|\?|"')
		# 定义正则表达式匹配模式    
		string_data = re.sub(pattern, '', string_data) 

2>读取需要做词频处理的文本,可以为文字,或者读取文件,使用open打开,编码为utf-8

读取写到strting_data后,关闭文件。

使用re.sub 将文字内容进行预处理

 

3>调用词云生成函数

以下为main入口内容

if __name__ == '__main__':
    #打开背景图资源    
    img = Image.open('base_show.jpeg')
    img = np.array(img)

    #读取图片资源
    fn = open('article.txt', encoding='utf-8')  # 打开文件    
    string_data = fn.read()  # 读出整个文件    
    fn.close()  # 关闭文件    
    # 文本预处理    
    pattern = re.compile(u'\t|\n|\.|-|:|;|\)|\(|\?|"')
		# 定义正则表达式匹配模式    
		string_data = re.sub(pattern, '', string_data)  
		# 将符合模式的字符去除    
    #demo 1    # 
    show_generate(string_data,img)    #demo1 使用文本显示
		# demo 2    
    #showGenerateFrequencies(string_data,img) #demo2 使用词频显示

 

4.在第四步,大家可以看到,我定义了二个显示方法,对应了二种wordcloud二词云显示数据模式,我这里简单说明一下使用环境和处理方式。

def show_generate(string_data,img): 
    wc = WordCloud(font_path='STHeiti Medium.ttc',width=800, height=600, mode='RGBA', background_color="white",mask=img).generate(string_data)
    plt.imshow(wc, interpolation='bilinear')
    plt.axis('off')
    plt.show()
    wc.to_file('show_generate.png')

1>这个方法处理方式相对来说比较简单,在实际的项目应用当中,应用的人也比较多,这里只用说明一个方法:generate

查看一下源码

generate(self, text)
=>
self.generate_from_text(text)
=>
words = self.process_text(text)
self.generate_from_frequencies(words)

最后调用的文法就是self.process_text()

process_text(text) 主要是进行分词和去噪。

具体地,它做了以下操作:

  • 检测文本编码
  • 分词(根据规则进行tokenize)、保留单词字符(A-Za-z0-9_)和单引号(')、去除单字符
  • 去除停用词
  • 去除后缀('s) -- 针对英文
  • 去除纯数字
  • 统计一元和二元词频计数(unigrams_and_bigrams) -- 可选

使用demo一,显示的结果

 

使用wordcloud生成李子柒词云-趣玩Python系列五

 

 

可以看到,这里面的分词结果并不是我们想要的,也就是说并不能满足我们的需求,这个时候我们就要用到jieba分词来进行处理了。

 

请看demo2

# 去除坐标轴
    for k in my_words:
        jieba.add_word(k)
    #
    jieba.del_word('娱乐')
    # 生成词云资源,重要参数:font_path为字体,本文使用为mac系统文字,windows可使用绝对路径的文字进行显示, background 图片的背景色,mask 图片资源 ,
    # generate: 根据
    wc = WordCloud(font_path='STHeiti Medium.ttc',width=800, height=600, mode='RGBA', background_color="white",mask=img).generate(string_data)
    plt.imshow(wc, interpolation='bilinear')
    plt.axis('off')
    plt.show()
    # 保存到文件
    wc.to_file('show_generate.png')

my_words 为我们自定义词,因为“李子柒”在词库中可能并未更新为一个名词,会分词为“李子”、“柒”,所以我们手动添加

remove_words 为无用词,比如“的”,“2008”等数字都可以进行过滤。

font_path为文字路径,请根据自己实际系统环境进行指定,

width 为宽

height为高

background_color 为背景色,也就是不显示词云的基础色

wc.to_file为保存指定文件名。

处理思路,先通过分词组件把文中所有的词都预分出来,增加自己定义的词汇,除去无用的词,再进行词频分解,最后得出结果。

直接运行:

 

使用wordcloud生成李子柒词云-趣玩Python系列五

 

 

词云的功能可以应用在数据统计,人物画像等功能上进行。

因为我只是实现demo,所以还是有很多无用词,大家在应用的时候可以进行过滤处理。

 

后记:

其实如果为了好看,可以使用第一张封面图进行词云的显示,但是有个前题是可能要进行扣图,因为我在家里关着这段时间,没有鼠标,这一步我就不再操作了,有兴趣的同学可以自己进行实现。

另:作者刚过科技认证,然后头条要求10条以上的原创,所以考虑了一下,后面我可能会先进行python学习教程的系列,趣玩系列根据实际情况再进行更新!

 

项目完整代码地址:

https://gitee.com/python_play/myWordCloud

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值