Эта программа python3 пытается создать частотный список слов из текстового файла, используя map/reduce. Я хотел бы знать, как упорядочить подсчет слов, представленный как «счет» во втором выражении выхода редуктора, так что наибольшие значения подсчета появляются последними. В настоящее время хвост результатов выглядеть следующим образом:Карта/сокращение двухэтапного порядка подсчетов
"0002" "wouldn"
"0002" "wrap"
"0002" "x"
"0002" "xxx"
"0002" "young"
"0002" "zone"
Для контекста, я прохожу любой текстовый файл слово в программу Python3 так:
python MapReduceWordFreqCounter.py book.txt
Вот код для MapReduceWordFreqCounter.py
:
from mrjob.job import MRJob
from mrjob.step import MRStep
import re
# ignore whitespace characters
WORD_REGEXP = re.compile(r"[\w']+")
class MapReduceWordFreqCounter(MRJob):
def steps(self):
return [
MRStep(mapper=self.mapper_get_words,
reducer=self.reducer_count_words),
MRStep(mapper=self.mapper_make_counts_key,
reducer = self.reducer_output_words)
]
def mapper_get_words(self, _, line):
words = WORD_REGEXP.findall(line)
for word in words:
yield word.lower(), 1
def reducer_count_words(self, word, values):
yield word, sum(values)
def mapper_make_counts_key(self, word, count):
yield str(count).rjust(4,'0'), word
def reducer_output_words(self, count, words):
for word in words:
yield count, word
if __name__ == '__main__':
MapReduceWordFreqCounter.run()