查看原文
其他

干货|利用文本分析 揭秘唐朝诗人之间的秘密关系?!

2017-03-16 全球人工智能


全球人工智能


文章来源:前进日志  作者:前进四先生


前不久在网上看到了这张非常火的图,让我想起来中学的时候就发现唐朝诗人之间存在着微妙的关系。比如杜甫非常喜欢李白,到了做梦都想见李白的地步。出于好奇心,我一度想理清楚他们之间的关系。

这件事主要的麻烦在于以下两点:

  • 全唐诗数量太多,一共四万多首。

  • 诗人的别称太多,比如杜甫:按字称为子美,按排行称为杜二,按官职称为杜工部。

第一点,我们现在用计算机来做。第二点则稍微费事一点,我们使用哈佛大学编纂的《中国历代人物专辑资料库》(China Biographical Database Project 以下简称CBDB),CBDB记录了中国历代名人的传记资料,并保存在关系型数据库中。

利用CBDB查找诗人的别名

CBDB由很多张表组成,每张表记录了人物的不同信息,我们只用到了其中两张表,人物的主要信息表:BIOG_MAIN和人物的别名表:ALTNAME_DATA
首先从BIOG_MAIN中查询出人物编号c_personid,接着用c_personid从ALTNAME_DATA中查询出别名,如下图所示:

下面我给大家演示一下如何从CBDB中查询杜甫的别称。

图中能够看到杜甫有三个别称:子美、杜二、杜工部。

当然也有很多重名的现象,比如我们查询王維。


会找出一堆叫王维的,这个时候,我们就要使用生卒年来判定:这个人物到底是不是唐朝的。这次要从数据库中查询人物的生卒年。

唐朝建立于618年,灭亡于907年。对比后立刻发现,第二个王维才是我们要找的诗人王维。
查询别名核实一下:


看到了熟悉的王右丞和摩诘,没错,这正是王维同学。

由于CBDB收罗的历史人物太多,重名现象非常严重。我设置了如下的排除重名策略:

1.如果人物生卒年俱全,那么只要生卒区间和唐朝持续时间有交集即可。如果存在这样的诗人,那么直接把这个人作为全唐诗中的作者。
2.如果人物只有生年或者卒年,那么生年或卒年必须在唐朝的持续时间内。将这样的人加入候选人列表。
3.如果人物生卒年都不详,那么舍弃之。

经过这三条判断之后:
如果候选人列表为空,那么说明CBDB中没有目标人选,舍弃这位诗人。
如果候选人多于一个,则说明排除重名失败,舍弃这位诗人。

这种策略并不完美,存在部分注明诗人被舍弃的情况。为此我手动添加了他们:


部分诗人的别称比较尴尬,属于唐诗中的常用词,需要手动去除。如下:

经过筛选,全唐诗中2609位作者,剩下762位。接下来我们只关心这762位诗人之间的关系。

2 搜索诗人之间的引用关系

利用上面的诗人及别称列表,我们在全唐诗中来搜索诗人之间的引用关系。
规则是:诗的标题和正文中只要提到过对方,那么两者之间的引用关系加1。一首诗如果提到多次对方,只算一次引用。
经过计算机一番运转,最终得到了引用关系表。

2.1 李白和杜甫之间的引用关系

首先来检查一下李白和杜甫之间的引用关系:

不错,杜甫写了12首与李白有关的诗,李白则只有3首与杜甫有关的诗。李白这种朋友,确实差劲了一点啊。

从这张图也可以看出,我们的程序能够识别出诗人的别名,比如杜甫的《寄李十二白二十韵》和李白的《鲁郡东石门送杜二甫》都没有直接提到对方的名字。

2.2 引用关系排名

我给诗人之间的引用关系排了个座次,下面显示了排名前三十的引用关系:

我们看到,全唐诗中排名第一的好基友绝对是陆龟蒙和皮日休。这两位互相提到对方的次数都在百次以上,这是因为陆龟蒙和皮日休特别喜欢唱和,你写一首送我,我再回一首赠你,跟现在微博大V之间的互动差不多。这两位常年唱和,最后将往来的唱和诗作编写了中国文学史上的第一本唱和诗集:《松陵集》。为了不辜负他们之间的友谊,文学史上通常将两者合称为“皮陆”。

并列第二的则是白居易和刘禹锡、白居易和元稹。白居易和刘禹锡同年(772年)出生,从政道路都是各种被贬谪。两人都很长寿,刘禹锡71岁时去世,白居易则活了75岁。白居易在得知刘禹锡去世的消息时,写下了千古名句:

四海齐名白与刘,百年交分两绸缪
同贫同病退闲日,一死一生临老头

白居易和元稹我不想多写了,大家只要知道二人在文学史上被合称为“元白”,就能想见二者的亲密关系了。

从排名前三十的引用关系来看,白居易绝对是唐朝诗人朋友圈中的明星,是大V中的大V。

引用关系的可视化

只有引用关系列表岂不是有些干巴巴的,接下来才是本文的重头戏。我将使用ECharts来可视化诗人之间的引用关系,最终得到诗人们的社交网络。

3.1 全唐诗人社交网络图

因为一共有762位诗人,为了避免画出的图太拥挤,看不清,我只将前一百的引用关系图示化,如下图:

可能会看不清,请大家放大后再看。图中:

  • 箭头表示诗人们之间的引用关系。比如说白居易引用了元稹,那么就有白居易指向元稹的箭头,元稹引用了白居易,相应的也有元稹指向白居易的箭头。

  • 箭头的粗细程度则表示了诗人们之间引用关系的强弱。白居易引用元稹的数量为167次,元稹引用白居易的数量为88次,那么白居易指向元稹的箭头就要粗一些。

图中清晰的显示除了唐朝诗人的两个大型朋友圈:杜甫-李白朋友圈、白居易朋友圈。没错,他们分别是盛唐和中唐两个时期的核心诗人。

总结

虽然只画出了排名前一百的引用关系,但还是很拥挤。文学史上将唐诗根据时间划分为4个阶段:初唐、盛唐、中唐、晚唐。我分别画出这四个阶段的社交网络图,详细请见Github。

即使一个人对唐诗没有任何了解,他只要看这些社交网络图,就能立刻发现哪位诗人是同时代诗人的核心,哪位诗人的影响最大。这些都是很有用的信息。

而我们可以用计算机来分析任何时代的人物关系。中国恰好是历史文献最全的国家,如果能对这些文献统一做系统的分析,岂不是可以做出随着时间变化的历史人物关系图?

这在以前是不可能的事,现在随着计算机技术的发展和古典文献的数字化进程,逐渐有可能了。这当然是很大的工作量,任何个人都不可能实现。我想,有没有可能参考linux的开发过程,用开源的方式,大家一起来完成这件事。

我已将唐诗分析那两篇文章的源代码上传到了github上

地址:https://github.com/MrQianJinSi/poetry_analyzer

请感兴趣的网友自行clone研究,欢迎发起PR和提issue. 对了,即使不是程序员,也可下载项目html目录下的网页文件,用浏览器查看诗人社交网络的高清晰大图,只要你的屏幕分辨率够高,想要多清晰都可以。

点击阅读原文跳转原文链接

兼职翻译 招聘

《全球人工智能》面向全球招聘多名海外:图像技术、语音技术、自然语言、机器学习、数据挖掘等专业技术领域的兼职翻译,工作内容及待遇请在公众号内回复“兼职+个人微信号”联系工作人员。


热门文章推荐

重磅|谷歌DeepMind将“记忆”植入机器学习,从而提高机器持续的自适应学习!

资源|28本必读的经典机器学习/数据挖掘书籍(免费下载)

活动|12位AI大佬齐聚ACM TURC 2017-中国(已开始报名)

恐怖|50 亿条用户隐私信息泄露,嫌犯竟是互联网名企工程师

干货|周志华揭开机器学习本质的57张PPT

重磅|百度PaddlePaddle发布最新API 从三大方面优化了性能

重磅|NVIDIA发布两款"深度神经网络训练"开发者产品:DIGITS 5 和 TensorRT

重磅|“萨德”——不怕!我国的人工智能巡航导弹可破解

重磅|MIT发布脑控机器人:用脑电波(10毫秒分类)纠正机器人错误

重磅|谷歌预言:2029年通过纳米机器人和器官再造 或将实现人类永生

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存