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()
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”:
Esta modificación debería contar correctamente la frecuencia relativa de las palabras en parejas.