Python給小說做詞雲


  閑暇時間喜歡看小說,就想着給小說做詞雲,展示小說的主要內容。開發語言是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)
成果代碼

這樣的結果比之前進步不小。

  從詞雲上能看出不少有意思的規律,比如:有女主的小說,女主的名字出現頻率往往僅次於主角。比如路西恩與娜塔莎,郝仁與薇薇安。但是全職里陳果在詞頻上享受了女主的待遇,欽點的女主蘇沐橙反倒要仔細找才能看到。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM