526 lectures
526 lectures

Découvrez le robot qui lit tous les gros titres des mauvaises nouvelles pour que vous n'ayez pas à le faire

par Raymond Camden6m2025/03/23
Read on Terminal Reader

Trop long; Pour lire

Le Knowledge Graph de Diffbot a un objectif simple : mettre la somme totale de toutes les connaissances à portée de main via une recherche qui met l'accent sur les données et les relations.
featured image - Découvrez le robot qui lit tous les gros titres des mauvaises nouvelles pour que vous n'ayez pas à le faire
Raymond Camden HackerNoon profile picture

Le Knowledge Graph de Diffbot a un objectif simple : mettre à votre disposition l'ensemble des connaissances grâce à une recherche privilégiant les données et les relations plutôt qu'une simple expérience de recherche textuelle. Provenant de l'ensemble du web, le Knowledge Graph vous permet d'effectuer instantanément des requêtes complexes sur des milliards de points de données via une API simple. J'ai décidé d'essayer leur API et de créer un outil relativement simple : l'analyse de l'actualité d'un produit sur une plateforme automatisée. Ça devrait être facile, non ? Allons-y. Notez que les exemples de cet article supposent que vous avez obtenu une clé gratuite de Diffbot. Assurez-vous de l'obtenir avant de tester les échantillons.

Conception de la requête

Avant d'écrire une ligne de code, je me suis connecté à Diffbot et j'ai ouvert leur outil de recherche visuelle pour Knowledge Graph. Cet outil permet de créer des requêtes visuellement ou manuellement. Dans Diffbot, les requêtes sont appelées instructions « DQL » et sont assez simples à lire, même si vous n'avez jamais vu la syntaxe auparavant.


Capture d'écran du générateur de requêtes visuelles, aucune option sélectionnée


À partir de cet outil, j'ai commencé par sélectionner un type d'entité. Il s'agit du type de données générales que je souhaite rechercher et il peut s'agir d'une option parmi de nombreuses autres, allant des personnes aux événements, en passant par les films et les investissements. J'ai sélectionné « Article » pour trouver des actualités dénigrant mon excellent produit. J'ai ensuite sélectionné l'option « Filtrer par ». Bien qu'il soit possible de filtrer par n'importe quelle propriété du type d'entité, j'ai utilisé tags.label , car il offre une correspondance plus précise qu'une simple recherche textuelle. Bien qu'un filtre textuel fonctionne, l'utilisation tags.label donne un bien meilleur résultat en garantissant que les résultats se concentrent sur ma recherche, et non sur une simple mention. Pour ma démonstration, je vais rechercher des articles sur la « XBox ».


J'ai également utilisé la valeur « Trier par » pour afficher le plus récent en premier et cette recherche de résultats pour voir si mes résultats avaient du sens.


Résultats de la recherche affichés


Bien que mes premiers résultats ne comprenaient aucun résultat en langue étrangère, je savais que je voulais filtrer les résultats en anglais. J'ai donc ajouté un filtre pour la langue. En cliquant sur le signe + à côté du filtre actuel, j'ai pu ajouter la langue et en pour l'anglais. J'ai ensuite cliqué sur « Rechercher » :


Résultats de recherche affichés, désormais filtrés en anglais


Bon, maintenant, je souhaite filtrer uniquement les résultats négatifs. Les entités d'article du Knowledge Graph ont un score de sentiment (visible dans les résultats de recherche) qui va de -1 (le plus négatif) à 1 (le plus positif). Initialement, j'ai simplement sélectionné les éléments dont le sentiment était inférieur ou égal à 0.


Résultats de recherche affichés, désormais filtrés en anglais avec un sentiment négatif


Ouah, j'y arrive. Pour finir, je savais que ce serait automatisé et filtré sur les éléments « récents », j'ai donc ajouté un filtre supplémentaire, cette fois sur date , sélectionné after , et choisi une date d'il y a une semaine.


Résultats de recherche affichés, désormais filtrés en anglais avec un sentiment négatif et avec un filtre de date


À ce stade, la requête semble correcte, copions donc la valeur de requête fournie par l'outil :


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

Écrire le code

La conception de la requête a été la partie la plus difficile. Pour le code, j'ai consulté la documentation de Search . Les exemples sont basés sur curl/HTTP, mais sont assez faciles à porter vers Python ou tout autre langage. Prenons l'exemple suivant :


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


Pour résumer, j'ai commencé par ma requête depuis l'outil visuel. Celle-ci est ensuite encodée en URL et transmise à l'API du Knowledge Graph. La seule nouveauté réside dans l'ajout de size=25 pour limiter le nombre de résultats à une limite raisonnable.


J'appelle l'API, j'affiche le total des résultats trouvés (à partir des résultats hits ), puis j'itère sur chaque résultat pour afficher différentes informations. Voici quelques résultats :


 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


Cela fonctionne, mais rendons maintenant la date dynamique. J'ai commencé l'importation depuis datetime :


 from datetime import datetime, timedelta


J'ai ensuite généré une date formatée pour la semaine dernière :


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


Et la dernière étape consistait simplement à inclure cette date dans ma requête :


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


Vous pouvez voir le code source complet de la version initiale ici et de la version finale ici .

Construire l'automatisation

Bon, il est temps d'automatiser tout ça. Pour mon automatisation, j'utiliserai Pipedream , un système de workflow incroyablement flexible que j'ai déjà utilisé à maintes reprises. Voici le workflow complet, chaque partie étant développée :


Diagramme de flux de travail


J'ai commencé mon workflow avec un simple déclencheur basé sur un planning, c'est-à-dire un moment d'exécution. C'était quelque peu arbitraire, mais j'ai choisi une exécution hebdomadaire, le dimanche à 13 h.


L'étape suivante, getArticles , gère la logique que j'ai démontrée plus tôt, mais maintenant dans un « gestionnaire Pipedream », qui est la manière standard d'écrire des étapes de code dans le flux de travail 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)


L'étape suivante est simplement une étape de code rapide pour terminer le flux de travail si aucun résultat n'est trouvé :


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


Je souhaite maintenant peaufiner les résultats. Je vais éventuellement m'envoyer ceci par e-mail ; j'ai donc créé une étape pour formater les résultats dans une chaîne de caractères claire :


 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


Encore une fois, c'est un peu arbitraire par rapport à ce que je jugeais important d'inclure. On pourrait certainement aller plus loin, et même faire des choses comme « sur un sentiment vraiment négatif, ajouter de la couleur, des drapeaux rouges, etc. ».


La dernière étape consistait simplement à m'envoyer les résultats par e-mail. Pipedream propose une étape « envoyer un e-mail au propriétaire du compte » qui permet précisément de m'envoyer un e-mail. Si je devais développer ce projet pour un client, j'utiliserais l'une des nombreuses étapes intégrées de Pipedream pour les API de messagerie.


Une fois exécuté, je reçois un joli email avec une liste d'articles et leur sentiment :


Exemple d'e-mail


Si vous choisissez d'essayer Pipedream, vous pouvez trouver mon flux de travail ici : https://github.com/cfjedimaster/General-Pipedream-AI-Stuff/tree/production/report-on-sentiment-p_gYCeNbG

Quelle est la prochaine étape ?

Ceci n'est qu'un exemple d'utilisation de l'API Knowledge Graph de Diffbot. Pour rappel, les articles ne sont qu'un des nombreux types de données que vous pouvez rechercher. Tout ce que j'ai fait ici a été réalisé avec un compte entièrement gratuit ; vous pouvez donc vous inscrire et l'essayer vous-même. Je vais approfondir le sujet, alors n'hésitez pas à me contacter si vous avez des questions !

Trending Topics

blockchaincryptocurrencyhackernoon-top-storyprogrammingsoftware-developmenttechnologystartuphackernoon-booksBitcoinbooks