用Python绘制红楼梦词云图,居然发现了这个!

Python在数据分析中愈来愈受欢迎,已经达到了统计学家对R的喜好程度,Python的拥护者们固然不会落后于R,开发了一个个好玩的数据分析工具,下面咱们来看看如何使用Python,来读红楼梦,绘制小说中的词云。python

首先固然要导入咱们须要用到的包,下面import进来的包,都是咱们将在接下来的程序中使用到的包,若是你们尚未安装它们,那么尽快安装它们吧。微信

import jiebaapp

import numpy工具

import codecs学习

import pandas编码

import matplotlib.pyplot as pltcode

from wordcloud import WordCloudblog

接着,要分析词频,就要读取咱们的《红楼梦》的文本数据,读取文本,我建议使用codecs包,它能够先经过设置文件的编码,对文件进行读入,这样子就不用边读遍转码了,很是实用。utf-8

file = codecs.open("D:\\红楼梦.txt", 'r', 'utf-8')开发

content = file.read()

file.close()

而后,咱们就来分词了,中文分词,固然要用大名鼎鼎的jieba包,下面就是分词的方法。

这里咱们须要注意两点:

一、为了提升分词的准确度,咱们最好寻找咱们分词的词库,这里我下载到了红楼梦的分词库,加载如jieba中,而后再进行分词。

二、对于小说中,一个字的词,基本上算是无用的词,或者说是标点符号,所以这里我直接抛弃了。

jieba.load_userdict('D:\\红楼梦词库.txt');

segments = []

segs = jieba.cut(content)

for seg in segs:

if len(seg)>1:

segments.append(seg);

为了方便统计词频,咱们把结果保存在pandas的DataFrame中。

segmentDF = pandas.DataFrame({'segment':segments})

接着咱们来移除停用词,停用词包括咱们平常的停用词和文言文中的停用词两部分,以下所示:

#移除停用词

stopwords = pandas.read_csv(

"D:\\StopwordsCN.txt",

encoding='utf8',

index_col=False,

quoting=3,

sep="\t"

)

segmentDF = segmentDF[~segmentDF.segment.isin(stopwords.stopword)]

wyStopWords = pandas.Series([

# 42 个文言虚词

'之', '其', '或', '亦', '方', '于', '即', '皆', '因', '仍', '故',

'尚', '呢', '了', '的', '着', '一', '不', '乃', '呀', '吗', '咧',

'啊', '把', '让', '向', '往', '是', '在', '越', '再', '更', '比',

'很', '偏', '别', '好', '可', '便', '就', '但', '儿',

# 高频副词

'又', '也', '都', '要',

# 高频代词

'这', '那', '你', '我', '他',

#高频动词

'来', '去', '道', '笑', '说',

#空格

' ', ''

]);

segmentDF = segmentDF[~segmentDF.segment.isin(wyStopWords)]

从上面的代码咱们能够看到,pandas对数据的处理,真的是很是方便,更加方便的还在下面,咱们接着来对词频进行统计。

segStat = segmentDF.groupby(

by=["segment"]

)["segment"].agg({

"计数":numpy.size

}).reset_index().sort(

columns=["计数"],

ascending=False

);

segStat.head(100)

到这里,咱们基本上能够获得词频了,观察一下下面的词频,贾宝玉固然当之无愧是主角,出现次数基本和换行符一致,哈哈,可是出乎意料的是,贾母,居然是第二,其实这也难怪,红楼梦,哪一个场景没有涉及到贾母的?贾宝玉玩完后,都说要到贾母那里请安或者吃饭的,情理之中。有此可见,最佳女配角,非贾母莫属了。

细心的读者可能也发现了,林黛玉出现的次数,居然还排在了袭人的后面,其实笔者仔细一想,一点也不奇怪。

首先第一个,林黛玉挂得早,挂得早,出现的次数天然就没有那么多了。

还有另一个缘由,不知道看官们注意到不,贾宝玉和女生滚床单,第一个就是袭人(固然秦可卿是不算的,那纯属是贾宝玉本身梦中YY的),所以,大家懂的。若是你们对贾宝玉的私生活感兴趣,能够看这篇文章《贾宝玉到底和多少人发生过性关系?》

最后要告诉你们的是,黛玉只是林黛玉的昵称,加上妹妹(只是不知道贾宝玉有多少个妹妹咯)和连名带姓的林黛玉的词频,也是超越了袭人的,所以,红楼梦符合广电总局的规定——小三是不能上位的。

segment 计数

{{14760:0}} 宝玉 3762

{{35682:0}} 贾母 1272

7738 凤姐 1192

{{34168:0}} 袭人 1134

{{40972:0}} 黛玉 1029

{{27448:0}} 王夫人 1015

{{13833:0}} 现在 1002

{{35130:0}} 说道 978

{{31820:0}} 老太太 974

{{29301:0}} 知道 973

{{36077:0}} 起来 955

{{14062:0}} 姑娘 949

7858 出来 932

4769 众人 872

821 一面 828

{{13305:0}} 太太 825

{{13686:0}} 奶奶 810

{{10094:0}} 只见 791

{{14774:0}} 宝钗 789

2211 两个 771

{{25441:0}} 没有 767

1737 不是 743

1828 不知 702

{{10940:0}} 听见 692

{{35734:0}} 贾琏 689

{{37195:0}} 进来 632

{{11053:0}} 告诉 605

2151 东西 603

{{16508:0}} 平儿 590

... ... ...

{{15894:0}} 屋里 286

{{37827:0}} 邢夫人 286

{{23866:0}} 林黛玉 278

{{15735:0}} 尤氏 277

{{39074:0}} 问道 275

{{28961:0}} 看见 271

{{14016:0}} 妹妹 270

1800 不用 265

9373 原来 258

{{40507:0}} 香菱 256

200 一句 255

{{15032:0}} 家里 254

1646 不得 254

248 一声 253

{{33649:0}} 薛蟠 253

{{14223:0}} 媳妇 249

8269 到底 247

{{36880:0}} 这会子 246

{{37178:0}} 进去 246

{{14033:0}} 姊妹 243

8129 别人 240

{{11753:0}} 回去 237

{{36611:0}} 过去 236

{{22448:0}} 明儿 236

{{21774:0}} 方才 233

{{40871:0}} 麝月 233

2446 丫环 233

{{37290:0}} 连忙 232

{{17554:0}} 心中 230

{{14200:0}} 婆子 225

为了更加方便地观察数据,咱们使用词云的工具,来绘制词云,经过词云,咱们能够更加方便简单地查看词频。

#绘画词云

wordcloud = WordCloud(

font_path='D:\\simhei.ttf',

background_color="black"

)

plt.figure(num=None, figsize=(1000, 600), dpi=800, facecolor='w', edgecolor='k')

wordcloud = wordcloud.fit_words(segStat.head(1000).itertuples(index=False))

plt.imshow(wordcloud)

plt.close()

好了,这个就是用Python绘制红楼梦词云的结果,你发现了什么玄机没有?我有一个微信公众号,常常会分享一些python技术相关的干货;若是你喜欢个人分享,能够用微信搜索“python语言学习” 

关注。欢迎你们加入千人交流答疑裙:699+749+852

相关文章
相关标签/搜索