
Diffbot のKnowledge Graph の目的は単純です。シンプルなテキストベースの検索エンジン エクスペリエンスよりもデータと関係性を重視した検索によって、すべての知識の総計を指先で把握できるようにすることです。Web 全体から収集された Knowledge Graph を使用すると、単純な API を介して数十億のデータ ポイントに対して複雑なクエリを瞬時に実行できます。私は、この API を試して、「比較的」単純なツール (自動化プラットフォームで実行される製品のニュース分析) を構築することにしました。簡単なはずですよね? では、始めましょう。このブログ記事の例では、Diffbot から無料のキーを取得していることを前提としています。サンプルを試す前に、必ず取得してください。
コードを 1 行も書く前に、Diffbot にサインインして Knowledge Graph のビジュアル検索ツールを開きました。このツールを使用すると、視覚的に、または手動でクエリを作成できます。クエリは Diffbot では「DQL」ステートメントと呼ばれ、構文を見たことがない場合でも簡単に読むことができます。
このツールから、まずエンティティ タイプを選択しました。これは、検索したいデータの高レベル タイプであり、人物、イベント、映画、投資など、多数のオプションの 1 つになります。私の素晴らしい製品を悪く言うニュースを見つけることが目的なので、「記事」を選択しました。次に、「フィルター条件」オプションを選択しました。エンティティ タイプの任意のプロパティでフィルターできますが、単純なテキスト検索よりも正確な一致が得られるtags.label
を使用しました。テキスト フィルターは機能しますが、 tags.label
を使用すると、結果が検索に焦点を絞ったものになり、単に言及するだけではない、はるかに優れた結果が得られます。デモでは、「XBox」に関する記事を検索します。
また、「並べ替え」の値を使用して最新のものを最初に表示し、このヒット検索を使用して結果が意味をなすかどうかを確認しました。
最初の結果には外国語の結果は含まれていませんでしたが、英語の結果をフィルタリングしたいことはわかっていたので、次に言語のフィルターを追加しました。現在のフィルターの + 記号をクリックすると、言語と英語のen
を追加できるようになりました。もう一度、検索を押します。
さて、次に、否定的な結果だけにフィルターをかけたいと思います。ナレッジ グラフの記事エンティティには感情スコア (検索結果で確認できます) があり、これは -1 が最も否定的、1 が最も肯定的となります。最初は、感情が 0 以下の項目を単純に選択しました。
やった、もうすぐ終わり。最後のステップとして、これは自動化されて「最近の」アイテムにフィルターされることを知っていたので、もう 1 つのフィルターを追加しました。今回はdate
、 after
選択し、1 週間前の日付を選択しました。
この時点でクエリは問題なさそうなので、ツールによって提供されたクエリ値をコピーしてみましょう。
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 エンコードされ、Knowledge Graph の 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を使用します。各部分が構築されたワークフロー全体は次のとおりです。
私は、いつ実行するかという単純なスケジュール ベースのトリガーからワークフローを開始しました。これは多少恣意的ですが、毎週、日曜日の午後 1 時を選択しました。
次のステップ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")
ここで、結果を少し「調整」したいと思います。最終的にはこれを自分にメールで送信する予定なので、結果を適切な文字列にフォーマットする手順を構築しました。
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 は、まさにそれを実行する「アカウント所有者にメールを送信」ステップをサポートしています。つまり、私にメールを送信します。クライアント向けにこれを構築する場合は、メール API 用の多くの Pipedream 組み込みステップの 1 つを使用します。
実行すると、記事のリストとその感想が記載された素敵なメールが届きます。
Pipedream を試してみたい場合は、私のワークフローをこちらで確認できます: https://github.com/cfjedimaster/General-Pipedream-AI-Stuff/tree/production/report-on-sentiment-p_gYCeNbG
これは、Diffbot の Knowledge Graph API の使用例の 1 つにすぎません。また、記事は検索できるさまざまなデータのうちの 1 つにすぎないことに注意してください。ここで行ったことはすべて、完全に無料のアカウントで実行されたため、ぜひサインアップして自分で試してみることができます。これについてさらに詳しく調べるつもりですので、質問があればお知らせください。