【hadoop】大规模中文网站聚类kmeans的mapreduce实现(上)
2013-02-24 10:50
381 查看
由于前段时间期末考和放假,这篇文章推后了很多才出来。这是一个课程设计,主要是应用mapreduce对大规模的中文网站使用kmeans进行聚类,最后将相关的网站标记为同一类输出。
输入的每一行是网站的全局编号,对应有该网站的所有内容,包括未经处理的html等格式标记,输出为网站的全局编号,对应该网站属于的聚类编号。主要代码已经同步到github中,https://github.com/shenguojun/hadoop/tree/master/WebKmeans具体处理如下。
输入数据说明(未经处理的原始网页):
Key (LongWritable) 每一个网页的全局 ID 号
Value (Text) 网页内容
输出数据说明(对每一个网页进行聚类标注):
Key (LongWritable) 每一个网页的全局 ID 号
Value (IntWritable) 该网页所属聚类中心编号
主要的流程分别为:提取中文字符,分词,去除停用词,统计每个单词在每个网页中出现的次数以及在多少个网页中出现、每个网页的总词数以及总共有多少个网页并计算 Tfidf值,生成网页向量,建立词表,随机选取 k 个网页作为中心点,迭代进行 kmeans 计算,经过最大的迭代次数或者中心点不再改变时输出最终的中心点,最后根据最终的中心点判断一次每个网页属于哪个哪一类并输出最后结果。关键的流程如下图所示。
WordCountsInDocuments:统计每个网页的单词数目
WordsInCorpusTFIDF:统计单词在多少个网页出现,计算 TFIDF,建立词表
DocumentVetorBuid:建立网页向量,随机选取 K 个网页作为中心点
Kmeans:判断网页属于哪一类,更新中心点,最后输出网页所属中心标号
KmeansDriver:控制 Mapreduc 的 Job 顺序,以及 Kmeans 迭代流程,设置参数
DocTool:根据网页向量以及所有中心点向量输出网页所属的中心编号
下面对每个类进行具体的说明。
在其中提取中文使用正则表达式完成,主要代码如下:
分词和去除停用词使用开源的 IKanayzer 工具包实现,详见:
http://code.google.com/p/ik-analyzer/
项目中主要代码如下:
三个类中的 Mapreduce 工作如下表所示。
输出类似如下:
中国公民@783 4
中国共产党@36 2
中国共产党@519 7
输出类似如下:
中国公民@783 4/1232
中国共产党@36 2/2895
中国共产党@519 7/3240
输出类似如下:
中国公民@783 0.02922078
中国共产党@36 0.00563378
中国共产党@519 0.01761862
词表:
中国公民 1859
中国共产党 1860
输入的每一行是网站的全局编号,对应有该网站的所有内容,包括未经处理的html等格式标记,输出为网站的全局编号,对应该网站属于的聚类编号。主要代码已经同步到github中,https://github.com/shenguojun/hadoop/tree/master/WebKmeans具体处理如下。
一 概述
大规模中文网站聚类可以应用在检测相似内容网页,以及对大量网页进行分类的应用中由于在互联网中有大量的中文的网页,普通的计算机无法对百万数量级以上的网页进行处理,因此使用 Hadoop 分布式计算平台对这些大规模的网页进行存储以及Mapreduce计算模型进行聚类分析处理。编程环境
Hadoop 版本是 1.0.4,编程环境是 Eclipse Indigo,测试使用 pseudo 伪分布模式,运行机器使用四核 Intel(R) Core(TM)2 Quad Q6600 @ 2.40GHz CPU,4G 内存。输入数据说明(未经处理的原始网页):
Key (LongWritable) 每一个网页的全局 ID 号
Value (Text) 网页内容
输出数据说明(对每一个网页进行聚类标注):
Key (LongWritable) 每一个网页的全局 ID 号
Value (IntWritable) 该网页所属聚类中心编号
实现流程
主要的流程分别为:提取中文字符,分词,去除停用词,统计每个单词在每个网页中出现的次数以及在多少个网页中出现、每个网页的总词数以及总共有多少个网页并计算 Tfidf值,生成网页向量,建立词表,随机选取 k 个网页作为中心点,迭代进行 kmeans 计算,经过最大的迭代次数或者中心点不再改变时输出最终的中心点,最后根据最终的中心点判断一次每个网页属于哪个哪一类并输出最后结果。关键的流程如下图所示。
项目类说明(代码请见https://github.com/shenguojun/hadoop/tree/master/WebKmeans)
WordFrequenceInDocument:提取中文,分词,去停词,统计词频WordCountsInDocuments:统计每个网页的单词数目
WordsInCorpusTFIDF:统计单词在多少个网页出现,计算 TFIDF,建立词表
DocumentVetorBuid:建立网页向量,随机选取 K 个网页作为中心点
Kmeans:判断网页属于哪一类,更新中心点,最后输出网页所属中心标号
KmeansDriver:控制 Mapreduc 的 Job 顺序,以及 Kmeans 迭代流程,设置参数
DocTool:根据网页向量以及所有中心点向量输出网页所属的中心编号
下面对每个类进行具体的说明。
二 输入数据前期处理
数据的前期处理分为提取中文、分词以及去除停用词三个部分。这些功能主要在WordFrequenceInDocument 类中的 Mapper 部分进行。在其中提取中文使用正则表达式完成,主要代码如下:
// 匹配中文正则表达式 private static final Pattern PATTERN = Pattern.compile("[\u4e00-\u9fa5]"); Matcher m = PATTERN.matcher(value.toString()); while (m.find()) { String matchkey = m.group(); valueBuilder.append(matchkey); }
分词和去除停用词使用开源的 IKanayzer 工具包实现,详见:
http://code.google.com/p/ik-analyzer/
项目中主要代码如下:
StringReader retext = new StringReader(text); IKSegmenter ikseg = new IKSegmenter(retext, false); Lexeme lex = null while ((lex = ikseg.next()) != null ){ // 在每个单词后面加上对应的所在网站 this.word.set(lex.getLexemeText() + "@" + key.toString()); }
三 计 算 Tfidf(Term Frequency Inverse Document Frequency)及词表建立
计算 TFIDF 主要由 WordFrequenceInDocument(提取中文,分词,去停词,统计词频) WordCountsInDocuments、(统计每个网页的单词数目) WordsInCorpusTFIDF、(统计单词在多少个网页出现,计算 TFIDF,建立词表)这三个类进行。三个类中的 Mapreduce 工作如下表所示。
输出类似如下:
中国公民@783 4
中国共产党@36 2
中国共产党@519 7
输出类似如下:
中国公民@783 4/1232
中国共产党@36 2/2895
中国共产党@519 7/3240
输出类似如下:
中国公民@783 0.02922078
中国共产党@36 0.00563378
中国共产党@519 0.01761862
词表:
中国公民 1859
中国共产党 1860
相关文章推荐
- 【hadoop】大规模中文网站聚类kmeans的mapreduce实现(下)
- 【hadoop】大规模中文网站聚类 kmeans 的 mapreduce 实现
- 【hadoop】大规模中文网站聚类kmeans的mapreduce实现(下)
- 【hadoop】大规模中文网站聚类kmeans的mapreduce实现(上)
- 【hadoop】大规模中文网站聚类kmeans的mapreduce实现(上)
- 利用Hadoop平台进行大规模(百万以上)中文网页聚类
- 利用Hadoop平台进行大规模(百万以上)中文网页聚类
- mahout 0.9 + hadoop 1.0.2 实现中文文本聚类
- Hadoop-2.2.0中文文档—— MapReduce下一代- 可插入的 Shuffle 和 Sort
- EM-Tree + Paragraph2vector 实现大规模文档聚类
- Hadoop-2.2.0中文文档——Apache Hadoop 下一代 MapReduce (YARN)
- Hadoop MapReduce进阶 使用DataJoin包实现Join
- Python结合Shell/Hadoop实现MapReduce
- hadoop mapreduce实现数据去重
- 使用Python实现Hadoop MapReduce程序
- (Hadoop学习-2)mapreduce实现二次排序
- unity3d项目学习网站%Highcharts中文网站js&实现input输入框模糊查询
- Hadoop MapReduce实现矩阵的乘法
- Eclipse重写Wordcount类实现处理中文字符,利用hadoop Eclipse插件远程调试hadoop运行WordCount程序
- Hadoop-2.2.0中文文档——MapReduce 下一代 -——集群配置