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

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

首先当然要导入我们需要用到的包,下面import进来的包,都是我们将在接下来的程序中使用到的包,如果大家还没有安装它们,那么尽快安装它们吧。

import jieba

import numpy

import codecs

import pandas

import matplotlib.pyplot as plt

from wordcloud import WordCloud

接着,要分析词频,就要读取我们的《红楼梦》的文本数据,读取文本,我建议使用codecs包,它可以先通过设置文件的编码,对文件进行读入,这样子就不用边读遍转码了,非常实用。

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

content = file.read()

file.close()

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

这里我们需要注意两点:

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

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

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

原文地址:https://www.cnblogs.com/pythonyezi/p/9352263.html

时间: 2024-08-02 15:34:00

用Python绘制红楼梦词云图,竟然发现了这个!的相关文章

python根据文本生成词云图

python根据文本生成词云图 效果 代码 from wordcloud import WordCloud import codecs import jieba #import jieba.analyse as analyse from scipy.misc import imread import os from os import path import matplotlib.pyplot as plt from PIL import Image, ImageDraw, ImageFont

Python实现Wordcloud生成词云图的示例

wordcloud是Python扩展库中一种将词语用图片表达出来的一种形式,通过词云生成的图片,我们可以更加直观的看出某篇文章的故事梗概. 首先贴出一张词云图(以哈利波特小说为例): 在生成词云图之前,首先要做一些准备工作 1.安装结巴分词库 pip install jieba Python中的分词模块有很多,他们的功能也都是大同小异,我们安装的结巴分词 是当前使用的最多的类型. 下面我来简单介绍一下结巴分词的用法 结巴分词的分词模式分为三种: (1)全模式:把句子中所有的可以成词的词语都扫描出

红楼梦词云分析

~~~~~~~~~~~~~~~~~~~~步骤~~~~~~~~~~~~~~~~~~~~ ~~    ~~ 1):红楼梦文本 <红楼梦> 曹雪芹 高鄂 著 第一回 甄士隐梦幻识通灵 贾雨村风尘怀闺秀 列位看官:你道此书从何而来?说起根由,虽近荒唐,细按则深有趣味.待在下将此来历注明,方使阅者了然不惑. 原来女娲氏炼石补天之时,于大荒山无稽崖炼成高经十二丈.方经二十四丈顽石三万六千五百零一块.娲皇氏只用了三万六千五百块,只单单剩了一块未用,便弃在此山青埂峰下.谁知此石自经煅炼之后,灵性已通,因见众石

词云图

https://www.jianshu.com/p/4fb27471295f 现成工具 https://blog.csdn.net/zhchs2012/article/details/79062632 用Python绘制词云图 - CSDN博客 blog.csdn.net 基于我之前爬取的微博数据,制作了一批词云图,由此来讲讲此模块的使用. 分词之前先准备一下停止词,因为中文中有很多的语气词啊,副词啊等,对于我们展现词频热度是无意义的干扰词.于是,我们就想个法子把他们 ... https://b

Python将文本内容读取分词并绘制词云图

功能:Python将文本内容读取分词并绘制词云图 import matplotlib import matplotlib.pyplot as plt #数据可视化 import jieba #词语切割 import wordcloud #分词 from wordcloud import WordCloud,ImageColorGenerator,STOPWORDS #词云,颜色生成器,停止 import numpy as np #科学计算 from PIL import Image #处理图片

词云wordcloud类介绍&amp;python制作词云图&amp;词云图乱码问题等小坑

词云图,大家一定见过,大数据时代大家经常见,我们今天就来用python的第三方库wordcloud,来制作一个大数据词云图,同时会降到这个过程中遇到的各种坑, 举个例子,下面是我从自己的微信上抓的微信好友签名,制作的词云图:看来用的做多的还是"方得始终"啊 首先我们需要几个库,pip完了导入 1 import chardet #检测字符类型的类 2 from wordcloud import WordCloud #词云库 3 import matplotlib.pyplot as pl

python爬虫爬取QQ说说并且生成词云图,回忆满满!

Python(发音:英[?pa?θ?n],美[?pa?θɑ:n]),是一种面向对象.直译式电脑编程语言,也是一种功能强大的通用型语言,已经具有近二十年的发展历史,成熟且稳定.它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务.它的语法非常简捷和清晰,与其它大多数程序设计语言不一样,它使用缩进来定义语句. Python支持命令式程序设计.面向对象程序设计.函数式编程.面向切面编程.泛型编程多种编程范式.与Scheme.Ruby.Perl.Tcl等动态语言一样,Python具备垃圾回收

python 爬取视频评论生成词云图

首先爬取评论写入文件,用上一篇爬取腾讯是视频的评论的方法提取评论http://blog.51cto.com/superleedo/2126099 代码需要稍作修改如下: #!/usr/bin/env python # -*- coding: utf-8 -*- import re import urllib.request import time import urllib.error ##模拟浏览器安装headers headers=("User-Agent","Mozil

python词云图与中文分词

2019-12-12中文文本分词和词云图具体功能介绍与学习代码: import jiebaa="由于中文文本的单词不是通过空格或者标点符号来进行分割"#jieba.lcut()s是最常用的中文分词函数,用于精准模式,即将字符串分割为等量的中文词组,返回结果是列表类型print(jieba.lcut(a))#jieba.lcut(s,cut_all=True):用于全模式,即将字符串所有分词可能均列出来,返回结果是列表类型,冗余性较大,速度很快,但是不能解决歧义的问题print(jieb