Ce programme python3 tente de produire une liste de fréquence de mots à partir d'un fichier texte en utilisant map/reduce. Je voudrais savoir comment commander le nombre de mots, représenté comme «compte» dans la déclaration de rendement du deuxième réducteur de sorte que les plus grandes valeurs de compte apparaissent en dernier. À l'heure actuelle, la queue des résultats ressembler à ceci:Mapper/réduire l'ordre de comptage en deux étapes
"0002" "wouldn"
"0002" "wrap"
"0002" "x"
"0002" "xxx"
"0002" "young"
"0002" "zone"
Pour le contexte, je passe un fichier texte de mot dans le programme python3 comme ceci:
python MapReduceWordFreqCounter.py book.txt
Voici le code pour 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()