Quantcast
Channel: CodeSection,代码区,Python开发技术文章_教程 - CodeSec
Viewing all articles
Browse latest Browse all 9596

Python+Hadoop 从DBLP数据库中挖掘经常一起写作的合作者

$
0
0

Python+Hadoop 从DBLP数据库中挖掘经常一起写作的合作者
任务描述: 本文的写作目的是从 DBLP 数据库中找到经常一起写作的合作者。熟悉数据挖掘中频繁项挖掘的经典算法( FP-Growth )并作出改进和优化。实验代码用python写的,分别在本地(Win8)和Hadoop集群(条件有限,虚拟机上跑的,3个节点)上实现。(下载本文所涉及全部代码 https://github.com/findmyway/DBLP-Coauthor )

回复此公众号“ 作者 ”获取源码,以及word版原文查看。向小编咨询问题,联系微信:hai299014

任务分解:

从DBLP数据集中提取作者信息

建立索引作者ID并对文件编码

分析数据的规模

构建FP-Tree并从FP-Tree得到频繁项集

频繁项集挖掘结果分析

并行FP-Growth算法的可行性分析

Hadoop平台上实现FP-Growth算法

从 DBLP 数据集中提取作者信息

首先从官网下载 DBLP 数据集 http://dblp.uni-trier.de/xml/ 只需下载 dblp.xml.gz 解压后得到 1G 多 dblp.xml 文件!文件略大。用 vim 打开文件后可以看到,所有的作者信息分布在以下这些属性中: 'article','inproceedings','proceedings','book','incollection','phdthesis','mastersthesis','www'

在这里使用 python 自带的 xml 分析器解析该文件(注意这里使用 sax 的方式)源码如下:(其核心思想为,分析器在进入上面那些属性中的某一个时,标记 flag=1 ,然后将 author 属性的内容输出到文件,退出时再标记 flag=0, 最后得到 authors.txt 文件)

getAuthors.py

01 import codecs

02 from xml.sax import handler , make_parser

03 paper_tag = ( 'article' , 'inproceedings' , 'proceedings' , 'book' ,

04 'incollection' , 'phdthesis' , 'mastersthesis' , 'www' )

05

.......

44 result . close ()

45 source .

close

()

建立索引作者 ID

读取步骤 1 中得到的 authors.txt 文件,将其中不同的人名按照人名出现的次序编码,存储到文件 authors_index.txt 中,同时将编码后的合作者列表写入 authors_encoded.txt 文件。

encoded.py

01 import codecs

02 source = codecs . open ( 'authors.txt' , 'r' , 'utf-8' )

03 result = codecs . open ( 'authors_encoded.txt' , 'w' , 'utf-8' )

04 index = codecs . open ( 'authors_index.txt' , 'w' , 'utf-8' )

05 index_dic = {}

06 name_id = 0

07 ## build an index_dic, key -> authorName value => [id, count]

08 for line in source :

09 name_list = line . split ( ',' )

10 for name in name_list :

11 if not ( name == ' \r\n ' ):

12 if name in index_dic :

13 index_dic [ name ][ 1 ] += 1

14 else :

15 index_dic [ name ] = [ name_id , 1 ]

16 index . write ( name + u' \r\n ' )

17 name_id += 1

18 result . write ( str ( index_dic [ name ][ 0 ]) + u',' )

19 result . write ( ' \r\n ' )

20

21 source . close ()

22 result . close ()

23 index .

close

()

(这里注意编码,不然会出现UnicodeError,很蛋疼的。。。)

分析数据的规模

查看在 DBLP 数据集中作者发表文章的数量。即统计只发表过 1 次文章的人数有多少,发表过 2 篇文章的人数有多少 ...... 发表过 n 篇文章的有多少人 ... 并且绘图:


Python+Hadoop 从DBLP数据库中挖掘经常一起写作的合作者

分析可知,当支持度为 40 的作者数量接近 1000 ,随后支持度每增加 20 ,对应的作者数量减半,为了降低计算量,第一次实验时支持度阈值不宜选得太小,同时为了避免结果数量太少,初次实验时阈值可选在 40~60 之间(在接下来的实验中选的是 40 )。

view_data.py

01 from matplotlib.font_manager import FontProperties

02 font = FontProperties ( fname = r"c:\windows\fonts\simsun.ttc" , size = 14 )

03 import codecs

04 import matplotlib.pyplot as plt

05 import numpy as np

06 data = codecs . open ( 'authors_encoded.txt' , 'r' , 'utf-8' )

07 word_counts = {}

08 maxCounts = 0

09 for line in data :

10 line = line . split ( ',' )

11 for word in line

Viewing all articles
Browse latest Browse all 9596

Trending Articles