首页 > 快讯 > 用R语言来挖掘《笑傲江湖》

用R语言来挖掘《笑傲江湖》


刚上初中的时候,我疯狂地迷上了笑傲江湖(央视版电视剧)。有几次在爸妈睡着之后,自己蹑手蹑脚地爬起来,打开电视,将音量调到一格(有时候甚至静音,全程无声电影)。看着电视里的刀光剑影、儿女情长、武林恩怨,直到一曲笑傲江湖终了,遂滚去睡觉。


当然今天我不是来给笑傲江湖写书评的。这个公众号的名字是R语言数据挖掘,咱不能挂羊头卖狗肉。


我们今天要做的是用R语言对《笑傲江湖》做一个文本挖掘。上回我们讲到可以用R语言中的jiebaR包做中文分词(不了解的同学可以看上回推送如何用R语言做中文分词),今天我们要用分词做以下几件事情:


1. 将《笑傲江湖》的文本分词,并将分词之后的文本写入一个新的txt文件

2. 将新的笑傲江湖文本分成10部分,统计每部分中的词频(比如统计“令狐冲”出现在每部分的次数),根据词频来确定对象在整本书的的走势

3. 将里面的走势可视化出来


1. 将《笑傲江湖》的文本分词,并将分词之后的文本写入一个新的txt文件

代码跟上次的基本没什么区别:

#载入需要的包
library(jiebaR)
library(readr)
library(dplyr)
library(tidytext)
library(ggplot2)

#载入笑傲江湖文本
xiaoao <- readLines("笑傲江湖(世纪新修版).txt", encoding = "UTF-8")

#新建一个分词器
myseg <- worker()

#用新建的分词器对文本进行分词,将分词之后的结果赋予变量“xiaoaofen”
xiaoaofen <- segment(xiaoao, myseg)

#将list数据类型转换为vector数据类型
xiaoaofen <- unlist(xiaoaofen)

#将分词之后的结果写入新的txt文本,“xiaoaofenci.txt”
writeLines(xiaoaofen, "xiaoaofenci.txt")

2. 将分词之后的《笑傲江湖》文本分成10个部分
#读入分词之后的文本
plots <- read_lines("xiaoaofenci.txt", progress = FALSE)

#将分词之后的文本转换成data frame数据类型
df_plots <- data_frame(plots)

#将分词之后的文本分成10个部分,将最后的结果赋予变量"decile_counts"
decile_counts <- df_plots %>%  mutate(word_position = row_number()/n()) %>%  mutate(decile = ceiling(word_position * 10) / 10) %>%  count(decile, plots)

3. 可视化分词之后的结果

比如我们可以看一下五岳剑派的走势图。

huashan <- filter(decile_counts, plots == "华山")
songshan <- filter(decile_counts, plots == "嵩山")
nhengshan <- filter(decile_counts, plots == "恒山")
shengshan <- filter(decile_counts, plots == "衡山")
taishan <- filter(decile_counts, plots == "泰山")

wuyue <- rbind(huashan, songshan, nhengshan, shengshan, taishan)
#五个图在一起
ggplot(wuyue)+  geom_smooth(mapping = aes(x = decile, y = n, color = plots), size = 1.5, level = 0)+  theme(text=element_text(family='Hei'),axis.text=element_text(size=12),axis.title=element_text(size=14,face="bold"),legend.text = element_text(size=12),legend.title = element_text(size=14,face="bold"))

#五个图分开
ggplot(wuyue)+  geom_smooth(mapping = aes(x = decile, y = n, color = plots), size = 1.5, level = 0)+  theme(text=element_text(family='Hei'),axis.text=element_text(size=12),axis.title=element_text(size=14,face="bold"),legend.text = element_text(size=12),legend.title = element_text(size=14,face="bold"))+  facet_wrap(~plots, ncol = 5)


上图中横轴是小说的时序,纵轴是对应词语出现的频次。可以看到,一开始强势走高的是南岳衡山派。小说一开始,南岳衡山派的二当家刘正风准备金盆洗手,引发了一场血雨腥风。最终刘正风全家被灭门,刘正风自己也自绝经脉而死。从此南岳衡山派一路走低,只有在最后五岳并派的时候依靠莫大先生稍微上扬了一点。


泰山派在小说中存在感最低,同样也是因为掌门天门道人在五岳并派的时候出镜了一下,所有才有蓝线的些许走高。


我们再看代表嵩山派的黄线,黄线在小说前半部分的走势很像一个正弦曲线。但是从0.5开始,黄线强势走高,因为左冷禅正在将酝酿多年的五岳并派计划变成现实。最后在五岳并派之时达到最高点,五岳并派之后突然拉低,当然是因为被岳不群暗算了。


代表红线的华山派在前半部分走势相对其他门派偏高,但原因可能是华山派参与了抢夺福威镖局的辟邪剑法。之后一直是左冷禅的眼中钉、肉中刺。华山派前半部分一直辗转挪移,期间几次差点遭到灭门之祸。跟嵩山派一样,华山派也从小说后半部分开始走高,不过幅度不如嵩山派那么明显而已。但这并不影响华山派最终在1的位置上,超越了嵩山派。


其实最让我意外的是北岳恒山派。恒山派在前期一直走势平稳,但是大约在0.37处突然上扬,从此一直是五岳剑派中走势最高的门派。我们可以看到有一段是恒山派和嵩山派同时上涨的阶段,这个阶段大概就是左冷禅计划灭掉恒山派,派人围攻恒山派的阶段。虽然最后恒山三大师太皆丧命,但是没想到新任掌门居然成了令狐冲。有了主角的强力夹持,后半段继续走高似乎也不足为奇了。


然后我们可以看一下笑傲江湖中人物的走势。

linghu <- filter(decile_counts, plots == "令狐冲")
shimei <- filter(decile_counts, plots == "岳灵珊")
yingying <- filter(decile_counts, plots == "盈盈")
linpingzhi <- filter(decile_counts, plots == "林平之")
yuebuqun <- filter(decile_counts, plots == "岳不群")
renwoxing <- filter(decile_counts, plots == "任我行")
zuolengchan <- filter(decile_counts, plots == "左冷禅")
yucanghai <- filter(decile_counts, plots == "余沧海")
dongfang <- filter(decile_counts, plots == "东方不败")
yilin <- filter(decile_counts, plots == "仪琳")
renwu <- rbind(linghu, shimei, yingying, linpingzhi, yuebuqun, renwoxing, zuolengchan, yucanghai, dongfang, yilin)

#人物走势图在一起
ggplot(renwu)+  geom_smooth(mapping = aes(x = decile, y = n, color = plots), size = 1, level = 0)+  theme(text=element_text(family='Hei'),axis.text=element_text(size=12),axis.title=element_text(size=14,face="bold"),legend.text = element_text(size=12),legend.title = element_text(size=14,face="bold"))

#人物走势图分开
ggplot(renwu)+  geom_smooth(mapping = aes(x = decile, y = n, color = plots), level = 0)+  theme(text=element_text(family='Hei'),axis.text=element_text(size=12),axis.title=element_text(size=14,face="bold"),legend.text = element_text(size=12),legend.title = element_text(size=14,face="bold"))+  facet_wrap(~plots, nrow = 2)

看到上面的图,还是不得不感叹一句主角就是主角。最上面咖啡色的线代表令狐冲的走势,虽然是低开,但是一路高歌猛进,中途虽然有些磕磕绊绊,最终落在了600上。令狐冲左边的东方不败,一开始默默无闻,0.5过后突然升高,经历了一个正弦波的半周期后陡然下降。这一段,大概就是任我行逃出梅庄,联合向问天、令狐冲、任盈盈围剿东方不败的部分。令狐冲右边的仪琳的走势最高点出现在小说最初的部分,令狐冲在衡阳城中拔刀相助,智斗田伯光,让仪琳顿生情愫。不过因为自身的身份以及令狐冲的心有所属,两人最终没有什么结果。仪琳的曲线在十个人中间最为平稳,难道是修佛的缘故?仪琳右边是任我行的曲线,真的是不能更标准的一个周期的正弦波。任我行在小说后半段才出场,困于西湖牢底12年,一日得脱,纠集门人旧部,重夺教主之位,然而最终还是成为了天下第一的牺牲品。任我行的一生就像他的走势图一样,始于争霸天下,终于天下第一,从哪里来,回哪里去。任我行的右边是余沧海的走势图,同仪琳一样,余沧海的最高点也出现在小说的开头,他人生的顶峰估计也就是灭门福威镖局了。后半部分有一个小小的跃升,不过是在林平之长剑之下垂死挣扎一下罢了。第二行第一个图是岳不群的走势,岳不群走势的最高点出现在小说开始部分,君子剑,紫霞神功,正气凛然。岳不群的第二高点出现在小说结局的时候,此时虽已当上五岳派的掌门,奈何人心尽失,不复往日。左冷禅的走势也没什么好说的,其最高点出现在后期五岳并派的时候,怎奈几十年精打细算,被岳不群窃取了革命胜利果实。最后一个是任盈盈的走势,是少有的在小说中后半部分能保持不落的人。大家注意在0.5到0.75这中间,令狐冲的走势是在下降的,而我们圣姑的走势是在上升的,最终两个人在大概0.75处一起开始了第二轮上升。我们大概可以知道,此处大概是令狐冲从少林寺救出任盈盈,彻底摆脱小师妹束缚之时。


上面没有讲到林平之和岳灵珊的走势,因为这两人我们要单独拿出来说。林平之是典型的高开低走,没办法,谁让福威镖局被灭门了,不得已,只能寄居华山派门下。但是其曲线在0.75左右突然拉高,大概我们可以知道大概是林平之辟邪剑法练成,准备报仇的时候了。


而岳灵珊的走势,与林平之的走势,是高度一致的。可能上图看的不太清楚,我们可以单独列出来,看下图。


我们可以看到自从岳灵珊出厂之后,其走势和林平之几乎一模一样,知道最后两条线相交在一起。我估计,那个交点,大概就是林平之杀死岳灵珊的时候,sigh。


《笑傲江湖》挖到这里暂时就差不多了,那么多中外小说,我们以后可以慢慢挖掘


以上代码部分参考了David Robinson的博客,详见:http://varianceexplained.org/r/tidytext-plots/


觉得好的盆友麻烦点个赞,原创不容易啊啊啊啊啊~~~

友情链接