Mapreduce 矩阵相乘应用--计算文本间的相似度

  • 最近在处理文本之间相似度的时候,遇到这样的问题:现在每天要计算800w文本两两之间的相似度。
    • 给出的输入数据样例是这样的:

    • 第一个字段为文本的ID,其余字段为 词|权重 ……。 原本作矩阵我采取的通用做法为缓存小表。然后将大表作为输入,然后进行计算。 现在数据规模变大了,当然要采取另外的一种方式进行处理。

数据存储

  • 从要求中可以分析出,这个矩阵是一个稀疏矩阵,因为毕竟每个文本只能包含少部分词语。 因此采用稀疏矩阵的方式进行存储。只存储那些非零的数值。具体而言,存储矩阵的文件每一条记录的结构如上图所示,(文本ID 词 权重)
  • 计算模型:

在本需求中的应用

  • 通过以上的方法可以看到,这种方法是用大量的硬盘空间来换取内存空间。因为每个词的权重 要重发发送很多变。
  • 其次,在使用上述方法的时候,需要对新闻和词建立统一的索引。比如 “科技”这个词的索引为0, “文化”这个词的索引为1,换句话说,就是将矩阵的横纵坐标对应到每个词和新闻当中。
  • 最后计算相似度的时候,输入数据要存成两份,一份作矩阵A,一份作为矩阵A的转置,然后进行相乘。
  • ps:这里说明一下,在使用mapreduce 中的MultipleInputs的时候,我设置了两个Map,一个处理A矩阵,一个处理A矩阵的转置,发现不可以。因为MultipleInputs这个类只能针对不同的路径采取不同的Map和InputFormat。所以如果路径相同了。那么后面的会覆盖掉前面的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值