526 letture
526 letture

Incontra il bot che legge tutti i titoli delle brutte notizie così non devi farlo tu

di Raymond Camden6m2025/03/23
Read on Terminal Reader

Troppo lungo; Leggere

Il Knowledge Graph di Diffbot ha uno scopo semplice: rendere accessibile a tutti la somma totale delle conoscenze tramite una ricerca che pone l'accento su dati e relazioni.
featured image - Incontra il bot che legge tutti i titoli delle brutte notizie così non devi farlo tu
Raymond Camden HackerNoon profile picture

Il Knowledge Graph di Diffbot ha uno scopo semplice: portare la somma totale di tutte le conoscenze a portata di mano tramite una ricerca che enfatizza dati e relazioni rispetto a una semplice esperienza di motore di ricerca basata su testo. Reperito dall'intero Web, Knowledge Graph consente di eseguire query complesse su miliardi di punti dati all'istante tramite una semplice API. Ho deciso di fare un giro con la loro API e creare uno strumento "relativamente" semplice: analisi delle notizie per un prodotto eseguito su una piattaforma automatizzata. Dovrebbe essere facile, vero? Cominciamo. Nota che gli esempi in questo post del blog presuppongono che tu abbia ricevuto una chiave gratuita da Diffbot. Assicurati di farlo prima di provare gli esempi.

Progettazione della query

Prima di scrivere una riga di codice, ho effettuato l'accesso a Diffbot e ho aperto il loro strumento di ricerca visuale per Knowledge Graph. Lo strumento consente di creare query visivamente o manualmente. Le query sono note come istruzioni "DQL" in Diffbot e sono piuttosto semplici da leggere anche se non hai mai visto la sintassi prima.


Schermata del generatore di query visuale, nessuna opzione selezionata


Da questo strumento, ho iniziato selezionando un tipo di entità. Questo è il tipo di dati di alto livello che voglio cercare e può essere una delle numerose opzioni, da persone a eventi a film e investimenti. Ho selezionato "Articolo" perché il mio intento è trovare notizie che parlano male del mio meraviglioso prodotto. Ho quindi selezionato un'opzione "Filtra per". Mentre puoi filtrare per qualsiasi proprietà nel tipo di entità, ho usato tags.label perché è una corrispondenza più precisa di una semplice ricerca di testo. Mentre un filtro di testo funziona, usare tags.label dà un risultato molto migliore assicurando che i risultati siano focalizzati sulla mia ricerca, non solo menzionandola casualmente. Per la mia demo, cercherò articoli su "XBox".


Ho anche utilizzato il valore "Ordina per" per mostrare prima i più recenti e ho fatto clic su Cerca per vedere se i miei risultati avevano senso.


Risultati della ricerca mostrati


Sebbene i miei risultati iniziali non includessero risultati in lingua straniera, sapevo che avrei voluto filtrare i risultati in inglese, quindi ho aggiunto un filtro per lingua. Facendo clic sul segno + accanto al filtro corrente, sono stato in grado di aggiungere lingua e en per inglese. Ancora una volta, ho premuto cerca:


Risultati della ricerca mostrati, ora filtrati in inglese


Bene, quindi ora voglio filtrare solo i risultati negativi. Le entità Knowledge Graph Article hanno un punteggio di sentiment (lo puoi vedere nei risultati di ricerca) che va da -1 al più negativo a 1 al più positivo. Inizialmente, ho semplicemente selezionato gli elementi con un sentiment inferiore o uguale a 0.


Risultati della ricerca mostrati, ora filtrati in inglese con sentimento negativo


Evviva, ci siamo. Come ultimo passaggio, sapevo che questo sarebbe stato automatizzato e filtrato in base agli elementi "recenti", quindi ho aggiunto un altro filtro, questa volta su date , selezionato after , e ho scelto una data di una settimana fa.


Risultati della ricerca mostrati, ora filtrati in inglese con sentimento negativo e con un filtro data


A questo punto la query sembra corretta, quindi copiamo il valore della query fornito dallo strumento:


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

Scrivi il codice

Progettare la query è stata davvero la parte difficile. Per il codice, sono andato alla documentazione di Search . Gli esempi sono basati su curl/HTTP ma sono piuttosto facili da trasferire in Python o in qualsiasi altro linguaggio. Considerate questo esempio:


 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("------------------------------------")


Analizzando questo - Ho iniziato con la mia query dallo strumento visivo. Questo viene quindi codificato in url e passato all'API per Knowledge Graph. L'unica vera novità è l'aggiunta di size=25 per mantenere il set di risultati a un limite ragionevole.


Chiamo l'API, stampo i risultati totali trovati (dal risultato hits ) e poi eseguo un'iterazione su ognuno mostrando vari bit di informazioni dal risultato. Ecco alcuni dei risultati:


 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


Funziona, ma ora rendiamo dinamica la data. Ho iniziato a importare da datetime :


 from datetime import datetime, timedelta


Ho quindi generato una data formattata per la settimana scorsa:


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


E l'ultima parte era semplicemente quella di includere quella data nella mia query:


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


Potete vedere il codice sorgente completo della versione iniziale qui e della versione finale qui .

Costruire l'automazione

Bene, è il momento di automatizzare tutto questo. Per la mia automazione, utilizzerò Pipedream , un sistema di flusso di lavoro incredibilmente flessibile che ho usato molte volte in passato. Ecco l'intero flusso di lavoro con ogni parte realizzata:


Diagramma del flusso di lavoro


Ho iniziato il mio flusso di lavoro con un semplice trigger basato sulla pianificazione, ovvero quando eseguire. Era un po' arbitrario, ma ho scelto settimanalmente, la domenica, alle 13:00.


Il passaggio successivo, getArticles , gestisce la logica illustrata in precedenza, ma questa volta in un "gestore Pipedream", che è il modo standard per scrivere passaggi di codice nel flusso di lavoro 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)


Il passaggio successivo è semplicemente un rapido passaggio di codice per terminare il flusso di lavoro se non vengono trovati risultati:


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


Ora voglio "massaggiare" un po' i risultati. Alla fine me li invierò per email, quindi ho creato un passaggio per formattare i risultati in una bella stringa:


 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


Di nuovo, questo è un po' arbitrario in termini di ciò che ho ritenuto abbastanza importante da includere. Potresti sicuramente diventare più elaborato e persino fare cose come "su un sentimento davvero negativo, aggiungi colore, bandiere rosse, ecc".


L'ultimo passaggio è stato semplicemente inviare a me stesso i risultati via email. Pipedream supporta un passaggio "invia un'email al proprietario dell'account" che farà proprio questo, inviami un'email. Se dovessi svilupparlo per un cliente, userei uno dei tanti passaggi integrati di Pipedream per le API di posta.


Una volta eseguito, ricevo una bella e-mail con un elenco di articoli e il loro sentimento:


Esempio di email


Se decidi di provare Pipedream, puoi trovare il mio flusso di lavoro qui: https://github.com/cfjedimaster/General-Pipedream-AI-Stuff/tree/production/report-on-sentiment-p_gYCeNbG

Cosa succederà ora?

Questo è solo un esempio di utilizzo della Knowledge Graph API di Diffbot e, come promemoria, gli articoli sono solo uno dei tanti tipi diversi di dati che puoi cercare. Tutto ciò che ho fatto qui è stato fatto anche su un account completamente gratuito , quindi puoi assolutamente registrarti e provarlo tu stesso. Approfondirò ulteriormente la questione, quindi fammi sapere se hai domande!

Trending Topics

blockchaincryptocurrencyhackernoon-top-storyprogrammingsoftware-developmenttechnologystartuphackernoon-booksBitcoinbooks