利用Hadoop平台进行大规模(百万以上)中文网页聚类

这是我本学期课程《高级数据库》的一个作业,目的是让熟悉一下Hadoop平台,发出来希望对需要的人有点帮助。
一、题目要求
大规模(百万以上)中文网页聚类
分布式计算平台:Hadoop
数据输入:未经处理的原始网页
数据输出:对每一个网页进行聚类标注
输入数据说明:每一行为一个网页。
Key (LongWritable) 每一个网页的全局ID号
Value (Text) 网页内容
输出数据说明:每一行为一个网页。
Key (LongWritable) 每一个网页的全局ID号
Value (IntWritable) 该网页所属聚类中心编号

程序提交说明:
1. 建议使用eclipse进行程序开发,提交.jar文件。
2. 使用fatjar插件进行打包。
3. 主函数传入参数说明:
hadoop jar ***.jar [inputData path] [output path] [tmp path] [cluster number] [maxIterations]
inputData path: 输入数据路径(HDFS)
output path: 输出数据路径(HDFS)
tmp path: 中间临时文件路径 (HDFS),程序运行结束,后台会删除里面的所有东西
cluster number: 聚类中心数
maxIterations: 最大迭代次数
例如:hadoop jar kmeans.jar hdfs://master:54321/inputdata/ hdfs://master:54321/output/ hdfs://master:54321/tmp/ 100 50
二、总体设计思路
Kmeans算法的基本思想:
(1)、随机选取k个样本点Sample作为初始质心Centroid
(2)、计算各样本点到k个质心的距离(如欧氏距离),把样本划分到最近的质心所代表的Cluster
【利用Hadoop平台进行大规模(百万以上)中文网页聚类】(3)、重新计算Centroid,对Cluster里面的Sample求平均值
(4)、重复步骤(2)(3)直到Centroid不再变化,或者达到最大迭代次数。
既然我们是利用Kmeans算法对网页进行聚类,就要把各网页表示成向量。由给出的测试数据,我们可以通过提取网页正文得到一个document,然后通过分词得到文档中的各个单词,从而将网页聚类转化为对文本进行聚类。
由于是对中文网页聚类,实验中先通过汉字的Unicode编码范围\u4e00-\u9fa5提取出所有的汉字,然后利用分词软件IKAnalyzer进行中文分词得到文档的各个单词。该软件在切词的过程中会自动过滤掉一些停止词stopwords,停止词列表和扩展词列表都是可以自定义的。接下来就是计算整个文档集Corpus中的单词对各个文档的权重,我们采用tfidf值来衡量。计算完单词的tfidf值后,我们可以设置一个阀值threshold提取出文档的关键字集合vocabulary,进而生成各个文档的特征向量,然后进行Kmeans算法迭代直至收敛,最后对网页所属的Cluster进行标注。
整个实验过程可以分为两部分,第一部分生成文档向量,第二部分就是Kmeans的迭代过程。下面先依次介绍这两部分的实现,最后讨论实验中遇到的一些问题和实验方法的一些不足之处。实验中所有和MapReduce相关的类都在cn.edu.sysu.arui.mapred包里,其它domain包,tools包,test包都是一些辅助类。
详细信息请看实验文档
三、源代码和实验文档下载
说明:
(1)、实验给的测试数据是二进制的,用Hadoop dfs -text命令可以把它转化为文本文件,查看每一行的内容,由于原始的测试数据有90M左右,8000左右个网页,所以为了方便测试截取了100行,命名为data_100.100,原始测试数据为data_10000。
(2)、原始测试数据较大,会单独上传到别的网盘,data_100.100及其相应的文本文件data10.txt会放在源代码目录里,实验文档会和源代码压缩在一起,所以下载了源代码就不用单独下载实验文档了。
实验文档:http://download.csdn.net/detail/sysu_arui/5033921
源代码:http://pan.baidu.com/share/link?shareid=3014166579&uk=2234778770
测试数据:http://pan.baidu.com/share/link?shareid=3000169643&uk=2234778770

    推荐阅读