Graficul de cunoștințe al lui Diffbot are un scop simplu - aduceți suma totală a tuturor cunoștințelor la îndemâna dvs. printr-o căutare care pune accentul pe date și relații peste o experiență simplă de motor de căutare bazată pe text. Provenit de întregul web, Knowledge Graph vă permite să efectuați interogări complexe față de miliarde de puncte de date instantaneu printr-un API simplu. Am decis să fac o învârtire cu API-ul lor și să construiesc un instrument „relativ” simplu - analiza știrilor pentru un produs rulat pe o platformă automată. Ar trebui să fie ușor, nu? Să ajungem la asta. Rețineți că exemplele din această postare de blog presupun că ați primit o cheie gratuită de la Diffbot. Asigurați-vă că faceți asta înainte de a încerca mostrele.
Proiectarea interogării
Înainte de a scrie o linie de cod, m-am conectat la Diffbot și am deschis instrumentul lor de căutare vizuală pentru Knowledge Graph. Instrumentul vă permite să creați interogări vizual sau manual. Interogările sunt cunoscute ca instrucțiuni „DQL” în Diffbot și sunt destul de simplu de citit, chiar dacă nu ați văzut niciodată sintaxa.
Din acest instrument, am început prin a selecta un tip de entitate. Acesta este tipul de date de nivel înalt pe care vreau să-l caut și poate fi una dintre numeroasele opțiuni, de la oameni la evenimente la filme și investiții. Am selectat „Articol” deoarece intenția mea este să găsesc știri care vorbesc de rău despre minunatul meu produs. Apoi am selectat opțiunea „Filtrare după”. Deși puteți filtra după orice proprietate din tipul de entitate, am folosit tags.label
deoarece este o potrivire mai precisă decât o simplă căutare text. În timp ce un filtru de text funcționează, utilizarea tags.label
oferă un rezultat mult mai bun, asigurându-se că rezultatele sunt concentrate pe căutarea mea, nu doar menționând-o întâmplător. Pentru demonstrația mea, voi căuta articole despre „XBox”.
Am folosit, de asemenea, valoarea „Sortare după” pentru a afișa mai întâi cele mai noi, iar această căutare prin accesare pentru a vedea dacă rezultatele mele au sens.
Deși rezultatele mele inițiale nu includeau rezultate în limbi străine, știam că aș dori să filtrez după rezultate în engleză, așa că am adăugat apoi un filtru pentru limbă. Atingând semnul + de filtrul curent, am putut apoi să adaug limba și en
pentru engleză. Din nou, am apăsat pe căutare:
Bine, așa că în continuare, vreau să filtrez doar pentru rezultate negative. Entitățile articol din Knowledge Graph au un scor de sentiment (le puteți vedea în rezultatele căutării) care merge de la -1 la cel mai negativ la 1 la cel mai pozitiv. Inițial, am selectat pur și simplu articole cu un sentiment mai mic sau egal cu 0.
Woot, ajung acolo. Ca pas final, știam că acest lucru va fi automatizat și filtrat la articole „recente”, așa că am adăugat încă un filtru, de data aceasta pe date
, selectat after
, și am ales o dată de acum o săptămână.
În acest moment, interogarea arată bine, așa că haideți să copiem valoarea interogării furnizată de instrument:
type:Article tags.label:"Xbox" language:"en" sentiment<=0 date>"2025-03-03" sortBy:date
Scrieți Codul
Proiectarea interogării a fost într-adevăr partea grea. Pentru cod, m-am dus la Căutare documente. Exemplele sunt bazate pe curl/HTTP, dar destul de ușor de portat către Python sau orice altă limbă. Luați în considerare acest exemplu:
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("------------------------------------")
Defalcând acest lucru - am început cu interogarea mea din instrumentul vizual. Aceasta este apoi codificată URL și transmisă API-ului pentru Knowledge Graph. Singurul element nou real este adăugarea size=25
pentru a menține rezultatul setat la o limită sensibilă.
Apel API-ul, imprimez rezultatele totale găsite (din rezultatul hits
) și apoi repetă peste fiecare afișând diferite informații din rezultat. Iată câteva dintre rezultate:
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
Funcționează, dar acum hai să facem data dinamică. Am început să import de la datetime
:
from datetime import datetime, timedelta
Am generat apoi o dată formatată pentru săptămâna trecută:
today = datetime.now() lastWeek = today + timedelta(days=-7) fLastWeek = lastWeek.strftime("%Y-%m-%d")
Și ultimul a fost să includ doar acea dată în interogarea mea:
query = f'type:Article tags.label:"Xbox" language:"en" sentiment<=0 date>{fLastWeek} sortBy:date'
Puteți vedea codul sursă complet pentru versiunea inițială aici și versiunea finală aici .
Construirea automatizării
Bine, este timpul să automatizăm asta. Pentru automatizarea mea, voi folosi Pipedream , un sistem de flux de lucru incredibil de flexibil pe care l-am folosit de multe ori în trecut. Iată întregul flux de lucru cu fiecare parte construită:
Mi-am început fluxul de lucru cu un declanșator simplu bazat pe program, adică când să rulez. Acest lucru a fost oarecum arbitrar, dar am ales săptămânal, duminică, la ora 13.00.
Următorul pas, getArticles
, se ocupă de logica pe care am demonstrat-o mai devreme, dar acum într-un „handler Pipedream”, care este modalitatea standard de a scrie pașii de cod în fluxul de lucru 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)
Următorul pas este pur și simplu un pas rapid de cod pentru a încheia fluxul de lucru dacă nu se găsesc rezultate:
def handler(pd: "pipedream"): if len(pd.steps["getArticles"]["$return_value"]["data"]) == 0: pd.flow.exit("No results")
Acum vreau să „masez” puțin rezultatele. În cele din urmă, îmi voi trimite prin e-mail acest lucru, așa că am construit un pas pentru a formata rezultatele într-un șir frumos:
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
Din nou, acest lucru este oarecum arbitrar în ceea ce privește ceea ce am considerat suficient de important pentru a include. Cu siguranță ai putea să devii mai chic și chiar să faci lucruri precum „pe un sentiment foarte prost, adaugă culoare, steaguri roșii etc”.
Pasul final a fost să-mi trimit rezultatele prin e-mail. Pipedream acceptă un pas „trimiteți un e-mail proprietarului contului” care va face exact asta, trimiteți-mi un e-mail. Dacă aș construi acest lucru pentru un client, aș folosi unul dintre mulți pași încorporați ai Pipedream pentru API-urile de e-mail.
Odată rulat, primesc un e-mail frumos cu o listă de articole și sentimentul lor:
Dacă alegeți să dați o învârtire lui Pipedream, puteți găsi fluxul meu de lucru aici: https://github.com/cfjedimaster/General-Pipedream-AI-Stuff/tree/production/report-on-sentiment-p_gYCeNbG
Ce urmează?
Acesta este doar un exemplu de utilizare a API-ului Knowledge Graph de la Diffbot și, ca reamintire, articolele sunt doar unul dintre numeroasele tipuri diferite de date pe care le puteți căuta. Tot ceea ce am făcut aici s-a făcut și pe un cont complet gratuit , așa că vă puteți înregistra absolut și să îl încercați singur. Mă voi ocupa mai mult de asta, așa că anunțați-mă dacă aveți întrebări!