לגרף הידע של Diffbot יש מטרה פשוטה - להביא את הסכום הכולל של כל הידע לקצות אצבעותיך באמצעות חיפוש המדגיש נתונים ויחסים על פני חוויית מנוע חיפוש מבוססת טקסט פשוטה. מקורו של כל האינטרנט, Knowledge Graph מאפשר לך לבצע שאילתות מורכבות מול מיליארדי נקודות נתונים באופן מיידי באמצעות API פשוט. החלטתי לעשות סיבוב עם ה-API שלהם ולבנות כלי פשוט "יחסית" - ניתוח חדשות למוצר המופעל בפלטפורמה אוטומטית. צריך להיות קל, נכון? בואו נגיע לזה. שים לב שהדוגמאות בפוסט זה בבלוג מניחות שקיבלת מפתח בחינם מ-Diffbot. הקפד לעשות זאת לפני שתנסה את הדוגמאות.
לפני כתיבת שורת קוד, נכנסתי ל-Diffbot ופתחתי את כלי החיפוש החזותי שלהם עבור Knowledge Graph. הכלי מאפשר לך לבנות שאילתות באופן ויזואלי או ביד. שאילתות ידועות בתור הצהרות 'DQL' ב-Diffbot והן די פשוטות לקריאה גם אם מעולם לא ראית את התחביר לפני כן.
מכלי זה התחלתי בבחירת סוג ישות. זהו סוג הנתונים ברמה הגבוהה שאני רוצה לחפש ויכול להיות אחת מהרבה אפשרויות, מאנשים לאירועים ועד סרטים והשקעות. בחרתי ב"מאמר" כי הכוונה שלי היא למצוא חדשות שמדברות רע על המוצר הנפלא שלי. לאחר מכן בחרתי באפשרות "סנן לפי". בעוד שאתה יכול לסנן לפי כל מאפיין בסוג הישות, השתמשתי tags.label
מכיוון שזו התאמה מדויקת יותר מחיפוש טקסט פשוט. בעוד מסנן טקסט אכן עובד, השימוש ב- tags.label
נותן תוצאה הרבה יותר טובה בכך שהוא מבטיח שהתוצאות מתמקדות בחיפוש שלי, ולא רק אזכור אותו כלאחר יד. להדגמה שלי, אני אחפש מאמרים על "XBox".
השתמשתי גם בערך "מיין לפי" כדי להציג תחילה את החדש ביותר, ובחיפוש הלהיט הזה כדי לראות אם התוצאות שלי הגיוניות.
למרות שהתוצאות הראשוניות שלי לא כללו תוצאות בשפה זרה, ידעתי שארצה לסנן לתוצאות באנגלית, אז הוספתי מסנן לשפה. לחיצה על הסימן + על ידי המסנן הנוכחי, הצלחתי להוסיף שפה ו- en
עבור אנגלית. שוב, לחצתי על החיפוש:
בסדר, אז בשלב הבא, אני רוצה לסנן רק לתוצאות שליליות. לישויות של מאמר גרף ידע יש ציון סנטימנט (ניתן לראות אותם בתוצאות החיפוש) שעובר מ-1 לשלילי ביותר ל-1 לחיובי ביותר. בתחילה, פשוט בחרתי פריטים עם סנטימנט קטן או שווה ל-0.
ווט, להגיע לשם. כשלב אחרון, ידעתי שזה יעבור אוטומטית ויסונן לפריטים 'אחרונים', אז הוספתי מסנן אחד נוסף, הפעם date
, שנבחר after
, ובחרתי תאריך מלפני שבוע.
בשלב זה, השאילתה נראית טוב, אז בואו נעתיק את ערך השאילתה שסופק על ידי הכלי:
type:Article tags.label:"Xbox" language:"en" sentiment<=0 date>"2025-03-03" sortBy:date
עיצוב השאילתה היה באמת החלק הקשה. עבור הקוד, הלכתי ל- Search docs. הדוגמאות מבוססות על סלסול/HTTP אך די קלות להעברה לפייתון או לכל שפה אחרת. שקול את המדגם הזה:
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("------------------------------------")
לפרק את זה - התחלתי עם השאילתה שלי מהכלי הוויזואלי. לאחר מכן זו מקודדת כתובת האתר ומועברת ל-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 handler", שהיא הדרך הסטנדרטית לכתוב שלבי קוד בזרימת העבודה של 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")
עכשיו אני רוצה 'לעסות' קצת את התוצאות. בסופו של דבר אני הולך לשלוח את זה לעצמי באימייל, אז בניתי שלב לעיצוב התוצאות במחרוזת נחמדה:
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
שוב, זה קצת שרירותי מבחינת מה שחשבתי מספיק חשוב לכלול. אתה בהחלט יכול להיות יותר מהודר, ואפילו לעשות דברים כמו, "על סנטימנט ממש רע, להוסיף צבע, דגלים אדומים וכו'".
השלב האחרון היה פשוט לשלוח לעצמי את התוצאות באימייל. Pipedream תומכת בצעד "שלח אימייל לבעל החשבון" שיעשה בדיוק את זה, שלח לי אימייל. אם הייתי בונה את זה עבור לקוח, הייתי משתמש באחד משלבים מובנים רבים של Pipedream עבור ממשקי API של דואר.
לאחר ריצה, אני מקבל הודעת דוא"ל נחמדה עם רשימה של מאמרים והרגשות שלהם:
אם תבחר לתת ל-Pipedream סיבוב, תוכל למצוא את זרימת העבודה שלי כאן: https://github.com/cfjedimaster/General-Pipedream-AI-Stuff/tree/production/report-on-sentiment-p_gYCeNbG
זוהי רק דוגמה אחת לשימוש ב-Knowledge Graph API של Diffbot, וכזכור, מאמרים הם רק אחד מסוגי הנתונים הרבים והשונים שתוכל לחפש. כל מה שעשיתי כאן נעשה גם על חשבון חינמי לחלוטין , כך שאתה יכול להירשם ולנסות את זה בעצמך. אני הולך לחפור על זה יותר אז תודיע לי אם יש לך שאלות כלשהן!