es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Contando la frecuencia relativa en pares de tiras utilizando MapReduce.

Soy nuevo en Python y quiero usar el paquete de MrJob para contar la frecuencia relativa de pares de palabras. Escribí el código de abajo pero no produce la salida correcta.
¿Puedes por favor ayudarme con mis errores?
((𝜆|𝜇) = 𝜆𝜓𝜖𝜗𝜕(𝜆, 𝜇)/𝜆𝜓𝜖𝜗𝜕(𝜇)=𝜆𝜓𝜖𝜗𝜕(𝜆, 𝜇)/∑A’ 𝜆𝜓𝜖𝜗𝜕(𝜆’ , 𝜇)`

import re
from collections import defaultdict

from mrjob.job import MRJob

WORD_RE = re.compile(r"[\w']+")


class MRRelativeFreq(MRJob):
    def mapper(self, _, line):
        for word in WORD_RE.findall(line):
          for wordpair in WORD_RE.findall(line):
            if word != wordpair:
               yield (word.lower(), wordpair.lower(), 1)

    def reducer(self, key, values):
        cnts = defaultdict(int)
        total = 0
        for (word, count) in values:
          cnt=0
          total += count
          cnts[word] += count

        for (k,kp), v in cnts.items():
            yield (k,kp), (v, float(v) / total) 

    def combiner(self, key, values):
        yield None, (key, sum(values))


if __name__ == '__main__':
    MRRelativeFreq.run()
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema con el código parece estar en el método “reducer”. El código espera una tupla de (palabra, cuenta) como entrada, pero el método “mapper” está generando una tupla que contiene tres elementos (palabra1, palabra2, 1). La solución es modificar el método “reducer” para analizar correctamente los tres elementos en la tupla generada por el método “mapper”. Aquí hay una versión modificada del método “reducer”:

    def reducer(self, key, values):
        cnts = defaultdict(int)
        total = 0
        for word1, word2, count in values:
            if word1 != word2:
                total += count
                cnts[(word1, word2)] += count
    
        for (k, kp), v in cnts.items():
            yield (k, kp), (v, float(v) / total) 
    

    Esta modificación debería contar correctamente la frecuencia relativa de las palabras en parejas.

Comments are closed.