|
用Hadoop分析金庸人物关系网
--- 用大数据粗略的分析金庸人物关系网
整体结果报告
达到预期目标并完成了选做内容
带依赖打包运行在2.7.1的hadoop集群即可
实验进展流程图:
TaskMainTask1提取人名,清理无关文本(使用已提供的名字册)Task2人名同现统计Task3人物关系图构建与特征归一化Task4基于人物关系图的PageRank计算Task5数据分析:在人物关系图上的标签传播 并根据结果染色Task6分析结果整理实现代码模块
ModuleFunction数据预处理Task1-Task3数据处理-PageRankTask4数据处理-LPATask5代码注解:
- Txt2name:
- TransferTask.java: 实现数据与处理方面的mapreduce的job设置,同时将人名列表放入cache中,方便后续的读取。
- TransferMapper.java: 完成自定义词典的配置,进行中文分词操作,提取出其中词性为Name的分词(在自定义词典时,将所有要提取的任务名称的词性均置为Name),提取出人名同现键对,以此作为reducer函数的输入。其中
- TransferReducer.java: 以mapper的输出键对作为输入,将同样的键值对进行合并输出类似于<(a,b),time>的键对,以a为主要人物,进行下一步的权重归一化操作,根据不同键值对出现次数的不同,计算权重,将输出格式设为”人名1 人名2:权重2,人名3:权重3……”,各权重值之和为1。
- PageRank:
- PageRankDriver.java: 对外接口函数,可通过操作此函数来实现对其余功能的调用,并实现驱动多趟循环的功能
- GraphBuilder.java: 该java文件主要进行初始化操作,输入的
- PageRankIter.java: 此java文件包含了pagerank功能函数,,对初始化的pr的值进行迭代工作,参考书上内容后我们设置为迭代次数固定为30次,不对其进行是否收敛的判断以减少工作量。其中mapper函数的输入为上一轮迭代的输出,
- PageRankViewer.java: 主要针对最后一次迭代的结果进行处理,调整其存储结构,只提取<人名,pr值>,将其输出到txt文件中,其中FinalRank中存储最后的PageRank结果。除此之外,在次函数中同时实现了对所有人名pr值的排序工作,将其从大到小一次排序。
- TagVisual:
- LPADriver.java: 为对外接口函数,调用此函数可以完成对LPA算法的调用,同时为满足多次迭代操作,在其中设置for循环,实现多趟操作功能。
- GraphBuilder.java: 对分词后的输出结果进行处理,将其格式设置为:”人名1 Tag |人名2:权重2:Tag2,人名3:权重3:Tag3,……”,在初始化时每个人物的标签设置为其本身。
- LPA.java: 此文件实现了LPA算法,将上一次迭代的输出文件作为下一次的输入文件,根据权重调整人名1的Tag值,并将其传送给与其相关的人物,监督其也调整Tag值。
- TagViewer.java: 在LPADriver.java中设置迭代次数为10次,因此TagViewer.java的输入文件为LPA迭代十次后的输出文件。首先自定义一个map存储结构,选取14篇文章中的”主人公”,将其Tag置为1~14后存入map中。对输入文件进行提取工作,(人名,Label),其中Label值为1~14。此Project主要为可视化操作提供文件输入。
- Gephi:
- 针对1模块输出的txt用python处理得到边的csv,通过2,3模块得到的pr和lpa tag处理得到点的csv。导入后稍加调整即可获得所需图像
具体模块内实现细节:
- Module1 没什么好说的,借助外部jar还是很好写的
- Module2 这部分的pagerank迭代参照书上MapReduce算法部分,结构相同,也没什么好说的,关键就是处理好map和reduce以及定义好处理的数据格式。实现上还需要注意pagerank的溢出和泄露问题,加个判断语句即可。
- Module3 这部分debug时间较长细节处会说
Module1:
就不给出详细描述了,详见作业设计中
这里仅仅给出应有的输入输出的图片
更换参数获得的新聚类图: 说明我们的标签传播算法还是准确的
一些局部图 鹿鼎记
神雕侠侣和射雕英雄传的交界处
更多细节可以参见Gephi文件夹中的gephi文件
优化与总结
- 在分词部分,主要时间花在了外部依赖jar包的调整上,由于没有找到助教推荐的版本,采用了最新的版本,但在最新版本中,ansj_seg的函数接口与原版的略有不同。从最后的分词结果来看,可以认为此次实验中的分词工作基本完成,对人物权重进行归一化处理后,文件结构较为清晰,为之后的功能提供了一个较好的输入。
- 起初在人物中没有删除说不得等可变成常用语句的角色名,导致大汉、汉子、说不得这类词本来在某部作品中的人物可能到处出现,后来发现还有“农妇”,“胖妇人”“哑巴这种”,妥善的处理方式我认为是在之前加上作品前缀,就不会有滑稽的相关联了,因为这种角色名不可能是连着几部作品的。
- LPA标签传播部分遇到过一个很大的问题,错误处在第一次迭代上,初始化结束之后,第一轮迭代结果人物剩下了1180几个,而原来1283个,真的是“有些人走着走着就散了”,肯定是reduce出了问题,当时的策略是:map阶段,更新节点标签,同时产生一个通知所有相关节点的数据,在reduce阶段,遍历通知节点添加后缀产生新的字符串。这是一个被动的方式,到了凌晨3点多想到了解决方法,主动更新,也就是我们记录下所有的后缀,遍历后缀匹配,强制更新每个后缀的标签吗,这样果然就没有人散了。
- 大数据集群的运行状态资源分布有时候也会影响运行结果,举个例子,15号凌晨的时候有两个小组和我们一起跑,结果那次运行跑挂了,我们认为是代码问题,改了半天没发现错误,再次跑一遍就是正确的。
- 本次的结果优化,由于做实验起初就看到了比较好的方案,所以也没自己优化,要是编个起初怎么样,后期怎么样也没意思。集群的性能还是很强大的,我们的程序只有map和reduce,如果进一步优化其实可以再谢谢partition之类的?不过不影响最后结果。
Contributer:
IDTaskEricyz组长,主要完成LPA部分Debug,数据可视化处理,实验报告总结,Github编写Wiki。你爱上的我主要完成PageRank–MapReduce算法设计,LPA-MapReduce算法设计。MissAngel主要完成小说中文分词功能,LPA部分Debug,实验报告撰写。福克斯四世主要完成小说中文分词功能,实验报告完善,jar包编译调试。Reference:
金庸的江湖,人物关系分析 Jinyong-Novels-Analysis -Wayne1234 标签算法部分描述很好
基于15本金庸小说的人物关系图挖掘 MapReduce-JinYongsWorld -sunfvrise 代码框架结构很好 分成三个模块
《深入理解大数据》机械工业出版社,黄宜华,苗凯翔
PIG标签传播算法和超级英雄们的社区发现
|
|
|