python 小说 云_Python给小说做词云
閑暇時間喜歡看小說,就想著給小說做詞云,展示小說的主要內容。開發語言是Python,主要用到的庫有wordcloud、jieba、scipy。代碼很簡單,首先用jieba.cut()函數做分詞,生成以空格分割的字符串,然后新建WordCloud類,保存為圖片。
1 #coding:utf-8
2 importsys3 importjieba4 importmatplotlib.pyplot as plt5 from wordcloud importWordCloud,ImageColorGenerator6 from scipy.misc importimread7 from datetime importdatetime8
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 importos3 importjieba4
5 defff(dd):6 return dd[1]7
8 defarray2dic(arr):9 segdict={}10 for seg inarr:11 if len(seg)<2:12 continue
13 if seg insegdict:14 segdict[seg]+=1
15 else:16 segdict[seg]=1
17 returnsegdict18
19 novels=['斗破蒼穹.txt','回到過去變成貓.txt','assz.txt','mytl.txt','yszz.txt']20 freq=[]21 for novel innovels: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 insegsort: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 infreqsort: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 importsys3 importjieba4 importmatplotlib.pyplot as plt5 from wordcloud importWordCloud,ImageColorGenerator6 from scipy.misc importimread7 from datetime importdatetime8
9 jieba.add_word('路西恩')10 jieba.add_word('恐怖如斯')11
12 defcustomfilter(segs):13 filter=open('filter.txt').read()14 resseg=""
15 for seg insegs:16 if seg not infilter:17 resseg+=' '+seg18 returnresseg19
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)
成果代碼
這樣的結果比之前進步不小。
從詞云上能看出不少有意思的規律,比如:有女主的小說,女主的名字出現頻率往往僅次于主角。比如路西恩與娜塔莎,郝仁與薇薇安。但是全職里陳果在詞頻上享受了女主的待遇,欽點的女主蘇沐橙反倒要仔細找才能看到。
總結
以上是生活随笔為你收集整理的python 小说 云_Python给小说做词云的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阴阳师鬼灵歌姬怎么打?过关阵容打法是什么
- 下一篇: 非文学翻译理论与实践_北外“欧洲非通用语