• 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("
    ")
    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)
    成果代码

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

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

  • 相关阅读:
    AcWing 157. 树形地铁系统 (hash判断树同构)打卡
    AcWing 156. 矩阵 (哈希二维转一维查询)打卡
    AcWing 144. 最长异或值路径 01字典树打卡
    AcWing 143. 最大异或对 01字典树打卡
    AcWing 142. 前缀统计 字典树打卡
    AcWing 139. 回文子串的最大长度 hash打卡
    AcWing 138. 兔子与兔子 hash打卡
    常用C库函数功能及用法
    编程实现C库函数
    C语言面试题5
  • 原文地址:https://www.cnblogs.com/sunnyeveryday/p/7043399.html
Copyright © 2020-2023  润新知