Το Γράφημα Γνώσης του Diffbot έχει έναν απλό σκοπό - να φέρει το άθροισμα όλης της γνώσης στα χέρια σας μέσω μιας αναζήτησης που δίνει έμφαση στα δεδομένα και τις σχέσεις σε μια απλή εμπειρία μηχανής αναζήτησης που βασίζεται σε κείμενο. Προέρχεται από ολόκληρο τον ιστό, το Γράφημα Γνώσης σάς επιτρέπει να εκτελείτε σύνθετα ερωτήματα έναντι δισεκατομμυρίων σημείων δεδομένων άμεσα μέσω ενός απλού API. Αποφάσισα να κάνω μια περιστροφή με το API τους και να δημιουργήσω ένα «σχετικά» απλό εργαλείο - ανάλυση ειδήσεων για ένα προϊόν που εκτελείται σε αυτοματοποιημένη πλατφόρμα. Θα έπρεπε να είναι εύκολο, σωστά; Ας φτάσουμε σε αυτό. Σημειώστε ότι τα παραδείγματα σε αυτήν την ανάρτηση ιστολογίου υποθέτουν ότι έχετε λάβει ένα δωρεάν κλειδί από το Diffbot. Φροντίστε να το κάνετε αυτό πριν δοκιμάσετε τα δείγματα.
Σχεδιασμός του ερωτήματος
Πριν γράψω μια γραμμή κώδικα, συνδέθηκα στο Diffbot και άνοιξα το εργαλείο οπτικής αναζήτησης για το Γράφημα Γνώσης. Το εργαλείο σάς επιτρέπει να δημιουργείτε ερωτήματα οπτικά ή με το χέρι. Τα ερωτήματα είναι γνωστά ως δηλώσεις «DQL» στο Diffbot και διαβάζονται αρκετά απλά ακόμα κι αν δεν έχετε ξαναδεί τη σύνταξη.
Από αυτό το εργαλείο, ξεκίνησα επιλέγοντας έναν τύπο οντότητας. Αυτός είναι ο τύπος δεδομένων υψηλού επιπέδου που θέλω να αναζητήσω και μπορεί να είναι μία από τις πολλές πολλές επιλογές, από άτομα έως εκδηλώσεις έως ταινίες και επενδύσεις. Επέλεξα το "Άρθρο" καθώς πρόθεσή μου είναι να βρω νέα που μιλούν άσχημα για το υπέροχο προϊόν μου. Στη συνέχεια επέλεξα μια επιλογή "Φίλτρο κατά". Ενώ μπορείτε να φιλτράρετε κατά οποιαδήποτε ιδιότητα στον τύπο οντότητας, χρησιμοποίησα tags.label
καθώς είναι πιο ακριβής αντιστοίχιση από μια απλή αναζήτηση κειμένου. Ενώ ένα φίλτρο κειμένου λειτουργεί, η χρήση tags.label
δίνει πολύ καλύτερο αποτέλεσμα διασφαλίζοντας ότι τα αποτελέσματα εστιάζονται στην αναζήτησή μου, όχι απλώς αναφέροντάς το περιστασιακά. Για το demo μου, θα ψάξω για άρθρα σχετικά με το "XBox".
Χρησιμοποίησα επίσης την τιμή "Ταξινόμηση κατά" για να εμφανίσω πρώτα τα νεότερα και αυτήν την αναζήτηση για να δω αν τα αποτελέσματά μου είχαν νόημα.
Αν και τα αρχικά μου αποτελέσματα δεν περιλάμβαναν αποτελέσματα ξένων γλωσσών, ήξερα ότι θα ήθελα να φιλτράρω τα αποτελέσματα στα Αγγλικά, επομένως πρόσθεσα στη συνέχεια ένα φίλτρο για τη γλώσσα. Πατώντας το σύμβολο + από το τρέχον φίλτρο, μπόρεσα να προσθέσω γλώσσα και en
για τα αγγλικά. Για άλλη μια φορά πάτησα αναζήτηση:
Εντάξει, στη συνέχεια, θέλω να φιλτράρω μόνο σε αρνητικά αποτελέσματα. Οι οντότητες άρθρων Γράφημα γνώσης έχουν βαθμολογία συναισθήματος (μπορείτε να τα δείτε στα αποτελέσματα αναζήτησης) που κυμαίνεται από -1 στο πιο αρνητικό έως το 1 στο πιο θετικό. Αρχικά, επέλεξα απλώς στοιχεία με συναίσθημα μικρότερο ή ίσο με 0.
Woot, φτάνω εκεί. Ως τελευταίο βήμα, ήξερα ότι αυτό επρόκειτο να αυτοματοποιηθεί και να φιλτραριστεί στα "πρόσφατα" στοιχεία, γι' αυτό πρόσθεσα ένα ακόμη φίλτρο, αυτή τη φορά την date
, επέλεξα after
και διάλεξα μια ημερομηνία πριν από μια εβδομάδα.
Σε αυτό το σημείο, το ερώτημα φαίνεται καλό, οπότε ας αντιγράψουμε την τιμή του ερωτήματος που παρέχεται από το εργαλείο:
type:Article tags.label:"Xbox" language:"en" sentiment<=0 date>"2025-03-03" sortBy:date
Γράψτε τον Κώδικα
Ο σχεδιασμός του ερωτήματος ήταν πραγματικά το δύσκολο μέρος. Για τον κωδικό, πήγα στα Έγγραφα Αναζήτησης . Τα παραδείγματα βασίζονται σε curl/HTTP, αλλά είναι αρκετά εύκολο να μεταφερθούν σε Python ή σε οποιαδήποτε άλλη γλώσσα. Σκεφτείτε αυτό το δείγμα:
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("------------------------------------")
Αναλύοντας αυτό - ξεκίνησα με το ερώτημά μου από το οπτικό εργαλείο. Στη συνέχεια, κωδικοποιείται το url και περνά στο API για Γράφημα Γνώσης. Το μόνο πραγματικό νέο στοιχείο εκεί είναι η προσθήκη size=25
για να διατηρείται το αποτέλεσμα σε ένα λογικό όριο.
Καλώ το API, εκτυπώνω τα συνολικά αποτελέσματα που βρέθηκαν (από το αποτέλεσμα hits
) και μετά επαναλαμβάνω πάνω από το καθένα εμφανίζοντας διάφορες πληροφορίες από το αποτέλεσμα. Εδώ είναι μερικά από τα αποτελέσματα:
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
Αυτό λειτουργεί, αλλά τώρα ας κάνουμε την ημερομηνία δυναμική. Άρχισα να εισάγω από datetime
:
from datetime import datetime, timedelta
Στη συνέχεια δημιούργησα μια μορφοποιημένη ημερομηνία για την προηγούμενη εβδομάδα:
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'
Μπορείτε να δείτε τον πλήρη πηγαίο κώδικα για την αρχική έκδοση εδώ και την τελική έκδοση εδώ .
Κατασκευή του Αυτοματισμού
Εντάξει, ήρθε η ώρα να αυτοματοποιηθεί. Για την αυτοματοποίησή μου, θα χρησιμοποιήσω το Pipedream , ένα απίστευτα ευέλικτο σύστημα ροής εργασιών που έχω χρησιμοποιήσει πολλές φορές στο παρελθόν. Ακολουθεί ολόκληρη η ροή εργασίας με κάθε εξάρτημα κατασκευασμένο:
Ξεκίνησα τη ροή εργασίας μου με ένα απλό έναυσμα βασισμένο στο χρονοδιάγραμμα, π.χ. πότε να εκτελεστεί. Αυτό ήταν κάπως αυθαίρετο, αλλά διάλεγα κάθε εβδομάδα, την Κυριακή, στη 13:00.
Το επόμενο βήμα, getArticles
, χειρίζεται τη λογική που έδειξα νωρίτερα, αλλά τώρα σε έναν "χειριστή Pipedream", ο οποίος είναι ο τυπικός τρόπος εγγραφής βημάτων κώδικα στη ροή εργασίας του 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)
Το επόμενο βήμα είναι απλώς ένα γρήγορο βήμα κώδικα για να τερματίσετε τη ροή εργασίας εάν δεν βρεθούν αποτελέσματα:
def handler(pd: "pipedream"): if len(pd.steps["getArticles"]["$return_value"]["data"]) == 0: pd.flow.exit("No results")
Τώρα θέλω να κάνω «μασάζ» λίγο στα αποτελέσματα. Τελικά πρόκειται να το στείλω μέσω email στον εαυτό μου, γι' αυτό έφτιαξα ένα βήμα για να μορφοποιήσω τα αποτελέσματα σε μια ωραία συμβολοσειρά:
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
Και πάλι, αυτό είναι κάπως αυθαίρετο όσον αφορά αυτό που θεωρούσα αρκετά σημαντικό για να συμπεριλάβω. Θα μπορούσατε σίγουρα να γίνετε πιο φανταχτεροί, ακόμα και να κάνετε πράγματα όπως, "με ένα πολύ κακό συναίσθημα, να προσθέσετε χρώμα, κόκκινες σημαίες κ.λπ.".
Το τελευταίο βήμα ήταν να στείλω απλά email στον εαυτό μου τα αποτελέσματα. Το Pipedream υποστηρίζει ένα βήμα "στείλτε ένα email στον κάτοχο του λογαριασμού" που θα κάνει ακριβώς αυτό, στείλτε μου email. Αν το έφτιαχνα αυτό για έναν πελάτη, θα χρησιμοποιούσα ένα από τα πολλά ενσωματωμένα βήματα του Pipedream για API αλληλογραφίας.
Μόλις εκτελεστεί, λαμβάνω ένα ωραίο email με μια λίστα άρθρων και το συναίσθημά τους:
Εάν επιλέξετε να κάνετε μια περιστροφή στο Pipedream, μπορείτε να βρείτε τη ροή εργασιών μου εδώ: https://github.com/cfjedimaster/General-Pipedream-AI-Stuff/tree/production/report-on-sentiment-p_gYCeNbG
Τι ακολουθεί;
Αυτό είναι μόνο ένα παράδειγμα χρήσης του API Γράφημα Γνώσης του Diffbot, και υπενθυμίζουμε ότι τα άρθρα είναι μόνο ένας από τους πολλούς διαφορετικούς τύπους δεδομένων που μπορείτε να αναζητήσετε. Ό,τι έκανα εδώ έγινε επίσης σε έναν εντελώς δωρεάν λογαριασμό , οπότε μπορείτε να εγγραφείτε οπωσδήποτε και να το δοκιμάσετε μόνοι σας. Θα το ψάξω περισσότερο, οπότε ενημερώστε με αν έχετε απορίες!