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矩阵乘法源码

hadoop矩阵乘法源码_使用Hadoop计算共现矩阵相关推荐

  1. 使用Hadoop计算共现矩阵

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

  2. python矩阵乘法 点乘_转(matlab和numpy矩阵乘法异同)

    广义的矩阵的矩阵乘法包括:矩阵相乘,矩阵点乘,向量乘法与向量点乘,内积. 对应的MATLAB有[* , .* , dot]三种运算符.分别表示的相乘,点乘和内积. 而在numpy中呢,也有*和dot两 ...

  3. 抖音seo矩阵系统,抖音矩阵系统源码怎么搭建?

    抖音seo矩阵系统,抖音矩阵系统源码怎么搭建? 抖音seo矩阵系统,抖音矩阵系统源码怎么搭建?抖音矩阵系统即是在抖音平台的基础上进行多账号的布局,形成客户不论搜索账号,视频以及关键词视频时,平台反馈出 ...

  4. (转) 基于MapReduce的ItemBase推荐算法的共现矩阵实现(一)

    转自:http://zengzhaozheng.blog.51cto.com/8219051/1557054 一.概述 这2个月为公司数据挖掘系统做一些根据用户标签情况对用户的相似度进行评估,其中涉及 ...

  5. A股实践 :图神经网络与新闻共现矩阵策略(附代码)

    量化投资与机器学习微信公众号,是业内垂直于量化投资.对冲基金.Fintech.人工智能.大数据等领域的主流自媒体.公众号拥有来自公募.私募.券商.期货.银行.保险.高校等行业30W+关注者,荣获202 ...

  6. 关键词提取一:构造共现矩阵

    因为TFIDF算法的提取关键词的准确性很差,tfidf提取出的关键词很难看出文本的主旨,于是考虑结合文本语义对词汇的权重(IDF)重新分配,于是想要借鉴SKE算法,即将词语语义特征融入关键词提取过程中 ...

  7. 宝宝起名神器小程序源码_支持多种流量主模式

    2022年马上到了,还不知道怎么给虎宝宝取名字么? 那么这款小程序源码就可以帮到你了,这款小程序支持输入姓氏自动起名. 不满意还可以点击换一换来找到满意的,支持起两个字或者三个字的名字. 另外也给该款 ...

  8. 新动态视频壁纸微信小程序源码_支持多种分类短视频-也有静态壁纸

    这是一款主打动态视频壁纸的一款微信小程序源码,当然啦,里面也是有静态壁纸的. 其实这款小程序也可以说是短视频小程序都可以,该款小程序全采集,另外支持多种流量主!! 下载链接: 新动态视频壁纸微信小程序 ...

  9. 图片拼图微信小程序源码_支持多模板制作和流量主

    介绍: 该款小程序支持多种流量主: 另外支持多种图形模板制作切割: 另外也支持长图合成等功能: 安装简单,新手容易上手,具体就不多说了大家自行研究吧!!!! 图片拼图微信小程序源码_支持多模板制作和流 ...

最新文章

  1. 当我们在谈论内存时,我们在谈论什么
  2. 抽象类可以创建对象吗_【基础篇】java-抽象类与继承的补充
  3. linux删除含有特殊字符的行,Linux 删除带有特殊字符的文件
  4. c++的提示类未定义_推荐一款适合初学者的C/C++IDE
  5. 如何从零学习PostgreSQL Page结构
  6. hnu 暑期实训之web导航
  7. python遇到‘\u’开头的unicode编码
  8. 一些技术大牛的博客集锦(转)
  9. 数据结构详解之向量vector
  10. TI CCS下载地址
  11. 豆丁文档无需豆元直接下载
  12. windows内核开发笔记二:错误信息处理
  13. react native Android 手机摇一摇与菜单键无效
  14. 这个牛逼哄哄的数据库开源了
  15. 唯样商城:芯片解密的优缺点有哪些
  16. 《2022-移动端游戏版号申请详解》
  17. 一、fMRI介绍及实验设计
  18. 我的世界服务器无限装备指令2020,我的世界手机版指令表
  19. M1下mongodb、mysql
  20. 龚文祥:VC看B2C的5个核心数据

热门文章

  1. Spring @Qualifier 注释
  2. Java多线程:线程安全和非线程安全的集合对象
  3. 获取一个 Byte 的各个 Bit 值
  4. 阿里巴巴对Java编程【常量定义】的规约
  5. Vue父组件使用子组件时,需要携带参数,函数内如何获取子组件给的值
  6. .sync的一个用法
  7. String与StringBuffer、StringBuilder之间的转换
  8. 集成SpringSecurity---SpringBoot
  9. 在C语言的函数定义中 如果不需要返回结果,在C语言的函数定义中,如果不需要返回结果,就可以省略return语句...
  10. MySQL优化(一):表结构优化