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.
À 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.
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 » :
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.
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.
À 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 :
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 :
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 !