def test_actualizar_freqs(self): with open('resultados.json') as r: j = json.load(r) resultados = Resultados() resultados.actualizar_freqs(j)
def postear_en_dlm(self, fecha, diario, secciones): resultados = Resultados() visu = Visualizador() tolkien = Escritor() if '-' in secciones: secciones = secciones.split('-') else: secciones = [secciones] freqs = resultados.frecuencias(fecha=fecha, diario=diario, secciones=secciones, top=20, verbos=False) if not bool(freqs): return path_imagen = os.getcwd() + '/imagenes/' + diario + '-todo.png' visu.nube(path_imagen, freqs, con_espacios=False) texto = tolkien.tweet_tendencias(freqs=freqs, fecha=fecha, diario=diario) textos_e_imagenes = [{'media': [path_imagen], 'texto': texto}] for s in secciones: freqs = resultados.frecuencias(fecha=fecha, diario=diario, secciones=s, top=20, verbos=False) if not bool(freqs): continue path_imagen = os.getcwd( ) + '/imagenes/' + diario + '-' + s + '.png' visu.nube(path_imagen, freqs, con_espacios=False) texto = tolkien.tweet_tendencias(freqs=freqs, fecha=fecha, diario=diario, secciones=s) textos_e_imagenes.append({'media': [path_imagen], 'texto': texto}) cm = CM() cm.twittear_hilo('dicenlosmedios', textos_e_imagenes)
def resultados_editoriales(): resultados = Resultados() freqs = Frecuencias() k = Kiosco() total = 0 agregados = 0 diario='diariodeleuco' seccion='editorial' editoriales = k.noticias(diario=diario, secciones=seccion) buffer_resultado = [] for e in editoriales: f_ter_tit, f_ver_tit, f_per_tit, f_ter_txt, f_ver_txt, f_per_txt = freqs.tituloytexto2freqs(e.titulo,e.texto) buffer_resultado.append({'diario':diario, 'seccion': seccion, 'fecha': e.fecha.strftime('%Y%m%d%H%M%S'), 'url':e.url, 'f_ter_tit': f_ter_tit, 'f_ver_tit': f_ver_tit, 'f_per_tit': f_per_tit, 'f_ter_txt': f_ter_txt, 'f_ver_txt': f_ver_txt, 'f_per_txt': f_per_txt}) resultados.bd.frecuencias.insert_many(buffer_resultado)
def actualizar_resultados(medio): frecuencias = Frecuencias(medio.noticias) try: frecuencias.calcular() except: print('error calculando frecuencias de ' + medio.etiqueta + ': ' + str(sys.exc_info()[0])) return False resultados = Resultados() try: resultados.actualizar_freqs(frecuencias.resultados) except: print('error actualizando frecuencias de ' + medio.etiqueta + ': ' + str(sys.exc_info()[0])) return False return True
def actualizar_resultados_discursos(medio): frecuencias = Frecuencias([]) freqs_discursos = [] try: for discurso in medio.noticias: tokens_tit, tokens_txt = frecuencias.tokens( discurso.titulo, discurso.texto) resultado = { 'presidente': discurso.seccion, 'fecha': discurso.fecha.strftime('%Y%m%d'), 'hora': discurso.fecha.strftime('%H%M%S'), 'url': discurso.url, 'adjtit': frecuencias.top(tokens_tit['adjetivos'], 30), 'sustit': frecuencias.top(tokens_tit['sustantivos'], 30), 'vertit': frecuencias.top(tokens_tit['verbos'], 30), 'enttit': frecuencias.top(tokens_tit['entidades'], 30), 'adjtxt': frecuencias.top(tokens_txt['adjetivos'], 50), 'sustxt': frecuencias.top(tokens_txt['sustantivos'], 50), 'vertxt': frecuencias.top(tokens_txt['verbos'], 50), 'enttxt': frecuencias.top(tokens_txt['entidades'], 50) } freqs_discursos.append(resultado) except: print('error calculando frecuencias de ' + medio.etiqueta + ': ' + str(sys.exc_info()[0])) return False resultados = Resultados() try: resultados.bd.frecuencias_discursos.insert_many(freqs_discursos) except: print('error actualizando frecuencias de ' + medio.etiqueta + ': ' + str(sys.exc_info()[0])) return False return True
def postear_contador(self, fecha, concepto): resultados = Resultados() tolkien = Escritor() terminos = { 'cfk': [ 'CFK', 'Kirchner', 'Cristina', 'Cristina Kirchner', 'Cristina Fernández', 'Cristina Fernández de Kirchner', 'Cristina Fernández De Kirchner', 'Vicepresidenta' ], 'dolar': ['dólar', 'US$', 'Dólar'], 'corrupcion': ['corrupción', 'corrupto', 'Corrupción'], 'larreta': [ 'Larreta', 'Horacio Larreta', 'Rodríguez Larreta', 'Horacio Rodríguez', 'Horacio Rodríguez Larreta' ], 'venezuela': [ 'Venezuela', 'Nicolás Maduro', 'Maduro', 'Chávez', 'Hugo Chávez', 'Chavez', 'Hugo Chavez' ], 'inseguridad': ['inseguridad', 'inseguro'], 'miedo': ['miedo', 'muerte', 'muerto', 'muerta', 'asesinato', 'horror'] } tabla = {} for medio in [ medio for medio in tolkien.hashtags.keys() if medio != 'casarosada' ]: freqs = resultados.frecuencias(fecha=fecha, diario=medio, verbos=False, top=2000) if not bool(freqs): continue total = sum( [f[1] for f in freqs.items() if f[0] in terminos[concepto]]) if total == 0: continue tabla[medio] = total if len(tabla) == 0: return ordenada = { k: v for k, v in sorted( tabla.items(), key=lambda item: item[1], reverse=True) } texto = tolkien.tweet_contador(concepto=concepto, freqs=ordenada, fecha=fecha) cm = CM() cm.twittear_texto('dicenlosmedios', texto)
def postear_en_discursoshistoricos(self, cuenta, fecha=None): resultados = Resultados() kiosco = Kiosco() visu = Visualizador() tolkien = Escritor() presidente, subfijopng, hashtag = self.info_cuenta(cuenta) # recupero frecuencias al azar freqs = resultados.bd.frecuencias_discursos.aggregate([{ '$match': { 'presidente': presidente } }, { '$sample': { 'size': 1 } }]) if not bool(freqs): return cm = CM() for freq in freqs: # recupero texto del discurso discurso = kiosco.noticias(diario='casarosada', url=freq['url'])[0] # armo tweet con el discurso en imagenes texto = " ".join( re.split("\s+", discurso['texto'], flags=re.UNICODE)) paths_imagenes = visu.texto_en_imagenes( texto, 'calibri.ttf', 17, 800, 600, os.getcwd() + "/imagenes/intro" + subfijopng) # TODO: la fecha esta MAL. pasar de date a string. tw_intro = { 'texto': "Discurso del " + tolkien.separar_fecha(fecha=freq['fecha']) + " de " + hashtag + ". Hilo 👇", 'media': paths_imagenes } # armo textos del tweet txt_sustantivos = tolkien.texto_tweet_sustantivos_discurso( freq['sustxt']) txt_adjetivos = tolkien.texto_tweet_adjetivos_discurso( freq['adjtxt']) # armo tweet con top 15 de terminos path_imagen_sustantivos = os.getcwd( ) + '/imagenes/sustantivos_discurso' + subfijopng + '.png' etiquetas_sustantivos = [ nombre for nombre, m in freq['sustxt'].items() ][:15] data_sustantivos = [m for nombre, m in freq['sustxt'].items()][:15] visu.lollipop(path=path_imagen_sustantivos, colormap=visu.cmap_del_dia(), titulo="Frecuencia de sustantivos", etiquetas=etiquetas_sustantivos, unidad="cantidad de apariciones", valfmt="{x:.0f}", data=data_sustantivos) tw_terminos = { 'texto': txt_sustantivos, 'media': [path_imagen_sustantivos] } # armo tweet con top 15 de verbos path_imagen_adjetivos = os.getcwd( ) + '/imagenes/adjetivos_discurso' + subfijopng + '.png' etiquetas_adjetivos = [ nombre for nombre, m in freq['adjtxt'].items() ][:15] data_adjetivos = [m for nombre, m in freq['adjtxt'].items()][:15] visu.lollipop(path=path_imagen_adjetivos, colormap=visu.cmap_del_dia(), titulo="Frecuencia de adjetivos", etiquetas=etiquetas_adjetivos, unidad="cantidad de apariciones", valfmt="{x:.0f}", data=data_adjetivos) tw_verbos = { 'texto': txt_adjetivos, 'media': [path_imagen_adjetivos] } # el CM twittea cm.twittear_hilo(cuenta, [tw_intro, tw_terminos, tw_verbos])
def postear_en_discursosdeaf(self, fecha): resultados = Resultados() kiosco = Kiosco() visu = Visualizador() tolkien = Escritor() # recupero frecuencias del discurso freqs = resultados.bd.frecuencias_discursos.aggregate([{ '$match': { 'presidente': 'alberto', 'fecha': fecha } }]) if not bool(freqs): return cm = CM() for freq in freqs: # recupero texto del discurso discurso = kiosco.noticias(diario='casarosada', url=freq['url'])[0] # armo tweet con el discurso en imagenes texto = " ".join( re.split("\s+", discurso['texto'], flags=re.UNICODE)) paths_imagenes = visu.texto_en_imagenes( texto, 'calibri.ttf', 17, 800, 600, os.getcwd() + "/imagenes/introaf") tw_intro = { 'texto': "Discurso del " + tolkien.separar_fecha(fecha=freq['fecha']) + " de #AlbertoFernández. Hilo 👇", 'media': paths_imagenes } # armo textos del tweet txt_sustantivos = tolkien.texto_tweet_sustantivos_discurso( freq['sustxt']) txt_adjetivos = tolkien.texto_tweet_adjetivos_discurso( freq['adjtxt']) # armo tweet con top 15 de terminos path_imagen_sustantivos = os.getcwd( ) + '/imagenes/sustantivos_discursoaf.png' etiquetas_sustantivos = [ nombre for nombre, m in freq['sustxt'].items() ][:15] data_sustantivos = [m for nombre, m in freq['sustxt'].items()][:15] visu.lollipop(path=path_imagen_sustantivos, colormap=visu.cmap_del_dia(), titulo="Frecuencia de sustantivos", etiquetas=etiquetas_sustantivos, unidad="cantidad de apariciones", valfmt="{x:.0f}", data=data_sustantivos) tw_terminos = { 'texto': txt_sustantivos, 'media': [path_imagen_sustantivos] } # armo tweet con top 15 de verbos path_imagen_adjetivos = os.getcwd( ) + '/imagenes/adjetivos_discursoaf.png' etiquetas_adjetivos = [ nombre for nombre, m in freq['adjtxt'].items() ][:15] data_adjetivos = [m for nombre, m in freq['adjtxt'].items()][:15] visu.lollipop(path=path_imagen_adjetivos, colormap=visu.cmap_del_dia(), titulo="Frecuencia de adjetivos", etiquetas=etiquetas_adjetivos, unidad="cantidad de apariciones", valfmt="{x:.0f}", data=data_adjetivos) tw_verbos = { 'texto': txt_adjetivos, 'media': [path_imagen_adjetivos] } # el CM twittea cm.twittear_hilo('discursosdeaf', [tw_intro, tw_terminos, tw_verbos])
def subir_historicos(path_discursos_historicos): buffer_kiosco = [] buffer_resultado = [] resultados = Resultados() freqs = Frecuencias() k = Kiosco() bd = k.bd total = 0 agregados = 0 with open(path_discursos_historicos) as f: for linea in f: total += 1 jdiscurso = json.loads(linea) texto = jdiscurso['texto'] if not texto: continue diario = jdiscurso['diario'] url = jdiscurso['url'] titulo = jdiscurso['titulo'] fecha = datetime.datetime.strptime(jdiscurso['fecha']['$date'], '%Y-%m-%dT%H:%M:%SZ') # if fecha.strftime('%Y%m%d%H%M%S') > '20071206233745': # continue sfecha = fecha.strftime('%Y%m%d') seccion = "" if sfecha >= "20191210": seccion = "alberto" if sfecha < "20191210" and sfecha >= "20151210": seccion = "macri" if sfecha < "20151210" and sfecha >= "20071210": seccion = "cristina" if sfecha < "20071210": seccion = "nestor" # if self.contar_noticias(diario=diario, secciones=seccion, url=url): # continue if seccion != "nestor": continue if resultados.bd.frecuencias.find_one({'diario': diario, 'seccion': seccion, 'fecha': fecha.strftime('%Y%m%d%H%M%S'), 'url':url}): continue while resultados.bd.frecuencias.find_one({'diario': diario, 'seccion': seccion, 'fecha': fecha.strftime('%Y%m%d%H%M%S')}): fecha += datetime.timedelta(seconds=10) while existe_fecha(fecha, buffer_resultado): fecha += datetime.timedelta(seconds=10) # buffer_kiosco.append({'diario': diario, 'cat':seccion, 'fecha': fecha, 'url':url, 'titulo':titulo, 'texto':texto}) # if len(buffer_kiosco) >= 100: # self.bd.noticias.insert_many(buffer_kiosco) # agregados += 100 # buffer_kiosco = [] # print('total procesados: ' + str(total) + '. agregados ' + str(agregados) + ' en total en Kiosco') f_ter_tit, f_ver_tit, f_per_tit, f_ter_txt, f_ver_txt, f_per_txt = freqs.tituloytexto2freqs(titulo,texto) buffer_resultado.append({'diario':diario, 'seccion': seccion, 'fecha': fecha.strftime('%Y%m%d%H%M%S'), 'url':url, 'f_ter_tit': f_ter_tit, 'f_ver_tit': f_ver_tit, 'f_per_tit': f_per_tit, 'f_ter_txt': f_ter_txt, 'f_ver_txt': f_ver_txt, 'f_per_txt': f_per_txt}) if len(buffer_resultado) >= 100: resultados.bd.frecuencias.insert_many(buffer_resultado) agregados += 100 buffer_resultado = [] print('total procesados: ' + str(total) + '. agregados ' + str(agregados) + ' en total en Resultados') if len(buffer_resultado): bd.noticias.insert_many(buffer_resultado) print('total procesados: ' + str(total) + '. agregados ' + str(agregados+len(buffer_kiosco)) + ' en total en Resultados') print('fin')