R文本挖掘初探之“天下风云出我辈, 一入江湖岁月催”

有人就有恩怨,有恩怨就有江湖。人就是江湖,你怎么退出?

宅了三天,动手操作文本挖掘。现将结果呈现在此,顺便总结下这几天的学习,看起来还挺有意思(bu kao pu)的。

完整的计划应该包含五个部分:

  1. 人物重要程度图:提取人物出现频数,绘制词云图
  2. 主要人物出场次序图:按照出场顺序,绘制主要人物出场的顺序和活跃的阶段。
  3. 人物关系图:提取人物关系(节点和边),绘制关系图谱。
  4. 故事展开地图:提取文中地理位置出现的先后,绘制地图,并标明先后变化轨迹。
  5. 武功招式图:武功招式出现的频数,绘制词云图。

目前只完成了前三个人物,本文只展示这三个作品,其他的后续贴文章,实现过程也会在后面记录下来。

1. 人物重要程度词云图

名字的大小表征该角色的出镜率的高低。采用一把剑的来组织词云,还是蛮符合笑傲江湖主题的。

R文本挖掘初探之“天下风云出我辈, 一入江湖岁月催”

主要人物热度词云图

2. 主要人物出场次序图

不解释,直接上图。

R文本挖掘初探之“天下风云出我辈, 一入江湖岁月催”

令狐冲和林平之出场情况比较

图中可以看出这两个人物基本贯穿整部小说。。。相比于冲哥极高且分布较为均匀的样子,林平之倒是像是故事的各种线索:故事从他开始展开,关键环节他总是会出现,一点都不落下。唉,悲剧的人生就是给别人精彩的人生当坐标,串故事。

R文本挖掘初探之“天下风云出我辈, 一入江湖岁月催”

令狐冲、林平之、田伯光、岳不群、岳灵珊出场情况

这张图将令狐冲、林平之、田伯光、岳不群、岳灵珊这5个人物出场情况展示在一张图上,不得不说小师妹跟林师弟真的是天生一对。。。出现也是成双成对形影不离。田伯光这个人物看原著的时候知道他出镜率蛮高,可是没想到有结果这么高。。。说实话还是蛮喜欢这个采花大盗的。

R文本挖掘初探之“天下风云出我辈, 一入江湖岁月催”

主要人物出场分面图

前两张图在人物很少的情况下能够清晰的展现一些人物的出场情况,但是想要把所有主要人物的出场情况都表现出来如果都化成一张图(下一张)颜色的交织会使得观察的不够明显,于是采用分面图来表示Top21(一共有130+号人物出场,打酱油的路人甲除外)的人物上镜情况。可以既关注某个角色,又可以相互对比,其乐融融啊。。。基本是按热度排行,我们的圣姑除外。为了对比把所有Top21都画在一个图上的也传上来:

R文本挖掘初探之“天下风云出我辈, 一入江湖岁月催”

主要人物复合时间线图

3.人物关系图

人物关系图是最”复杂“”和”纠结”的了。。。

R文本挖掘初探之“天下风云出我辈, 一入江湖岁月催”

笑傲江湖人物关系图

R文本挖掘初探之“天下风云出我辈, 一入江湖岁月催”

笑傲江湖人物关系图

R文本挖掘初探之“天下风云出我辈, 一入江湖岁月催”

笑傲江湖人物关系图

R文本挖掘初探之“天下风云出我辈, 一入江湖岁月催”

笑傲江湖人物关系图

原计划的4、5基本不打算去操作了,因为没有用到新的东西。这贴就记录下实现的过程,以及用到的知识和工具,期间遇到的各类问题及解决也会出现在这里。

起先,贴一些文本挖掘相关的背景知识,从一些“前辈”的博客中摘录过来,这里会标明出处。

文本挖掘大致可由三部分组成:底层是文本数据挖掘的基础领域,包括机器学习、数理统计、自然语言处理;在此基础上是文本数据挖掘的基本技术,有五大类,包括文本信息抽取、文本分类、文本聚类、文本数据压缩、文本数据处理;在基本技术之上是两个主要应用领域,包括信息访问和知识发现,信息访问包括信息检索、信息浏览、信息过滤、信息报告,知识发现包括数据分析、数据预测。其中需要付出大量人力物力的是文本信息的提取及内容分类,尤其对于中文来说不同领域不同行业的关键词术语各不相同,因此,构建一个适用于不同行业的关键词库显得尤为重要。

一个参考的结构

R文本挖掘初探之“天下风云出我辈, 一入江湖岁月催”

该图的作者刘思喆整理的R语言环境下的文本挖掘(右键另存)内容更为全面些,也点名了一些关键实现。不过发现关于tm包的用法跟英文的稍微有些出入,可能是tm包更新了的缘故吧。

文本挖掘与大多数的数据挖掘工作流程类似,只是面对的是各类自然语言的文本文档,各个环节会用到比结构化的数据多很多的特殊手段。就网络文本挖掘而言,信息采集就是一门比较复杂的学问,看到的比较有意思的一个帖子是(http://tech.techweb.com.cn/thread-438088-1-1.html)其中有个文本密度的概念比较有意思,从统计学的思想出发筛选出网页真正有价值的正文。中文而言,有其特殊性,一是中文不同于拉丁语系,不存在词之间的自然分割。二是中文变化太快,各种新词层出不穷,同义、多义、表达方式也各有千秋。本文的预料对象是金庸的笑傲江湖,一本我在高三读了2遍的小说。直接谷歌的txt版本下来。

如何将文本转化成计算机可以识别和处理的方式,就产生了文本表示的问题。常见的文本表示方法主要分为3类,向量空间模型、概率模型、概念模型。其中用的比较广的是向量空间模型,即将文档中的词通过此表映射到一个向量空间中来表示,这里不再展开。

中文分词算是一个比较成熟的研究领域,出了相当多的成果,其发展的历史可以蛮有启发意义。

R中的中文分词有rmmseg4j、Rwordseg等包,区别与比较建议参看Rwordseg作者,推荐使用Rwordseg,其使用的引擎是ansj,这是一个基于google语义模型+条件随机场模型的中文分词的java实现,目测更新的挺快的,期望Rwordseg作者同步更新。使用以来jvm,建议安装对应版本的jdk和jre,出现的一个问题参见rJava这里。

词典的选择对于分词的准确,尤其是大致了解文本的语境之后的词典选择,比如这次的词典就采用了两个:一个是金庸小说人物名词典,一个是武功招式词典,均来自搜狗的细胞词库,Rwordseg支持输入法的细胞词库还是蛮方便的。

选择好词典之后就是对文本的分词操作,之后就是构建一个词频矩阵,之后就可以聚类、分类啊之类的算法都可以直接用了。

主要人物的确定主要是按照词典查出来笑傲江湖中出现的人物名称,大约有140位,并且有统计出现频数:

R文本挖掘初探之“天下风云出我辈, 一入江湖岁月催”

之后借助词云工具就可以做出1中的词云图,本来想用用R的wordcloud包,无奈这个包的布局算法不太好,生成的图太丑了,放弃。当然尝试的过程中也出现了一些小插曲。比如R绘图中的中文字体问题,之后找到了Tagxedo这个工具,支持中文定制型也强,关键是可以指定轮廓,这个工具蛮酷的。有兴趣的可以上手玩玩,参看Tagxedo的101种玩法。

这部分用到的包主要有tm、Rwordseg。

第二部分,人物的出场顺序图,这个在统计出词频的时候信息已经提取出来了,可视化的手段可以更为直观的展示出来。将笑傲江湖拆分成了4000+个段,按段分别统计各个人物出现的次数,就会对每个人物产生一个序列,将4000个段抽象成4000个具有先后顺序的事件片,那么就得到各个人物的时间序列。可视化出来就直观的发现一些有趣的东西。主要人物如:令狐冲、岳不群、岳灵珊等就从头到尾都出境,次要人物就是牵出一个个场景,如林震南、劳德诺、丹青生、定静师太等,在属于他们的时刻活跃一阵子。当然可以进一步的分析。。。

画图的时候遇到一些问题,R图如何高清的保存,这里有个讨论:如何用R绘制高清的图,我在window环境下存成emf的清晰度还是可以接受的,直接存成png或者jpg真的不可以接受。还有一个问题是如何一张途中可以同时展示几个人物的情况。放的人多了吧,颜色区分度会很差,人类很难辨识,放的人少吧,表达的信息量有限。分面图是个很好的解决方案,但是在人数比较少的情况下,复合时间线图可能更合适。人眼到底能够却分的颜色有多少这个还是个

这部分用到的包有ggplot2、plyr、reshape2等。

第三部分类似于社交图,主要是提取出人物的关系。其实取决于对人物关系的定义,这里我假设两个人名同时出现在一个段里面就规定他们存在某种关系。于是只要看刚开始得到的那个矩阵的横向那些个不是0就可以了。

大概得到了8000+个关系。绘图用的是gephi,这个还是几年前做本科毕业论文的时候用的一个工具。在处理大数据的时候这个工具还是显得比较吃力,当然也可能是我的机器比较破。。。

来源:叁零柒

链接:http://m.jiejingtao.cn/

本文采用「CC BY-SA 4.0 CN」协议转载自互联网、仅供学习交流,内容版权归原作者所有,如涉作品、版权和其他问题请给「我们」留言处理。

(1)
张乐的头像张乐编辑
上一篇 2016-08-04 16:18
下一篇 2016-08-28 11:40

相关文章

关注我们
关注我们
分享本页
返回顶部