526 lecturi
526 lecturi

Faceți cunoștință cu botul care citește toate titlurile știrilor proaste, astfel încât să nu aveți nevoie

de Raymond Camden6m2025/03/23
Read on Terminal Reader

Prea lung; A citi

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 accent pe date și relații.
featured image - Faceți cunoștință cu botul care citește toate titlurile știrilor proaste, astfel încât să nu aveți nevoie
Raymond Camden HackerNoon profile picture

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.


Captură de ecran a generatorului de interogări vizuale, fără opțiuni selectate


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.


Rezultatele căutării sunt afișate


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:


Rezultatele căutării sunt afișate, acum filtrate în engleză


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.


Rezultatele căutării sunt afișate, acum filtrate în engleză, cu un sentiment negativ


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ă.


Rezultatele căutării sunt afișate, acum filtrate în engleză cu sentiment negativ și cu un filtru de dată


Î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ă:


Diagrama fluxului de lucru


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:


Exemplu de e-mail


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!

Trending Topics

blockchaincryptocurrencyhackernoon-top-storyprogrammingsoftware-developmenttechnologystartuphackernoon-booksBitcoinbooks