欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

r语言上机文本分析与词云绘制_倚天屠龙记的文本分析

发布时间:2024/10/5 编程问答 37 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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))
张无忌说道自己张翠山甚么一个谢逊
4466159117109101596994
武功周芷若咱们教主赵敏心中一声
884792783756752689 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语言上机文本分析与词云绘制_倚天屠龙记的文本分析的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。