绘制词云图的目的是方便快捷有效的掌握一篇文中的中心概要或了解大致方向与内容。
本文我将以《摆渡人》这本书为例,进行对文本中文字的统计,并绘制词云图。
另: 本人采用python编写,本文中我是用的是pycharm进行的编译过程,配置的Anaconda环境。因为本文中涉及很多的包,单独下载过于麻烦,所以建议下载anaconda,使用anaconda中的Spyder或者Jupyter均可,使用软件不同可能在某些输出或编写上有所不同,但是不影响大致方法过程的套用。
*我是用的方法是分函数写每一个过程,这样思路也很清晰,最后主函数里在分别调用就行,读者在观看时我写的每一步都只是对应的我编写的函数,主函数内容在最后展示。 *
《摆渡人》原文txt
《摆渡人》词库txt
停用词txt
词云图背景图片png(后续用于美化词云图)
import pandas as pd
import jieba
import nltk
import jieba.analyse as ana
import wordcloud
import matplotlib.pyplot as plt
from imageio import imread
上面有一些包,例如:jieba,是anaconda环境也未带的包,有的你需要单独下载,建议参考CSDN的一些教程。
(不要惊慌,这确实是多多少少在处理中都会用到的包,你没看错,就是这么多)
这个处理看情况,如果你涉及到对文章每个章节的定位到话,可以调用,如果只是简单的分词处理就OK的话,这一步便可以省略。
我找的《摆渡人》原文txt文档打开大概是这样的:
每一章开头就会顶行开始,这样也方便我们定位。
#加入章节标识
def m_head(tmpstr):
return tmpstr[:1] #截取每一行开头的第一个字符
def m_mid(tmpstr): #为了定位章节而设立的
return tmpstr.find("章")
#章节判断
def j_chap(raw):
chapnum = 0 #获取总的章节数
for i in range(len(raw)):
if raw['head'][i] == "第" and raw['mid'][i] > 0 and raw['len'][i] < 8: #定位寻找“第~~章”开头的地方
chapnum += 1
if raw['txt'][i] =="致谢": #文末有致谢,不算入章节总数
chapnum = -1
raw.loc[i, 'chap'] = chapnum #
del raw['head']
del raw['mid']
del raw['len']
这一步导入《摆渡人》词库,直接使用jieba()函数,分词即可。
另:导入词库的目的是为了对文章分词更准确,不同文章里设定的词有所不一样,例如文章里特定的任务名称,这些都是jieba库它自身所不能识别到的。
def separate_words(raw):
dict = '《摆渡人》原文.txt路径'
jieba.load_userdict(dict) #读入文件
for i in range(len(raw)): #分行分词
' '.join(jieba.cut(raw['txt'][i]))
一些常用的语气词、标点符号,完全可以除去,更加优化最后词云图重点词汇的展示。
#去除停用词
def delete_words(raw):
ana.set_stop_words('停用词.txt路径')
word_list = []
for i in range(len(raw)):
list = ana.extract_tags(raw['txt'][i])
word_list.extend(list) #,topK=300)
#print(word_list)
return word_list
这一步最好让统计好的词频以字典或字符串的形式输出,这样都是为了后面生成词云图做准备。不过,本人这里输出的word_list是DataFrame型,在下一步操作时,本人会将此转化。
#词频统计
def tj_words(word_list):
df =pd.DataFrame(word_list,columns=['word'])
result = df.groupby(['word']).size()
frequentlist = result.sort_values(ascending=False) #降序排列
这一步我添加了对词云图的美化
#制作词云图
def word_cloud(word_list):
fdict = nltk.FreqDist(word_list) #转化格式为字典类型
image = imread('背景图片路径') #导入背景图片
#imagecolors = wordcloud.ImageColorGenerator(np.array(image))#读取背景图片是颜色,本人选的背景图片背景色不好看,所以没有使用这一步,有需要的可以使用
cloudobj = wordcloud.WordCloud(font_path="simkai.ttf", width=2000, height=2000, mode="RGBA", background_color=None,mask=image)
cloudobj.generate_from_frequencies(fdict) #生成词云图
#cloudobj.recolor(color_func=imagecolors)#将背景图颜色设置成词云图颜色
plt.imshow(cloudobj)
plt.axis("off")
plt.show()
cloudobj.to_file("词云图" + ".png") #储存生成的图片
主函数内没有太复杂的操作,主要就是调用函数,实现函数之间的连接。
if __name__ == '__main__':
raw = pd.read_csv("E://小司同学的文件//text_mining//摆渡人//摆渡人原文.txt", names=['txt'], sep='aaa', encoding="GBK") #读入原文文件
print(len(raw)) #获取本文总行数
raw['head'] = raw.txt.apply(m_head)
raw['mid'] = raw.txt.apply(m_mid)
raw['len'] = raw.txt.apply(len)
j_chap(raw)
separate_words(raw)
word_list = delete_words(raw)
tj_words(word_list)
word_cloud(word_list)