示例#1
0
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")
示例#2
0
    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)))
示例#3
0
    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)))
示例#4
0
    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))
示例#5
0
    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]
示例#6
0
    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)))
示例#7
0
    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)))
示例#8
0
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")
示例#9
0
    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)
示例#10
0
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
示例#11
0
 def test_iniciar_fecha(self):
     fecha = Kiosco("20190621")
     fecha.diarios
示例#12
0
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")
示例#13
0
def leer_historico(parametros):
    cr = CasaRosada()
    # cr.leer_todo()
    cr.leer_historico()
    kiosco = Kiosco()
    kiosco.actualizar_diario(cr)
示例#14
0
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")
示例#15
0
def leer_medio(medio):
    medio.leer()

    kiosco = Kiosco()
    kiosco.actualizar_diario(medio)
示例#16
0
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)
示例#17
0
 def test_sumar_noticias_a_fecha(self):
     fecha = Kiosco("20190621")
     fecha.agregar("infobae", "internacional", )
from bd.entidades import Kiosco

# solo reinicio el idx = 1
k = Kiosco()
k.bd.temp.replace_one({'clave': 'indice-twittero'}, {
    'clave': 'indice-twittero',
    'idx': 0
},
                      upsert=True)