闲暇时间喜欢看小说,就想着给小说做词云,展示小说的主要内容。开发语言是Python,主要用到的库有wordcloud、jieba、scipy。代码很简单,首先用jieba.cut()函数做分词,生成以空格分割的字符串,然后新建WordCloud类,保存为图片。

 #coding:utf-8
import sys
import jieba
import matplotlib.pyplot as plt
from wordcloud import WordCloud,ImageColorGenerator
from scipy.misc import imread
from datetime import datetime novel=sys.argv[1] #'assz.txt'
imgmask=sys.argv[2] #'assz.jpg'
t=datetime.now()
resimg="word_"+novel.split('.')[0]+"_"+str(t.month)+str(t.day)+str(t.hour)+str(t.minute)+str(t.second)+".jpg" novletext=open(novel).read()
hmseg=jieba.cut(novletext) seg_space=' '.join(hmseg) alice_color=imread(imgmask)
#wordcloud默认不支持中文,这里的font_path需要指向中文字体,不然得到的词云全是乱码
 fwc=WordCloud(font_path='msyh.ttc',max_words=700,background_color='white',mask=alice_color,max_font_size=100,font_step=1).generate(seg_space)
imagecolor=ImageColorGenerator(alice_color)
plt.imshow(fwc.recolor(color_func=imagecolor))
plt.axis("off")
plt.show()
fwc.to_file(resimg)

结果如下

  得到的结果很不理想,一是角色的名字被分割开,比如“路西恩”被分割成了“路西”、“恩”或者“路”、“西恩”;二是“这样”、“那样”、“他们”这样的常用词太多,盖住了其他词语,让人无法确定小说的内容。

  因此在生成词云之前,还得先生成一个过滤表,把“这样”、“那样”、“他们”这样的常用词去掉,不参与词云展示。这里我选了《斗破苍穹》《回到过去变成猫》《奥术神座》《灭运图录》《一世之尊》5本书,求出词频并排序,取每本书出现频率最高的1500个词,如果一个词在这7500个词中出现两次(不含)以上,则认为是高频常用词,写入过滤表中。

 #coding:utf-8
import os
import jieba def ff(dd):
return dd[1] def array2dic(arr):
segdict={}
for seg in arr:
if len(seg)<2:
continue
if seg in segdict:
segdict[seg]+=1
else:
segdict[seg]=1
return segdict novels=['斗破苍穹.txt','回到过去变成猫.txt','assz.txt','mytl.txt','yszz.txt']
freq=[]
for novel in novels:
maotext=open(novel).read()
seglist=jieba.cut(maotext)
segdict=array2dic(seglist) c=1
segsort=sorted(segdict.items(),key=ff,reverse=True)
for item in segsort:
#print(item[0]+' '+str(item[1]))
freq.append(item[0])
if c==1500:
break
c+=1 freqdict=array2dic(freq)
freqsort=sorted(freqdict.items(),key=ff,reverse=True)
k=1
f=open('filter3.txt','w+')
for item in freqsort:
if item[1]>3:
f.write(item[0]+" ")
if k%5==0:
f.write("\n")
k+=1
f.close()
print('ok')

同时,在分词之前,添加新词,保证分词准确。修改后的代码如下

 #coding:utf-8
import sys
import jieba
import matplotlib.pyplot as plt
from wordcloud import WordCloud,ImageColorGenerator
from scipy.misc import imread
from datetime import datetime jieba.add_word('路西恩')
jieba.add_word('恐怖如斯') def customfilter(segs):
filter=open('filter.txt').read()
resseg=""
for seg in segs:
if seg not in filter:
resseg+=' '+seg
return resseg novel=sys.argv[1] #'assz.txt'
imgmask=sys.argv[2] #'assz.jpg'
t=datetime.now()
resimg="word_"+novel.split('.')[0]+"_"+str(t.month)+str(t.day)+str(t.hour)+str(t.minute)+str(t.second)+".jpg" novletext=open(novel).read()
hmseg=jieba.cut(novletext) seg_space=customfilter(hmseg) alice_color=imread(imgmask) fwc=WordCloud(font_path='msyh.ttc',max_words=700,background_color='white',mask=alice_color,max_font_size=100,font_step=1).generate(seg_space)
imagecolor=ImageColorGenerator(alice_color)
plt.imshow(fwc.recolor(color_func=imagecolor))
plt.axis("off")
plt.show()
fwc.to_file(resimg)

成果代码

这样的结果比之前进步不小。

  从词云上能看出不少有意思的规律,比如:有女主的小说,女主的名字出现频率往往仅次于主角。比如路西恩与娜塔莎,郝仁与薇薇安。但是全职里陈果在词频上享受了女主的待遇,钦点的女主苏沐橙反倒要仔细找才能看到。

Python给小说做词云的更多相关文章

  1. 如何用Python做词云(收藏)

    看过之后你有什么感觉?想不想自己做一张出来? 如果你的答案是肯定的,我们就不要拖延了,今天就来一步步从零开始做个词云分析图.当然,做为基础的词云图,肯定比不上刚才那两张信息图酷炫.不过不要紧,好的开始 ...

  2. 一步一步教你如何用Python做词云

    前言 在大数据时代,你竟然会在网上看到的词云,例如这样的. 看到之后你是什么感觉?想不想自己做一个? 如果你的答案是正确的,那就不要拖延了,现在我们就开始,做一个词云分析图,Python是一个当下很流 ...

  3. 如何用Python 制作词云-对1000首古诗做词云分析

    公号:码农充电站pro 主页:https://codeshellme.github.io 今天来介绍一下如何使用 Python 制作词云. 词云又叫文字云,它可以统计文本中频率较高的词,并将这些词可视 ...

  4. python3做词云分析

    python3做词云 其实词云一般分为两种,一个是权重比,一个是频次分析 主要还是体现在自然语言方向,难度较大,但这里我们用jieba词库 主要思路, 后端算数据+前端生成图(D3-cloud-好像是 ...

  5. 做词云时报错cannot import name ‘WordCloud‘ from partially initialized module ‘wordcloud‘的解决办法

    问题: 在做词云时,运行时出现该问题,wordcloud安装成功,但运行出错,错误提示是:cannot import name 'WordCloud' from partially initializ ...

  6. 用Python做词云可视化带你分析海贼王、火影和死神三大经典动漫

    对于动漫爱好者来说,海贼王.火影.死神三大动漫神作你肯定肯定不陌生了.小编身边很多的同事仍然深爱着这些经典神作,可见"中毒"至深.今天小编利用Python大法带大家分析一下这些神作 ...

  7. 用Python和WordCloud绘制词云(内附让字体清晰的秘笈)

    环境及模块: Win7 64位 Python 3.6.4 WordCloud 1.5.0 Pillow 5.0.0 Jieba 0.39 目标: 绘制安徽省2018年某些科技项目的词云,直观展示热点. ...

  8. 【python数据挖掘】使用词云分析来分析豆瓣影评数据

    概述: 制作词云的步骤: 1.从文件中读取数据 2.根据数据追加在一个字符串里面,然后用jieba分词器将评论分开 3.设置WordCloud词云参数 4.保存最后的结果 数据:使用爬取的豆瓣影评数据 ...

  9. 使用python制作大数据词云

    1 from wordcloud import WordCloud 2 import PIL.Image as image 3 import numpy as np 4 import jieba 5 ...

随机推荐

  1. poj2352树状数组

    Astronomers often examine star maps where stars are represented by points on a plane and each star h ...

  2. 极光的开源礼物「Aurora IMUI」

    今日,奉上我们拙作,仅为开源世界献出绵薄之力. Aurora IMUI,一个通用的即时通讯(IM)UI 库.不局限于任何 IM SDK. 本 UI 库提供了消息列表.输入视图等常用组件. 初心 过去的 ...

  3. MySQL事件调度器event的使用

    Q:假设,有一个需求,希望在某一个时刻系统调用一个begin end执行一下:十分钟以后执行一下begin end.亦或有一个需求,每个多长时间周期性执行begin end.那么这个时候该怎么办呢? ...

  4. java文件创建和删除

    流的操作在项目开发中用的很普遍,虽然每次在网上都可以百度到,但是总感觉心里不踏实,对此,关于流的操作做一个详细的总结--- 1.根据数据的流向来分:输出流:是用来写数据的,是由程序(内存)---> ...

  5. Node.js编写CLI的实践

    导语:通常而言,Node.js的应用场景有前后端分离.海量web页面渲染服务.命令行工具和桌面端应用等等.本篇文章选取CLI(Command Line Tools)这子领域,来谈谈Node.js编写C ...

  6. js算法集合(一) 水仙花数 及拓展(自幂数的判断)

    js算法集合(一) ★ 最近有些朋友跟我说对js中的一些算法感到很迷惑,知道这个算法到底是怎么回事,但是就是不会用代码把它写出来,这里我跟大家分享一下做水仙花数的算法的思路,并对其扩展到自幂数的算法, ...

  7. loadrunner提高篇-场景设计实践

    集合点设置 一.为什么要进行集合点设置? 因为在测试过程中,并不能保证所有的Vuser都在同一时刻进行操作,这样就达不到并发测试的目的,故需要用到集合点技术,集合点的意思是如果在一个操作之前设置了一个 ...

  8. 《大型网站系统与JAVA中间件实践学习笔记》-1

    第一章:分布式系统介绍 定义:分布式系统是一组分布在网络上通过消息传递进行协作的计算机组成系统. 分布式系统的意义 升级单机处理能力的性价比越来越低 单机处理器能力存在瓶颈 处于稳定性和可用性考虑 阿 ...

  9. JAVA并发编程实战---第二章:线程安全性

    对象的状态是指存储在状态变量中的数据.对象的状态可能包括其他依赖对象的域.例如HashMap的状态不仅存储在HashMap本身,还存储在许多Map.Entry对象中.对象的状态中包含了任何可能影响其外 ...

  10. JavaScript、Python、java、Go算法系列之【快速排序】篇

    常见的内部排序算法有:插入排序.希尔排序.选择排序.冒泡排序.归并排序.快速排序.堆排序.基数排序等. 用一张图概括: 选择排序 选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的 ...