python制作《鹿鼎记》的词云

欢迎加入我们卧虎藏龙的python讨论qq群:729683466

导 语 ●

上一次爬取了《鹿鼎记》

做完之后

还想在这个基础上做点什么

想来想去

发现可以做一个词云

于是就有了今天这一期

代码及相关资源获取

1:关注“python趣味爱好者”公众号,回复“ 词云”获取源代码

  

效果演示

这是用一匹小马作为背景的效果图,其中出现频率最高的是韦小宝,然后是小郡主,太后,刺客之类的,其实熟悉鹿鼎记的朋友,看了这个图就知道是哪一节。

往期精选

python爬取《鹿鼎记》小说

 ????

开发工具

python3.6.4,第三方库:matplotlib,jieba,wordcloud,cv2

讲解部分

一:前期准备

词云是对文本进行关键词提取,然后将这些关键词作为标签进行可视化的一种技术。在写词云的python程序前,首先要进行一些准备,第一是找到一个分词的txt文本,这个文本里面主要就是一些“分词”或者符号。

还要准备一个图片作为背景,这里我们选择的是《疯狂动物城》里面的卡通形象尼克,也可以选择其他的,比如一个卡通的马,但是选择的图片最好是经过抠图处理的。否则词云会在整个图片上全部显示出来。

还要准备一个字体的tff文件,用于在词云图片中显示文件。

另外就是准备一些第三方库。制作词云需要几个比较重要的模块,第一是matplotlib模块,作用是画图。还有一个jieba模块,作用是对文本进行分词处理,cv2模块可以读取词云的背景图片。当然,也可以用PIL,scipy等第三方库读取图片,还有一个最重要的模块,就是WordCloud,其中有两个函数,第一是WordCloud,另一个是ImageColorGenerator。前者可以用于生成词云,后者用于生成词云的颜色。

二:代码逻辑

       首先需要读取背景图片,我们用的背景图片是《疯狂动物城》里面的尼克,可以用imread读取,然后设置词云的属性,这里直接调用函数WordCloud,首先设置字体的路径,当前我们用到的字体是“msyh.ttf”。

back_coloring = imread("huli.jpeg")# 设置背景图片
# 设置词云属性
wc = WordCloud(font_path='msyh.ttf', background_color="white", max_words=1300, mask=back_coloring,
               max_font_size=100,random_state=42,width=1400, height=860, margin=2,)

词云背景颜色设计成白色,词语的数量设置成1300,之后就是设置字号,长宽之类的。

随后,调用jieba模块对文本进行分词处理将这个分词的代码打包成一个get1函数,然后调用。

def get1(list):
    for items in list:
        jieba.add_word(items)
get1(my_words_list)

之后是读取文本,我们选取的是《鹿鼎记》,但是鹿鼎记文字太多了,处理起来肯定是非常耗时间。于是我们只选择了鹿鼎记的《第十一回 春辞小院离离影 夜受轻衫漠漠香》(就是沐剑屏和韦小宝在皇宫那一节)。打开这个文本的方式也很简单,就是用open打开,打开的文本编码格式是“utf-8”。

然后定义一个change函数。

def change(text):
    mywordlist = []
    seg_list = jieba.cut(text, cut_all=False)
    liststr="/ ".join(seg_list)
    f_stop = open('stop_word.txt',encoding='utf-8')
    try:
        f_stop_text = f_stop.read()
        f_stop_text = str(f_stop_text)
    finally:
        f_stop.close( )
    f_stop_seg_list=f_stop_text.split('\n')
    for myword in liststr.split('/'):
        if not(myword.strip() in f_stop_seg_list) and len(myword.strip())>1:
            mywordlist.append(myword)
    return ''.join(mywordlist)

在其中先设置一个mywordlist空列表,然后用jieba切割这个原始的文本,然后打开stop_word.txt,编码格式也是utf-8。之后用一个if条件判断,判断当前这个词语是不是在分词里面,如果不在分词里面,就添加到列表中。这个文本中存储的就是常见的分词的符号或者名词介词等,用这些词语可以对原始文本进行分割,最后利用生成的词云,产生相关的文本,然后生成相关的颜色,最后将这些文本显示出来。

text = change(text)
wc.generate(text)
image_colors = ImageColorGenerator(back_coloring)
plt.figure()
plt.imshow(wc)

三:完整代码

import matplotlib.pyplot as plt
import jieba
from os import path
from wordcloud import WordCloud, ImageColorGenerator
from cv2 import imread




back_coloring = imread("huli.jpeg")# 设置背景图片
# 设置词云属性
wc = WordCloud(font_path='msyh.ttf', background_color="white", max_words=1300, mask=back_coloring,
               max_font_size=100,random_state=42,width=1400, height=860, margin=2,)
# 添加自己的词库分词
my_words_list = ['材料']
def get1(list):
    for items in list:
        jieba.add_word(items)
get1(my_words_list)
text = open('第十一回.txt',encoding='utf-8').read()
def change(text):
    mywordlist = []
    seg_list = jieba.cut(text, cut_all=False)
    liststr="/ ".join(seg_list)
    f_stop = open('stop_word.txt',encoding='utf-8')
    try:
        f_stop_text = f_stop.read()
        f_stop_text = str(f_stop_text)
    finally:
        f_stop.close( )
    f_stop_seg_list=f_stop_text.split('\n')
    for myword in liststr.split('/'):
        if not(myword.strip() in f_stop_seg_list) and len(myword.strip())>1:
            mywordlist.append(myword)
    return ''.join(mywordlist)


text = change(text)
wc.generate(text)
image_colors = ImageColorGenerator(back_coloring)
plt.figure()
plt.imshow(wc)
plt.axis("off")
plt.show()

作者|齐

编辑|齐

感谢大家观看

有钱的老板可打赏一下小编哦

扫描二维码

关注我们

QQ群:729683466

◰  

参考来源

背景图片:百度图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值