标签:gdi 分割 org list white space join sci date
闲暇时间喜欢看小说,就想着给小说做词云,展示小说的主要内容。开发语言是Python,主要用到的库有wordcloud、jieba、scipy。代码很简单,首先用jieba.cut()函数做分词,生成以空格分割的字符串,然后新建WordCloud类,保存为图片。
1 #coding:utf-8 2 import sys 3 import jieba 4 import matplotlib.pyplot as plt 5 from wordcloud import WordCloud,ImageColorGenerator 6 from scipy.misc import imread 7 from datetime import datetime 8 9 novel=sys.argv[1] #‘assz.txt‘ 10 imgmask=sys.argv[2] #‘assz.jpg‘ 11 t=datetime.now() 12 resimg="word_"+novel.split(‘.‘)[0]+"_"+str(t.month)+str(t.day)+str(t.hour)+str(t.minute)+str(t.second)+".jpg" 13 14 novletext=open(novel).read() 15 hmseg=jieba.cut(novletext) 16 17 seg_space=‘ ‘.join(hmseg) 18 19 alice_color=imread(imgmask)
20#wordcloud默认不支持中文,这里的font_path需要指向中文字体,不然得到的词云全是乱码
21 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) 22 imagecolor=ImageColorGenerator(alice_color) 23 plt.imshow(fwc.recolor(color_func=imagecolor)) 24 plt.axis("off") 25 plt.show() 26 fwc.to_file(resimg)
结果如下
得到的结果很不理想,一是角色的名字被分割开,比如“路西恩”被分割成了“路西”、“恩”或者“路”、“西恩”;二是“这样”、“那样”、“他们”这样的常用词太多,盖住了其他词语,让人无法确定小说的内容。
因此在生成词云之前,还得先生成一个过滤表,把“这样”、“那样”、“他们”这样的常用词去掉,不参与词云展示。这里我选了《斗破苍穹》《回到过去变成猫》《奥术神座》《灭运图录》《一世之尊》5本书,求出词频并排序,取每本书出现频率最高的1500个词,如果一个词在这7500个词中出现两次(不含)以上,则认为是高频常用词,写入过滤表中。
1 #coding:utf-8 2 import os 3 import jieba 4 5 def ff(dd): 6 return dd[1] 7 8 def array2dic(arr): 9 segdict={} 10 for seg in arr: 11 if len(seg)<2: 12 continue 13 if seg in segdict: 14 segdict[seg]+=1 15 else: 16 segdict[seg]=1 17 return segdict 18 19 novels=[‘斗破苍穹.txt‘,‘回到过去变成猫.txt‘,‘assz.txt‘,‘mytl.txt‘,‘yszz.txt‘] 20 freq=[] 21 for novel in novels: 22 maotext=open(novel).read() 23 seglist=jieba.cut(maotext) 24 segdict=array2dic(seglist) 25 26 c=1 27 segsort=sorted(segdict.items(),key=ff,reverse=True) 28 for item in segsort: 29 #print(item[0]+‘ ‘+str(item[1])) 30 freq.append(item[0]) 31 if c==1500: 32 break 33 c+=1 34 35 freqdict=array2dic(freq) 36 freqsort=sorted(freqdict.items(),key=ff,reverse=True) 37 k=1 38 f=open(‘filter3.txt‘,‘w+‘) 39 for item in freqsort: 40 if item[1]>3: 41 f.write(item[0]+" ") 42 if k%5==0: 43 f.write("\n") 44 k+=1 45 f.close() 46 print(‘ok‘)
同时,在分词之前,添加新词,保证分词准确。修改后的代码如下
1 #coding:utf-8 2 import sys 3 import jieba 4 import matplotlib.pyplot as plt 5 from wordcloud import WordCloud,ImageColorGenerator 6 from scipy.misc import imread 7 from datetime import datetime 8 9 jieba.add_word(‘路西恩‘) 10 jieba.add_word(‘恐怖如斯‘) 11 12 def customfilter(segs): 13 filter=open(‘filter.txt‘).read() 14 resseg="" 15 for seg in segs: 16 if seg not in filter: 17 resseg+=‘ ‘+seg 18 return resseg 19 20 novel=sys.argv[1] #‘assz.txt‘ 21 imgmask=sys.argv[2] #‘assz.jpg‘ 22 t=datetime.now() 23 resimg="word_"+novel.split(‘.‘)[0]+"_"+str(t.month)+str(t.day)+str(t.hour)+str(t.minute)+str(t.second)+".jpg" 24 25 novletext=open(novel).read() 26 hmseg=jieba.cut(novletext) 27 28 seg_space=customfilter(hmseg) 29 30 alice_color=imread(imgmask) 31 32 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) 33 imagecolor=ImageColorGenerator(alice_color) 34 plt.imshow(fwc.recolor(color_func=imagecolor)) 35 plt.axis("off") 36 plt.show() 37 fwc.to_file(resimg)
这样的结果比之前进步不小。
从词云上能看出不少有意思的规律,比如:有女主的小说,女主的名字出现频率往往仅次于主角。比如路西恩与娜塔莎,郝仁与薇薇安。但是全职里陈果在词频上享受了女主的待遇,钦点的女主苏沐橙反倒要仔细找才能看到。
标签:gdi 分割 org list white space join sci date
原文地址:http://www.cnblogs.com/sunnyeveryday/p/7043399.html