您的位置:首页 > 其它

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

2017-06-01 23:00 609 查看
最近在处理文本之间相似度的时候,遇到这样的问题:现在每天要计算800w文本两两之间的相似度。

给出的输入数据样例是这样的:



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

数据存储

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





在本需求中的应用

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