分享

Spark 高级分析:第七章第4节 医学主题词及其同现现象分析

feilong 2018-7-27 09:56:05 发表于 连载型 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 0 6102
问题导读

1.如何获取样本数据的总体分布?
2.哪些主题词出现的频率最高?有什么规律?
3.
Scala库中方法combinations有何作用






上一篇:Spark 高级分析:第七章第2,3节 获取数据并解析
http://www.aboutyun.com/forum.php?mod=viewthread&tid=24882



现在我们已经从MEDLINE引证记录中提取了网格标签,让我们通过计算一些基本的汇总统计数据,如记录的数量和各种医学主题词的频率直方图,来了解数据集中标签的总体分布:
[mw_shl_code=scala,true]medline.count()
val topics: RDD[String] = medline.flatMap(mesh => mesh)
val topicCounts = topics.countByValue()
topicCounts.size
val tcSeq = topicCounts.toSeq
tcSeq.sortBy(_._2).reverse.take(10).foreach(println)
...
(Research,5591)
(Child,2235)
(Infant,1388)
(Toxicology,1251)
(Pharmacology,1242)
(Rats,1067)
(Adolescent,1025)
(Surgical Procedures, Operative,1011)
(Pregnancy,996)
(Pathology,967)[/mw_shl_code]
很令人意外,出现频率最多的主题竟是那些常用的,例如最通用的“研究,”或是稍微通用的“毒理学”“药理学” 和“病理”。频繁话题列表还包括对不同患者群体的引用,例如“孩子”、“婴儿”、“大鼠”或(更令人讨厌的)青少年。“幸运的是,我们的数据集中有超过13000个不同的主题,并且给出了最频繁出现的主题只出现在所有文档的一小部分(5591/240000~2.3%)中,我们预期包含主题的文档的总分布具有相对较长的尾部。我们可以通过创建专题图的值的频率计数来验证这一点:
[mw_shl_code=scala,true]val valueDist = topicCounts.groupBy(_._2).mapValues(_.size)
valueDist.toSeq.sorted.take(10).foreach(println)
...
(1,2599)
(2,1398)
(3,935)
(4,761)
(5,592)
(6,461)
(7,413)
(8,394)
(9,345)
(10,297)[/mw_shl_code]
当然,我们的主要兴趣是共同出现的医学主题词。MEDLINE数据集中的每个条目是每个引用记录中提到的主题名称的字符串列表。为了得到共现,我们需要生成这个字符串列表的所有两个元素子集。幸运的是,Scala的集合库有一个内置的方法combinations,使得生成这些子列表非常容易,combinations返回Iterator类型,意味着组合不必同时在内存中保存。
[mw_shl_code=scala,true]val list = List(1, 2, 3)
val combs = list.combinations(2)
combs.foreach(println)[/mw_shl_code]
当使用这个函数来生成要用Spark聚合的子列表时,我们需要小心的是,所有列表都以相同的方式排序。这是因为从组合函数返回的列表取决于输入元素的顺序,并且具有不同顺序的相同元素的列表彼此不相等:
[mw_shl_code=scala,true]val combs = list.reverse.combinations(2)
combs.foreach(println)
List(3, 2) == List(2, 3)[/mw_shl_code]
因此,当我们为每个引文记录生成两个元素子列表时,我们将确保在调用combinations之前对主题列表进行排序:
[mw_shl_code=scala,true]val topicPairs = medline.flatMap(t => t.sorted.combinations(2))
val cooccurs = topicPairs.map(p => (p, 1)).reduceByKey(_+_)
cooccurs.cache()
cooccurs.count()[/mw_shl_code]
因为在我们的数据中有13034个主题,潜在的13034×13033/2=84936061无序同现对。然而,同现出现的计数表明,只有259920对实际上出现在数据集中,可能的对的一小部分。如果我们查看数据中最常出现的同现对,我们会看到:
[mw_shl_code=scala,true]val ord = Ordering.by[(Seq[String], Int), Int](_._2)
cooccurs.top(10)(ord).foreach(println)
...
(List(Child, Infant),1097)
(List(Rats, Research),995)
(List(Pharmacology, Research),895)
(List(Rabbits, Research),581)
(List(Adolescent, Child),544)
(List(Mice, Research),505)
(List(Dogs, Research),469)
(List(Research, Toxicology),438)
(List(Biography as Topic, History),435)
(List(Metabolism, Research),414)[/mw_shl_code]
我们从最频繁出现的主要话题的计数中猜测,最常发生的同现对也相对普通。大多数的顶对,比如(“孩子”,“婴儿”)和(“老鼠”,“研究”),都是两个最常出现的个别话题的产物。数据中存在这些对的事实并不令人惊讶或增长见闻。

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条