如何计算一个词序列在文件中出现的次数,在 Python 中使用 MapReduce?

问题描述

考虑一个包含用空格分隔的单词的文件;用 Python 编写一个 MapReduce 程序, 计算每个 3 字序列在文件中出现的次数

例如,考虑以下文件

one two three seven one two three
three seven one
seven one two

这个文件中每3个词序列出现的次数是:

"three seven one" 2
"four seven one two" 1
"one two three" 2
"seven one two" 2
"two three seven" 1

代码格式:

from mrjob.job import MRJob


class MR3Nums(MRJob):
    
    def mapper(self,_,line):
        pass

    def reducer(self,key,values):
        pass
    

if __name__ == "__main__":
    MR3Nums.run()

解决方法

映射器应用于每一行,并且应该计算每个 3-word 序列,即产生 3-word 序列以及计数 1。

reducer 使用 keyvalues 调用,其中 key 是一个 3 字序列,values 是一个计数列表(这将是1 秒)。 reducer 可以简单地返回一个 3 字序列的元组和总出现次数,后者通过 sum 获得。

class MR3Nums(MRJob):
    
    def mapper(self,_,line):
        sequence_length = 3
        words = line.strip().split()
        for i in range(len(words) - sequence_length + 1):
            yield " ".join(words[i:(i+sequence_length)]),1

    def reducer(self,key,values):
        yield key,sum(values)