r语言上机文本分析与词云绘制_倚天屠龙记的文本分析
《倚天屠龙记》作为金庸先生的经典作品,在无数人心目中留下了深刻的印象,基本上隔一段时间这部经典作品就会被重新拍成电影或者电视剧,可见观众的喜爱程度。虽然本人没有完完全全拜读过先生的这部作品,但是作为剧迷,也是刷了好几遍电视剧,对其中的人物印象颇深。
前段时间刚刚开始接触python,在python的初步入门阶段结束后,决定对《倚天屠龙记》这本经典小说进行文本分析,挖掘其中的人物关系。主要使用的软件为python,R以及Gephi,涉及到的内容为文本处理和网络分析。主要思路为:首先利用python的jieba库对文本进行分词处理,其次统计小说主要人物的出场次数以及先后次序,最后构建人物关系邻接矩阵,建立人物关系网络。
##读入文本txt = open("Documents/Python Scripts/倚天屠龙记.txt","r", encoding = "utf-8").read()repeatname = open("Documents/Python Scripts/主角名单.txt","r", encoding = "utf-8").read()#print(txt)从读入的《倚天屠龙记》文本可以看出文章有大量的标点符号,这会对后续的分词会产生影响,因此需要去掉这些标点符号。
##去掉文本的标点符号punctuation = r"""!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~“”?,!《》【】()、。:;’‘……¥·"""dicts={i:'' for i in punctuation}punc_table=str.maketrans(dicts)txt1=txt.translate(punc_table)#print(txt1)处理后的文本已经完全没有标点符号,接下来进行分词处理。
##使用python中的jieba库进行分词处理import loggingimport jiebajieba.setLogLevel(logging.INFO)##jieba库没有“杨逍”这个词,需要添加jieba.add_word("杨逍")words = jieba.lcut(txt1)分词结果包含大量的词语,为便于观察,我们绘制中文词云进行展示。
##绘制词云import wordcloudimport matplotlib.pyplot as plt w = wordcloud.WordCloud(font_path = "Documents/Python Scripts/SimHei.ttf",width = 600, height = 400)w.generate(" ".join(words))plt.imshow(w, interpolation="bilinear")plt.axis("off")plt.show()由于jieba库分词的结果会包含单独的一个字,因此从词云上可以看出使用最多的是“的”以及代词,这也符合中文书写习惯。上面的图是一个简单的词云,下的图则是根据封面上赵敏的身形绘制的词云。
##统计分词出现的次数counts = {}for word in words: if len(word) == 1: continue else: counts[word] = counts.get(word, 0) + 1items = list(counts.items())items.sort(key=lambda x:x[1], reverse=True) for i in range(15): word, count = items[i] print ("{0:<10}{1:>5}".format(word, count))| 张无忌 | 说道 | 自己 | 张翠山 | 甚么 | 一个 | 谢逊 |
| 4466 | 159 | 117 | 109 | 1015 | 969 | 94 |
| 武功 | 周芷若 | 咱们 | 教主 | 赵敏 | 心中 | 一声 |
| 884 | 792 | 783 | 756 | 752 | 689 | 677 |
在上述的分词统计中,我们没有统计单独的一个字。从分词的统计数据可以看出,张无忌是当之无愧的C位。由于分词结果包含许多文学性的词汇,而我们更想统计每个人物出场的次数,因此删掉一些排序靠前的无关词语,对出现的人物进行统计。
##删掉无关词后主角的出场次数counts = {}excludes = {"说道", "自己", "甚么", "一个", "武功", "咱们", "教主", "心中","一声","只见","少林","弟子","明教","不是","便是","不知","如何", "如此","之中","出来", "师父", "突然", "他们", "只是", "不能","我们","今日","心想","知道","二人", "两人", "不敢", "虽然", "姑娘", "这时","众人", "原来", "可是","当下","身子", "之下","你们","手中", "左手","倘若","之后","起来","登时","却是","跟着", "喝道","武当派","武当","身上","难道","长剑","脸上","峨嵋派","说话","性命","见到","这个","丐帮","魔教","不可","少林寺","兄弟", "之间","正是"}for word in words: if len(word) == 1: continue else: counts[word] = counts.get(word, 0) + 1 for word in excludes: del counts[word] items = list(counts.items())items.sort(key=lambda x:x[1], reverse=True) for i in range(15): word, count = items[i] print ("{0:<10}{1:>5}".format(word, count))张无忌 4466张翠山 1098
谢逊 944
周芷若 792
赵敏 752
殷素素 521
杨逍 509
无忌 464
张三丰 426
义父 418
灭绝师太 403
俞莲舟 362
金花婆婆 310
殷梨亭 285
俞岱岩 274
俞莲舟的出场次数竟然这么高,对这个人物完全没有印象,他是张三丰丰的第二个徒弟。由于每个人物有大量的称呼,因此在考虑多种称呼之后,对每个人物出场的次数重新进行统计。
items_word = list()for i in range(len(items) -1): items_word.append( str(items[i]).split(",")[0].strip("(''"))repeatname1 = repeatname.split("\n")count_new = list()name_new = list()for i in range(len(repeatname1) - 1): name1 = str(repeatname1[i]).split(" ") count_a = 0 for j in range(len(name1)): if j == 0: name_new.append(name1[j]) if name1[j] in items_word: word, count = items[items_word.index(name1[j])] count_a = count_a + count #print ("{0:<10}{1:>5}".format(word, count)) count_new.append(count_a)final_name_count = dict(zip(name_new, count_new))final_name_count = sorted(final_name_count.items(), key=lambda x:x[1], reverse = True)#利用R语言绘制柱状图p <- ggplot(data = count_name[1:15,], aes(x =reorder(name, - count), y = count, fill = factor(group))) # theme(panel.grid.major =element_blank(), # panel.grid.minor = element_blank(), # panel.background = element_blank(), # panel.border= element_rect( fill = NA))p + geom_bar(stat="identity") + xlab("") + ylab("") + scale_fill_manual(values = gray(0:15/15)) + theme(legend.position = "none", axis.text.x = element_text(size = 8, angle = 45, hjust = 0.5, vjust = 0.5), axis.text.y = element_text(size = 8))上述柱状图只展示了出场次数最高的前15名主角,可以看出张无忌的出场次数最高,是整本小说的核心人物,同时他的红颜(赵敏,周芷若,殷离)以及明教和武当派相关的人物出场次数也很高,这些都是小说的重点讲述内容。另外张无忌的父母张翠山和殷素素的出场次数也很靠前,一定程度上说明了作者对他们的偏爱。
对小说中人物出场的先后次数进行统计,主要通过统计每个人物在文章中的每个段落中出现的次数。
##统计人物出场的先后次序##首先对文本中人物的多种名称进行处理txt2 = txtfor i in range(len(repeatname1) - 1): name1 = str(repeatname1[i]).split(" ") for j in range(len(name1)): txt2 = txt2.replace(name1[j], name1[0])txt2 = txt.split("\n ")name_sectence = list()for j in range(len(name_new)): temp = list() for i in range(len(txt2)): txt_sectence = str(txt2[i]).replace("\n", "") temp.append(txt_sectence.count(name_new[j])) name_sectence.append(temp) draw_pciture function(a, b){ p geom_line() + xlab("") + ylab("") + ggtitle(label = b) + theme(legend.position = "none", axis.text.x = element_text(size = 8), axis.text.y = element_text(size = 8)) + theme(plot.title = element_text(size=9,hjust=0.5)) return(p)}上图只展示了和张无忌有关的8位人物出场的先后次数,可以看出张无忌基本上贯穿整本小说的始末,殷离、周芷若、赵敏、小昭等张无忌的红颜在后半段开始频繁出现,说明后半段小说中感情线是作者的一个着力点。另外殷素素和张翠山在小说刚开始的出现次数急速上升,后来就不再变化了,这和小说的情节一致。谢逊则在小说的开始和后半段出现的次数比较多,中间没有出现过,应该是自己单独在冰火岛的时候。
在考虑了人物的出场次数和先后顺序之后,开始考虑人物之间的联系,首先构建邻接矩阵,并且利用Gephi绘制网络。
##生成邻接矩阵import numpy as npadjacency_matrix = np.zeros(shape=(len(name_new), len(name_new)))for i in range(len(name_sectence[0])): temp1 = list() for j in range(len(name_new)): if name_sectence[j][i] != 0: temp1.append(j) for k in range(len(temp1)): for l in range(len(temp1)): if (k != l): adjacency_matrix[temp1[k]][temp1[l]] = adjacency_matrix[temp1[k]][temp1[l]] + 1 else: adjacency_matrix[temp1[k]][temp1[l]] = adjacency_matrix[temp1[k]][temp1[l]] + 0该网络中节点越大表示该节点的度越高,连边的颜色越重表示两个节点间的联系越强。从该网络图可以看出张无忌是整个人物关系网络的核心,他和赵敏以及周芷若的联系最多,这三个人间的感情纠葛是整本小说的重点。对人物关系网络进行社区检测,展示在下图中,整个网络共分为三个社区,不同颜色的节点代表不同的社区。张无忌周边的人组成了一个大的社区组。
总结
以上是生活随笔为你收集整理的r语言上机文本分析与词云绘制_倚天屠龙记的文本分析的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 华为语音解锁设置_华为手机备忘录的秘密功
- 下一篇: wifi卡慢延迟高_健康生活好助手:华为