hadoop矩阵乘法源码_使用Hadoop计算共现矩阵

hadoop矩阵乘法源码

这篇文章继续我们在MapReduce的数据密集型文本处理一书中实现MapReduce算法的系列。 这次,我们将从文本语料库创建单词共现矩阵。 本系列以前的文章是:
  1. 使用MapReduce进行数据密集型文本处理
  2. 使用MapReduce进行数据密集型文本处理-本地聚合第二部分

共现矩阵可以描述为事件的跟踪,并且在一定的时间或空间窗口下,似乎还会发生其他事件。 出于本文的目的,我们的“事件”是文本中找到的单个单词,我们将跟踪“窗口”中相对于目标单词的位置出现的其他单词。 例如,考虑短语“快速的棕色狐狸跳过了懒狗”。 窗口值为2时,单词“ jumped”的同时出现为[brown,fox,over,the]。 同现矩阵可以应用于需要调查“此”事件何时发生,其他事件似乎同时发生的其他区域。 为了构建我们的文本共现矩阵,我们将使用MapReduce实现数据密集型文本处理的第3章中的“对和条纹”算法。 用来创建我们共现矩阵的正文是威廉·莎士比亚的集体著作。

实施配对方法很简单。 对于调用map函数时传递的每一行,我们将在空格处分割以创建一个String Array。 下一步将是构造两个循环。 外循环将遍历数组中的每个单词,而内循环将遍历当前单词的“邻居”。 内部循环的迭代次数由捕获当前单词邻居的“窗口”的大小决定。 在内部循环的每个迭代的底部,我们将发出一个WordPair对象(由左侧的当前单词和右侧的相邻单词组成)作为键,并计数1作为值。 这是Pairs实现的代码:

public class PairsOccurrenceMapper extends Mapper<LongWritable, Text, WordPair, IntWritable> {private WordPair wordPair = new WordPair();private IntWritable ONE = new IntWritable(1);@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {int neighbors = context.getConfiguration().getInt('neighbors', 2);String[] tokens = value.toString().split('\\s+');if (tokens.length > 1) {for (int i = 0; i < tokens.length; i++) {wordPair.setWord(tokens[i]);int start = (i - neighbors < 0) ? 0 : i - neighbors;int end = (i + neighbors >= tokens.length) ? tokens.length - 1 : i + neighbors;for (int j = start; j <= end; j++) {if (j == i) continue;wordPair.setNeighbor(tokens[j]);context.write(wordPair, ONE);}}}}
}

Pairs实现的Reducer将简单地将给定WordPair键的所有数字相加:

public class PairsReducer extends Reducer<WordPair,IntWritable,WordPair,IntWritable> {private IntWritable totalCount = new IntWritable();@Overrideprotected void reduce(WordPair key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {int count = 0;for (IntWritable value : values) {count += value.get();}totalCount.set(count);context.write(key,totalCount);}
}


条纹

实现共现的条带化方法同样简单。 方法是相同的,但是所有“邻居”字都是在HashMap中收集的,其中邻居字为键,整数计数为值。 当已经为给定单词(外部循环的底部)收集了所有值时,将发出单词和哈希图。 这是我们的Stripes实现的代码:

public class StripesOccurrenceMapper extends Mapper<LongWritable,Text,Text,MapWritable> {private MapWritable occurrenceMap = new MapWritable();private Text word = new Text();@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {int neighbors = context.getConfiguration().getInt('neighbors', 2);String[] tokens = value.toString().split('\\s+');if (tokens.length > 1) {for (int i = 0; i < tokens.length; i++) {word.set(tokens[i]);occurrenceMap.clear();int start = (i - neighbors < 0) ? 0 : i - neighbors;int end = (i + neighbors >= tokens.length) ? tokens.length - 1 : i + neighbors;for (int j = start; j <= end; j++) {if (j == i) continue;Text neighbor = new Text(tokens[j]);if(occurrenceMap.containsKey(neighbor)){IntWritable count = (IntWritable)occurrenceMap.get(neighbor);count.set(count.get()+1);}else{occurrenceMap.put(neighbor,new IntWritable(1));}}context.write(word,occurrenceMap);}}}
}

由于我们需要迭代一组地图,然后针对每个映射,遍历该映射中的所有值,因此使用“ Reducer for Stripes”方法要稍微复杂一些:

public class StripesReducer extends Reducer<Text, MapWritable, Text, MapWritable> {private MapWritable incrementingMap = new MapWritable();@Overrideprotected void reduce(Text key, Iterable<MapWritable> values, Context context) throws IOException, InterruptedException {incrementingMap.clear();for (MapWritable value : values) {addAll(value);}context.write(key, incrementingMap);}private void addAll(MapWritable mapWritable) {Set<Writable> keys = mapWritable.keySet();for (Writable key : keys) {IntWritable fromCount = (IntWritable) mapWritable.get(key);if (incrementingMap.containsKey(key)) {IntWritable count = (IntWritable) incrementingMap.get(key);count.set(count.get() + fromCount.get());} else {incrementingMap.put(key, fromCount);}}}
}


结论

查看这两种方法时,我们可以发现Pairs算法与Stripes算法相比将生成更多的键值对。 而且,“对”算法捕获每个单独的同现事件,而“条纹”算法捕获给定事件的所有同现事件。 成对和条纹实现都将受益于使用组合器。 因为两者都会产生可交换的结果和关联的结果,所以我们可以简单地将每个Mapper的Reducer用作合并器。 如前所述,创建共现矩阵不仅适用于文本处理,而且还适用于其他领域,并且代表了有用的MapReduce算法。 谢谢你的时间。

资源资源

  • Jimmy Lin和Chris Dyer 使用MapReduce进行的数据密集型处理
  • Hadoop: Tom White 的权威指南
  • 来自博客的源代码和测试
  • Hadoop API
  • MRUnit用于单元测试Apache Hadoop映射减少工作


参考:来自我们的JCG合作伙伴 Bill Bejeck(来自Random Thoughts On Coding博客)的Hadoop计算共生矩阵 。

翻译自: https://www.javacodegeeks.com/2012/11/calculating-a-co-occurrence-matrix-with-hadoop.html

hadoop矩阵乘法源码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350814.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第六章 数组和索引器 (6.6 索引器)

【案例】本案例在Student类中定义索引器&#xff0c;然后通过stu[i] 来引用Student类的对象实例。 【案例目的】(1)掌握索引器定义与使用。 (2)理解索引器与属性的区别。 【代码】 namespace Example1 {class Program{static void Main(string[] args){Student stu new Studen…

Java Executors(线程池)

Sun在Java5中&#xff0c;对 Java线程的类库做了大量的扩展&#xff0c;其中线程池就是Java5的新特征之一&#xff0c;除了线程池之外&#xff0c;还有很多多线程相关的内容&#xff0c;为多线程的编程带来了极大便利。为了编写高效稳定可靠的多线程程序&#xff0c;线程部分的…

matlab 小括号

大括号 用于单元阵列的赋值 中括号 用于形成一个向量或矩阵小括号 通常用于一般的算术表达式,指示优先运算,还用于表示函数变量、向量下标和矩阵下标等到 小括号&#xff0c;用于引用数组的元素。 如 X(3)就是X的第三个元素。 X([1 2 3])就是X的头三个元素。 算例&#xff1a;…

如何使用CNN进行物体识别和分类_可能我们之前都想错了:CNN的图像分类策略其实出奇的简单呢!...

【新智元导读】ICLR 2019一篇论文指出&#xff1a;DNN解决ImageNet时的策略似乎比我们想象的要简单得多。这个发现使我们能够构建更具解释性和透明度的图像分类管道&#xff0c;同时也解释了现代CNN中观察到的一些现象。全文约3300字6图&#xff0c;读完可能需要10分钟CNN非常擅…

【小记】-006--关于高度塌陷的问题

最近遇到一个问题&#xff1a;当使用 position:absolute 时&#xff0c;给父元素添加 position:relative 父元素高度塌陷&#xff0c;此时如何使得父元素的高度被子元素撑开&#xff1f; 我了解到的高度塌陷无非就是&#xff1a;float属性,display:absolute/fixed属性 float与d…

StringBuffer的存在的含义

当我处理旧代码并跨StringBuffer实例运行时&#xff0c;通常将它们替换为StringBuilder实例。 尽管可以从此更改中获得性能优势&#xff0c;但我经常在我知道对性能影响不大的地方对其进行更改。 我认为&#xff0c;除了可能带来性能收益外&#xff0c;还应出于各种原因进行更改…

matlab 大括号

大括号&#xff0c;用于cell型的数组的分配或引用。 >> acell(2,1)a [][]>> a(1,1)[2,3,4,0;5,6,7,8];无法从 double 转换为 cell。>> a(1,1){[2,3,4,0;5,6,7,8]};>> a(2,1){str};>> aa [2x4 double]str >>

J2EE项目代码编写规范分享

码编写规范目的&#xff1a;能够在编码过程中实现规范化&#xff0c;为以后的程序开发中养成良好的行为习惯。 代码编写规范使用范围&#xff1a;J2EE项目开发。 包命名规范&#xff1a; 目的&#xff1a;包的命名规范应当体现出项目资源良好的划分 servlet类所在包命名规范&am…

Socket套接字 =======================

http://www.cndartlang.com/841.html 转载于:https://www.cnblogs.com/pythonClub/p/10732555.html

matlab 中括号

中括号用来构建向量(Vectors)或者是矩阵(Matrices)。如[6.9 9.64 sqrt(-1)] 就是一个有三个元素的向量。[11 12 13; 21 22 23] 是个2*3的矩阵. 分号(;)用来结束一行。 中括号的另一个作用是在函数中&#xff0c;分配输出参数。 Matlab 方括号“[ ]”的作用 1定义矩阵&#xff…

mysql 左连接b表的一条数据_阿里java架构师教你怎么用mysql怒怼面试官

转载地址&#xff1a;阿里java架构教你怎么用mysql怒怼面试官​www.jianshu.com说一下mysql比较宏观的面试&#xff0c;具体咋写sql的这里就不过多举例了。后面我还会给出一个关于mysql面试优化的试题&#xff0c;这里主要说的索引和BTree结构&#xff0c;很少提到我们的集群配…

详解SQL中drop、delete和truncate的异同

第一&#xff1a;相同点&#xff1a; truncate和不带where子句的delete&#xff0c;以及drop 都会删除表内的数据 第二&#xff1a;不同点&#xff1a; 1. truncate和delete只删除数据不删除表的结构(定义) drop 语句将删除表的结构被依赖的约束(constrain)、触发器(trigg…

2039 三角形

三角形 http://acm.hdu.edu.cn/showproblem.php?pid2039 1 #pragma warning(disable:4996) 2 #include<stdio.h>3 int main()4 {5 int n;6 double a, b, c;7 while (scanf("%d", &n) ! EOF)8 {9 for (int i 0; i < n; i) 10 …

java正则表达式用法示例_Java正则表达式教程及示例

java正则表达式用法示例当我开始使用Java时&#xff0c;正则表达式对我来说是一场噩梦。 本教程旨在帮助您掌握Java正则表达式&#xff0c;并让我定期返回以刷新我的正则表达式学习。 什么是正则表达式&#xff1f; 正则表达式定义字符串的模式。 正则表达式可用于搜索&#…

查看ip

查看 http://httpbin.org/ip

Python中表示偶数_蒙特卡洛模拟(Python)深入教程

译者&#xff1a;大表哥、wiige来源&#xff1a;AI研习社什么是蒙特卡罗模拟&#xff1f;蒙特卡罗方法是一种使用随机数和概率来解决复杂问题的技术。蒙特卡罗模拟或概率模拟是一种技术&#xff0c;用于了解金融部门、项目管理、成本和其他预测机器学习模型中风险和不确定性的影…

琥珀项目:Java的未来揭晓

如果一切按计划进行&#xff08;我们正在研究Jigsaw项目&#xff09;&#xff0c;那么Java 9将在不到100天的时间内启动。 您可以在此处加入倒计时以发布它。 它将包含一长串新功能和升级功能&#xff0c;其中一些我们迫不及待想要看到实际应用。 但是&#xff0c;有些功能还没…

安装saltstack

https://www.cnblogs.com/agnewee/p/6487262.html 官方资料&#xff1a;https://docs.saltstack.com/en/latest/ref/configuration/index.html 官网资料&#xff1a;https://repo.saltstack.com/#rhel yum install https://repo.saltstack.com/py3/redhat/salt-py3-repo-latest…

python中for和while区别_Python学习第九篇——while和for的区别

1 pets [dog,cat,dog,goldfish,cat,rabbit,cat]2 print(pets)3 for pet inpets:4 print(pet)5 #------------------------------------------ 6 pets [dog,cat,dog,goldfish,cat,rabbit,cat]7 print(pets)8 while pet inpets:9 print(pet) 上述代码都想打印列表中的所有元素&…

java 11:数组作为函数参数,数组做为函数返回值

1 数组作为参数 我们可以将数组作为参数&#xff0c;传入到函数中&#xff0c;其实就像我们main函数中 public void main(String [] args){};就是用数组作为函数参数&#xff1b; 又如&#xff0c; [java] view plaincopypublic class ArrayPar { public static void p…