paint-brush
Conozca el bot que lee todos los titulares de malas noticias para que usted no tenga que hacerlopor@raymondcamden
468 lecturas
468 lecturas

Conozca el bot que lee todos los titulares de malas noticias para que usted no tenga que hacerlo

por Raymond Camden6m2025/03/23
Read on Terminal Reader

Demasiado Largo; Para Leer

El Gráfico de conocimiento de Diffbot tiene un propósito simple: poner la suma total de todo el conocimiento a su alcance a través de una búsqueda que enfatiza los datos y las relaciones.
featured image - Conozca el bot que lee todos los titulares de malas noticias para que usted no tenga que hacerlo
Raymond Camden HackerNoon profile picture

El Gráfico de Conocimiento de Diffbot tiene un propósito simple: poner al alcance de tu mano la suma total de todo el conocimiento mediante una búsqueda que prioriza los datos y las relaciones sobre una simple experiencia de búsqueda basada en texto. Con acceso a toda la web, el Gráfico de Conocimiento te permite realizar consultas complejas sobre miles de millones de puntos de datos al instante mediante una API sencilla. Decidí probar su API y crear una herramienta relativamente sencilla: análisis de noticias para un producto ejecutado en una plataforma automatizada. Debería ser fácil, ¿verdad? ¡Vamos a ello! Ten en cuenta que los ejemplos de esta entrada del blog asumen que has obtenido una clave gratuita de Diffbot. Asegúrate de hacerlo antes de probar los ejemplos.

Diseño de la consulta

Antes de escribir una sola línea de código, inicié sesión en Diffbot y abrí su herramienta de búsqueda visual para Knowledge Graph. Esta herramienta permite crear consultas visualmente o manualmente. En Diffbot, las consultas se conocen como sentencias "DQL" y son bastante fáciles de leer, incluso si no se conoce la sintaxis.


Captura de pantalla del generador de consultas visuales, sin opciones seleccionadas


Desde esta herramienta, comencé seleccionando un tipo de entidad. Este es el tipo de datos de alto nivel que quiero buscar y puede ser una de las numerosas opciones, desde personas hasta eventos, películas e inversiones. Seleccioné "Artículo" porque mi intención es encontrar noticias que hablen mal de mi maravilloso producto. Luego seleccioné la opción "Filtrar por". Si bien se puede filtrar por cualquier propiedad del tipo de entidad, usé tags.label porque ofrece una coincidencia más precisa que una simple búsqueda de texto. Si bien un filtro de texto funciona, usar tags.label ofrece un resultado mucho mejor, ya que garantiza que los resultados se centren en mi búsqueda, no solo en mencionarla casualmente. Para mi demo, buscaré artículos sobre "XBox".


También utilicé el valor "Ordenar por" para mostrar lo más nuevo primero y esto generó una búsqueda para ver si mis resultados tenían sentido.


Resultados de búsqueda mostrados


Aunque mis resultados iniciales no incluían ningún idioma extranjero, sabía que quería filtrar los resultados en inglés, así que agregué un filtro por idioma. Al presionar el signo + junto al filtro actual, pude agregar "idioma" y en para inglés. De nuevo, pulsé "Buscar":


Resultados de búsqueda mostrados, ahora filtrados al inglés


Bien, ahora quiero filtrar solo los resultados negativos. Las entidades de artículos del Gráfico de Conocimiento tienen una puntuación de sentimiento (puedes verla en los resultados de búsqueda) que va de -1 (el más negativo) a 1 (el más positivo). Inicialmente, simplemente seleccioné los elementos con una puntuación de sentimiento menor o igual a 0.


Resultados de búsqueda mostrados, ahora filtrados al inglés con sentimiento negativo


¡Guau! Ya casi lo consigo. Como último paso, sabía que esto se automatizaría y se filtraría por elementos recientes, así que añadí un filtro más, esta vez por date , seleccioné after y elegí una fecha de hace una semana.


Resultados de búsqueda mostrados, ahora filtrados en inglés con sentimiento negativo y con un filtro de fecha.


En este punto, la consulta se ve bien, así que copiemos el valor de consulta proporcionado por la herramienta:


 type:Article tags.label:"Xbox" language:"en" sentiment<=0 date>"2025-03-03" sortBy:date

Escribe el código

Diseñar la consulta fue lo más difícil. Para el código, consulté la documentación de búsqueda . Los ejemplos se basan en curl/HTTP, pero son bastante fáciles de migrar a Python o a cualquier otro lenguaje. Consideren este ejemplo:


 import os import requests import json import urllib.parse token = os.environ.get("db_token") query = 'type:Article tags.label:"Xbox" language:"en" sentiment<=0 date>"2025-03-03" sortBy:date' apiCall = f"https://kg.diffbot.com/kg/v3/dql?type=query&token={token}&query={urllib.parse.quote(query)}&size=25" req = requests.get(apiCall) results = json.loads(req.content) print(f"Total results, {results['hits']}") for result in results["data"]: print(result["entity"]["title"]) print(result["entity"]["date"]["str"]) print(result["entity"]["summary"]) if "author" in result["entity"]: print(result["entity"]["author"]) print(result["entity"]["siteName"]) print(result["entity"]["pageUrl"]) print(result["entity"]["sentiment"]) print("------------------------------------")


Desglosando esto: comencé con mi consulta desde la herramienta visual. Esta se codifica en URL y se envía a la API de Knowledge Graph. La única novedad real es la adición de size=25 para mantener el conjunto de resultados dentro de un límite razonable.


Llamo a la API, imprimo el total de resultados encontrados (del resultado hits ) y luego itero sobre cada uno, mostrando información diversa. Estos son algunos de los resultados:


 Total results, 68 Xbox will release its first handheld gaming console this year, report claims d2025-03-10T19:37 Windows Central expects the console to take advantage of the widgets on the Xbox Game Bar to let use... Jacob Siegal BGR https://bgr.com/entertainment/xbox-will-release-its-first-handheld-gaming-console-this-year-report-claims/ 0 ------------------------------------ Rumour: Next-Gen Xbox a 'PC in Essence' - What Would That Mean for PlayStation? d2025-03-10T19:00 Recent comments from Windows Central's executive editor Jez Corden have sparked discussion about whe... Stephen Tailby Push Square https://www.pushsquare.com/news/2025/03/rumour-next-gen-xbox-a-pc-in-essence-what-would-that-mean-for-playstation 0 ------------------------------------ Xbox handheld out this year and will go up against Nintendo Switch 2 says source d2025-03-10T18:50 New rumours about Microsoft's next gen plans suggests that there will be two Xbox handheld consoles ... GameCentral Metro http://metro.co.uk/2025/03/10/xbox-handheld-this-year-will-go-nintendo-switch-2-says-source-22703266/ 0


Esto funciona, pero ahora vamos a hacer que la fecha sea dinámica. Empecé a importar desde datetime :


 from datetime import datetime, timedelta


Luego generé una fecha formateada para la semana pasada:


 today = datetime.now() lastWeek = today + timedelta(days=-7) fLastWeek = lastWeek.strftime("%Y-%m-%d")


Y la última parte fue simplemente incluir esa fecha en mi consulta:


 query = f'type:Article tags.label:"Xbox" language:"en" sentiment<=0 date>{fLastWeek} sortBy:date'


Puedes ver el código fuente completo de la versión inicial aquí y la versión final aquí .

Construyendo la automatización

Bien, es hora de automatizar esto. Para mi automatización, usaré Pipedream , un sistema de flujo de trabajo increíblemente flexible que he usado muchas veces. Aquí está el flujo de trabajo completo con cada parte desarrollada:


Diagrama de flujo de trabajo


Comencé mi flujo de trabajo con un disparador simple basado en un horario, es decir, cuándo ejecutarlo. Esto era algo arbitrario, pero elegí una vez a la semana, los domingos a la 1 p. m.


El siguiente paso, getArticles , maneja la lógica que demostré anteriormente, pero ahora en un "controlador de Pipedream", que es la forma estándar de escribir pasos de código en el flujo de trabajo de Pipedream.


 import os import requests import json from datetime import datetime, timedelta import urllib.parse def handler(pd: "pipedream"): token = os.environ.get("db_token") today = datetime.now() lastWeek = today + timedelta(days=-7) fLastWeek = lastWeek.strftime("%Y-%m-%d") query = f'type:Article tags.label:"Xbox" language:"en" sentiment<=0 date>{fLastWeek} sortBy:date' apiCall = f"https://kg.diffbot.com/kg/v3/dql?type=query&token={token}&query={urllib.parse.quote(query)}&size=25" req = requests.get(apiCall) return json.loads(req.content)


El siguiente paso es simplemente un paso de código rápido para finalizar el flujo de trabajo si no se encuentran resultados:


 def handler(pd: "pipedream"): if len(pd.steps["getArticles"]["$return_value"]["data"]) == 0: pd.flow.exit("No results")


Ahora quiero ajustar un poco los resultados. Voy a enviarme esto por correo electrónico, así que creé un paso para formatear los resultados en una cadena de texto:


 from datetime import datetime def handler(pd: "pipedream"): email = f""" Negative Article Results: Our search found {pd.steps["getArticles"]["$return_value"]["hits"]} results. Here are the top 25: """ for result in pd.steps["getArticles"]["$return_value"]["data"]: date = datetime.fromtimestamp(result["entity"]["date"]["timestamp"] / 1000) date_f = date.strftime("%Y-%m-%d") email += f""" {result["entity"]["title"]} Sentiment: {result["entity"]["sentiment"]} Published: {date_f} Link: {result["entity"]["pageUrl"]} """ return email


De nuevo, esto es algo arbitrario en cuanto a lo que consideré importante incluir. Definitivamente podrías ser más sofisticado, e incluso hacer cosas como: "en un sentimiento muy negativo, añadir color, señales de alerta, etc."


El último paso fue simplemente enviarme los resultados por correo electrónico. Pipedream incluye un paso para "enviar un correo electrónico al propietario de la cuenta" que hace precisamente eso: enviarme un correo electrónico. Si estuviera desarrollando esto para un cliente, usaría uno de los muchos pasos integrados de Pipedream para las API de correo.


Una vez ejecutado, recibo un lindo correo electrónico con una lista de artículos y su opinión:


Ejemplo de correo electrónico


Si decides probar Pipedream, puedes encontrar mi flujo de trabajo aquí: https://github.com/cfjedimaster/General-Pipedream-AI-Stuff/tree/production/report-on-sentiment-p_gYCeNbG

¿Que sigue?

Este es solo un ejemplo del uso de la API de Knowledge Graph de Diffbot. Te recordamos que los artículos son solo uno de los muchos tipos de datos que puedes buscar. Todo lo que hice aquí se realizó con una cuenta completamente gratuita , así que puedes registrarte y probarlo tú mismo. Voy a profundizar en esto, así que no dudes en contactarme si tienes alguna pregunta.