def leer_todo(self): kiosco = Kiosco() print("leyendo '" + self.etiqueta + "'...") tag_regexp = re.compile(r'<[^>]+>') entradas = [] url_feed_template = self.feeds['todo'] + "&start=" index = 0 feed = fp.parse(url_feed_template + str(index)) while len(feed.entries) > 0: entradas.extend(feed.entries) index += 40 feed = fp.parse(url_feed_template + str(index)) for entrada in entradas: titulo = entrada.title texto = bs(re.sub(tag_regexp, ' ', entrada.summary), features="lxml").text fecha = dateutil.parser.parse(entrada.published) url = entrada.link if kiosco.bd.noticias.find(filter={ 'diario': self.etiqueta, 'url': url }).count() > 0: # si existe ya la noticia (url), no la decargo continue self.noticias.append( Noticia(fecha=fecha, url=url, diario=self.etiqueta, categoria='todo', titulo=titulo, texto=self.limpiar_texto(texto)))
def leer(self): kiosco = Kiosco() print("leyendo '" + self.etiqueta + "'...") tag_regexp = re.compile(r'<[^>]+>') for tag, url_feed in self.feeds.items(): for entrada in fp.parse(url_feed).entries: titulo = entrada.title texto = re.sub(tag_regexp, ' ', entrada.content[0].value) fecha = dateutil.parser.parse( entrada.published) - datetime.timedelta(hours=3) url = entrada.link if kiosco.bd.noticias.find(filter={ 'diario': self.etiqueta, 'url': url }).count() > 0: # si existe ya la noticia (url), no la decargo continue self.noticias.append( Noticia(fecha=fecha, url=url, diario=self.etiqueta, categoria=tag, titulo=titulo, texto=self.limpiar_texto(texto)))
def perfil(parametros): fecha = parametros['fecha'] medios = set(parametros['medios']) twittear = parametros['twittear'] if len(medios) == 0: medios = set([ 'clarin', 'lanacion', 'infobae', 'paginadoce', 'eldestape', 'telam', 'perfil', 'ambito', 'tn' ]) string_fecha = "" if type(fecha) is dict: string_fecha = fecha['desde'].strftime( "%d.%m.%Y") + " al " + fecha['hasta'].strftime("%d.%m.%Y") else: string_fecha = fecha.strftime("%d.%m.%Y") with open('medios/diarios/config.yaml', 'r') as stream: try: config = yaml.safe_load(stream) except yaml.YAMLError as exc: print(exc) etiqueta_medios = [] k = Kiosco() for diario in config['diarios']: tag = diario['tag'] categorias = k.categorias_existentes(diario=tag) etiqueta_medios = [diario['twitter']] if tag not in medios: continue lista_medio = [] total = k.contar_noticias(diario=tag, fecha=fecha) if total == 0: continue for cat in categorias: n = k.contar_noticias(diario=tag, categorias=[cat], fecha=fecha) lista_medio.append(n) data = [] data.extend([n * 100 / total for n in lista_medio]) path_imagen = "perfil-" + tag + ".jpg" utiles.lollipop(path=path_imagen, colormap=utiles.cmap_del_dia(), titulo="Resumen de " + diario['twitter'] + " - " + string_fecha, etiquetas=categorias, unidad="cantidad de noticias", valfmt="{x:.0f}", data=lista_medio) if twittear: texto = "Suma de noticias de #" + tag + " del " + string_fecha + ", en cada una de sus secciones." utiles.twittear(texto=texto, path_imagen=path_imagen, cuenta="dlm")
def leer(self): kiosco = Kiosco() print("leyendo '" + self.etiqueta + "'...") for url, fecha, categoria in self.getTuplas(): self.noticias.append( Noticia(fecha=fecha, url=url, diario=self.etiqueta, categoria=categoria, titulo=titulo, texto=self.limpiar_texto(texto)))
def twittear_hilo(parametros): # tw_intro = {'texto': "Análisis de discurso del string_fecha de #MauricioMacri.", 'media': ['intro0.png','intro1.png']} # tw_terminos = { 'texto': '@dicenlospresis tweet con terminos', 'media': ["dlp_terminos.png"] } # tw_verbos = {'texto': '@dicenlospresis tweet con verbos', 'media': ["dlp_verbos.png"]} # utiles.twittear_hilo([tw_intro, tw_terminos, tw_verbos], cuenta="dlp") # return fecha = parametros['fecha'] kiosco = Kiosco() textos = [ noticia['texto'] for noticia in kiosco.noticias( diario='casarosada', categorias='', fecha=fecha) ] if len(textos) == 0: return nlp = NLP() nlp.separador = '' for texto in textos: # tw_intro = tweet_intro(texto, string_fecha) # ACA ESTA EL ERROR; STRING FECHA ESTA EN FORMADO MM.DD.YYYY, DEBERIA ESTAR EN YYYY.MM.DD tw_intro = tweet_intro(texto, fecha) kiosco = Kiosco() top_terminos = nlp.top_terminos(textos=[texto], n=15) top_verbos = nlp.top_verbos(textos=[texto], n=15) tw_terminos = tweet_terminos(top_terminos) tw_verbos = tweet_verbos(top_verbos) if parametros['twittear']: utiles.twittear_hilo([tw_intro, tw_terminos, tw_verbos], cuenta="dlp")
def leer(self): kiosco = Kiosco() print("leyendo '" + self.etiqueta + "'...") for url, fecha, titulo, categoria in self.entradas_feed(): if kiosco.contar_noticias( diario=self.etiqueta, url=url): # si existe ya la noticia (url), no la decargo continue texto = self.parsear_noticia(url=url) if texto == None: continue self.noticias.append( Noticia(fecha=fecha, url=url, diario=self.etiqueta, categoria=categoria, titulo=titulo, texto=texto))
def top_personas(self, textos, n=10): if self.bigramas == None and self.trigramas == None: # si todavia no se calcularon los ngramas, los calculo # recupero las noticias deL ultimo dia para armar los bigramas hasta = datetime.datetime.now() desde = hasta - datetime.timedelta(days=1) kiosco = Kiosco() set_entrenamiento = [noticia['titulo'] + " " + noticia['texto'] for noticia in kiosco.noticias(fecha={'desde':desde, 'hasta':hasta})][:200] personas = self.__bolsa_de_personas__(set_entrenamiento) self.__entrenar_bigramas__(set_entrenamiento=personas) self.__entrenar_trigramas__(set_entrenamiento=personas) personas = self.__bolsa_de_personas__(textos) personas_con_bigramas = self.bigramas[personas] personas_con_trigramas = self.trigramas[personas_con_bigramas] personas_freq_tri = defaultdict(int) for sent in personas_con_trigramas: for i in sent: personas_freq_tri[i] += 1 # top_tri = {k: personas_freq_tri[k] for k in sorted(personas_freq_tri, key=personas_freq_tri.get, reverse=True)} # lo limito a 50 porque estan los relevantes, mas alla del 100 hay basura list_top_tri_ordenado = [(k, personas_freq_tri[k]) for k in sorted(personas_freq_tri, key=personas_freq_tri.get, reverse=True)][:50] nombres_a_borrar = [] for nombre, freq in list_top_tri_ordenado: for nombre_2, freq_2 in list_top_tri_ordenado: if nombre != nombre_2 and nombre in nombre_2: personas_freq_tri[nombre_2] += freq if nombres_a_borrar.count(nombre) == 0: nombres_a_borrar.append(nombre) break for nombre in nombres_a_borrar: del personas_freq_tri[nombre] list_top_tri = [(k, personas_freq_tri[k]) for k in sorted(personas_freq_tri, key=personas_freq_tri.get, reverse=True) if k.count("_") > 0 and k.count("_") < 3][:n] return [(concepto.replace('_', self.separador), numero) for concepto, numero in list_top_tri]
def leer(self): kiosco = Kiosco() print("leyendo '" + self.etiqueta + "'...") for tag, url_feed in self.feeds.items(): for url_noticia, fecha in self.reconocer_urls_y_fechas_noticias( url_feed=url_feed): if kiosco.bd.noticias.find(filter={ 'diario': self.etiqueta, 'url': url_noticia }).count() > 0: # si existe ya la noticia (url), no la decargo continue noticia = self.nueva_noticia(url=url_noticia, categoria=tag, diario=self.etiqueta) if noticia == None: continue if noticia.fecha == None: noticia.fecha = fecha self.noticias.append(noticia)
def leer(self): kiosco = Kiosco() print("leyendo '" + self.etiqueta + "'...") tag_regexp = re.compile(r'<[^>]+>') for entrada in fp.parse(self.feed_noticias).entries: url = entrada.link if kiosco.contar_noticias( diario=self.etiqueta, url=url): # si existe ya la noticia (url), no la decargo continue titulo = entrada.title texto = re.sub(tag_regexp, ' ', entrada.content[0].value) fecha = dateutil.parser.parse( entrada.published) - datetime.timedelta(hours=3) categoria = url.split('/')[3] if categoria == "america": categoria = "internacional" if categoria == "teleshow": categoria = "espectaculos" if categoria == "deportes-2": categoria = "deportes" if categoria not in self.categorias: continue self.noticias.append( Noticia(fecha=fecha, url=url, diario=self.etiqueta, categoria=categoria, titulo=titulo, texto=self.limpiar_texto(texto)))
def test_sumar_noticias_a_fecha(self): fecha = Kiosco("20190621") fecha.agregar("infobae", "internacional", )
def leer_medio(medio): medio.leer() kiosco = Kiosco() kiosco.actualizar_diario(medio)
def intensidad(parametros): fecha = parametros['fecha'] medios = set(parametros['medios']) categorias = parametros['categorias'] twittear = parametros['twittear'] if len(categorias) == 0: categorias = [ 'politica', 'economia', 'sociedad', 'internacional', 'deportes', 'espectaculos', 'cultura' ] if len(medios) == 0: medios = set([ 'clarin', 'lanacion', 'infobae', 'paginadoce', 'eldestape', 'telam', 'perfil', 'ambito', 'tn' ]) string_fecha = "" if type(fecha) is dict: string_fecha = fecha['desde'].strftime( "%d.%m.%Y") + " al " + fecha['hasta'].strftime("%d.%m.%Y") else: string_fecha = fecha.strftime("%d.%m.%Y") data = [] k = Kiosco() with open('medios/diarios/config.yaml', 'r') as stream: try: config = yaml.safe_load(stream) except yaml.YAMLError as exc: print(exc) etiqueta_medios = [] for diario in config['diarios']: tag = diario['tag'] etiqueta_medios.append(diario['twitter']) if tag not in medios and len(medios) > 0: continue lista_medio = [] total = k.contar_noticias(diario=tag, fecha=fecha) if total == 0: continue for cat in categorias: n = k.contar_noticias(diario=tag, categorias=[cat], fecha=fecha) lista_medio.append(n) data.append([n * 100 / total for n in lista_medio]) conteo = np.array(data) fig, ax = plt.subplots() im, cbar = utiles.heatmap(conteo, etiqueta_medios, categorias, ax=ax, cmap=utiles.cmap_del_dia(), cbarlabel=string_fecha, cbar_format="{x:.0f}%") texts = utiles.annotate_heatmap(im, valfmt="{x:.1f}") path_imagen = "intensidad.jpg" fig.tight_layout() plt.savefig(path_imagen, bbox_inches='tight', dpi=100) if len(categorias) > 0: hashtags_categorias = " #" + " #".join( [" #".join(categorias[:-1]), categorias[-1]] if len(categorias) > 2 else categorias) medios = list(medios) if len(medios) > 0: hashtags_medios = " #" + " #".join( [" #".join(medios[:-1] ), medios[-1]] if len(medios) > 2 else medios) if twittear: texto = "Porcentaje de noticias x categoría." + hashtags_medios + hashtags_categorias + "." utiles.twittear(texto=texto, path_imagen=path_imagen, cuenta="dlm")
with open('medios/diarios/config.yaml', 'r') as stream: try: config = yaml.safe_load(stream) except yaml.YAMLError as exc: print(exc) tag_medios = [diario['tag'] for diario in config['diarios'] if diario['tag'] != 'casarosada'] categorias = ['politica', 'economia', 'internacional'] tuplas_tag_cat = [] for tag in tag_medios: for cat in categorias: tuplas_tag_cat.append((tag, cat)) k = Kiosco() # recupero el indice indice_twittero = k.bd.temp.find_one({'clave':'indice-twittero'}) if indice_twittero: idx = indice_twittero['idx'] if idx < len(tuplas_tag_cat): # actualizo el indice de la bd: lo incremento en 1 k.bd.temp.update_one({'clave':'indice-twittero'}, {'$inc':{'idx':1}}) else: # si ya recorrio todas las tuplas, entonces quiere decir que ya twitteo todo. espero a que vuelvan a reinicar el idx. exit # si ya supero el numero total de tuplas, entonces lo reseteo a 0 # k.bd.temp.replace_one({'clave':'indice-twittero'}, {'clave':'indice-twittero', 'idx':1}, upsert=True) # idx = 0
def leer_historico(parametros): cr = CasaRosada() # cr.leer_todo() cr.leer_historico() kiosco = Kiosco() kiosco.actualizar_diario(cr)
def top_todo(parametros): fecha = parametros['fecha'] top_max = parametros['top_max'] medios = set(parametros['medios']) categorias = parametros['categorias'] twittear = parametros['twittear'] solo_titulos = parametros['solo_titulos'] kiosco = Kiosco() with open('medios/diarios/config.yaml', 'r') as stream: try: config = yaml.safe_load(stream) except yaml.YAMLError as exc: print(exc) nlp = NLP() nlp.separador = '' for diario in config['diarios']: tag = diario['tag'] if tag not in medios and len(medios) > 0: continue hashtag = diario['hashtag'] textos = [] contenido = "las noticias" if solo_titulos: textos = [ noticia['titulo'] for noticia in kiosco.noticias( diario=tag, categorias=categorias, fecha=fecha) ] contenido = "los títulos" else: textos = [ noticia['titulo'] + " " + noticia['titulo'] + " " + noticia['texto'] for noticia in kiosco.noticias( diario=tag, categorias=categorias, fecha=fecha) ] print("tag: " + tag + " textos: " + str(len(textos))) if len(textos) == 0: continue string_fecha = "" if type(fecha) is dict: string_fecha = fecha['desde'].strftime( "%d.%m.%Y") + " al " + fecha['hasta'].strftime("%d.%m.%Y") else: string_fecha = fecha.strftime("%d.%m.%Y") categorias = ["#" + c for c in categorias] secciones = "" if len(categorias) > 0: secciones = " de " + " y ".join( [", ".join(categorias[:-1]), categorias[-1]] if len(categorias) > 2 else categorias) texto = "Tendencias en " + contenido + secciones + " de " + hashtag + " del " + string_fecha + "\n" top_todo = nlp.top(textos, n=top_max) i = 0 for nombre, m in top_todo: linea = "" i += 1 if i >= 10: linea = str(i) + ". #" + nombre + " " + str(m) + "\n" texto += linea break else: linea = str(i) + ". #" + nombre + " " + str(m) + "\n" if twittear and len(texto) + len(linea) > 220: break else: texto += linea print(texto) if twittear: path_imagen = tag + ".png" utiles.nube_de_palabras(path=path_imagen, data=dict(top_todo)) utiles.twittear(texto=texto, path_imagen=path_imagen, cuenta="dlm")
def top_verbos(parametros): fecha = parametros['fecha'] top_max = parametros['top_max'] medios = set(parametros['medios']) categorias = parametros['categorias'] twittear = parametros['twittear'] solo_titulos = parametros['solo_titulos'] kiosco = Kiosco() with open('medios/diarios/config.yaml', 'r') as stream: try: config = yaml.safe_load(stream) except yaml.YAMLError as exc: print(exc) nlp = NLP() for diario in config['diarios']: tag = diario['tag'] if tag not in medios and len(medios) > 0: continue twitter = diario['twitter'] textos = [] contenido = "las noticias" if solo_titulos: textos = [ noticia['titulo'] for noticia in kiosco.noticias( diario=tag, categorias=categorias, fecha=fecha) ] contenido = "los títulos" else: textos = [ noticia['titulo'] + " " + noticia['titulo'] + " " + noticia['texto'] for noticia in kiosco.noticias( diario=tag, categorias=categorias, fecha=fecha) ] print("tag: " + tag + " textos: " + str(len(textos))) if len(textos) == 0: continue string_fecha = "" if type(fecha) is dict: string_fecha = fecha['desde'].strftime( "%d.%m.%Y") + " al " + fecha['hasta'].strftime("%d.%m.%Y") else: string_fecha = fecha.strftime("%d.%m.%Y") texto = "Tendencias en " + contenido + " de " + twitter + " del " + string_fecha + "\n" top_100 = nlp.top_verbos(textos, n=top_max) i = 0 for nombre, m in top_100: linea = "" i += 1 if i >= 10: linea = str(i) + ". #" + nombre + " " + str(m) + "\n" texto += linea break else: linea = str(i) + ". #" + nombre + " " + str(m) + "\n" if twittear and len(texto) + len(linea) > 220: break else: texto += linea print(texto)
def test_iniciar_fecha(self): fecha = Kiosco("20190621") fecha.diarios