Googleナレッジグラフの検索APIを使ってみる(Google Knowledge Graph Search API)

本記事では、Googleのナレッジグラフとは、そしてそれがどのような情報を持っているのかを、技術的な詳細には立ち入らずにみていきます。

【目次】

[1]はじめに

例えば、Googleで「東京タワー」を検索すると、右側に東京タワーに関する概要や所在地、ウェブサイトなど、様々な関連情報が表示されます。
これは「ナレッジパネル」といわれるもので、以下のように説明されています。
  • ナレッジパネルについて(https://support.google.com/knowledgepanel/answer/9163198?hl=ja&ref_topic=9164489
    • ナレッジパネルは、ナレッジグラフに存在する対象(人、場所、組織、物事など)を検索したときに Google に表示される情報ボックスです。
  • Google 検索のナレッジグラフとナレッジパネルとは(https://japan.googleblog.com/2020/05/KnowledgeGraphKnowledgePanel.html
    • ナレッジパネルは、検索された人物、場所、モノに関する主な事実を表示することでそれについてすばやく理解し、トピックに関する情報を簡単に調べられるように設計されています。ナレッジパネルの情報は、まるで巨大なバーチャル百科事典のような「ナレッジグラフ」に基づいています。

これらによるとGoogle検索の右側に表示される「ナレッジパネル」の情報は、「ナレッジグラフ」をもとにしているようです。

この「ナレッジグラフ」とは何でしょうか?
少し情報が古いですが、Googleのナレッジグラフの考え方は以下のページに説明されています。

このページの中に「Introducing the Knowledge Graph」というYutubu動画へのリンクがあります。この動画で語られている言葉で印象的なものをピックアップしてみます。
  • 検索キーワードは実世界に存在する何かを表しています。ランダムな文字列ではないのです。
    • キーワードが実世界において何を表しているかがわかればウェブでの探し物が今よりもっと楽になるはずです。
  • Googleでは実世界での情報のつながりをナレッジグラフという方法で体系づけようとしています。
    • ナレッジグラフでは、実世界の物についての情報を収集します。ナレッジグラフ内の関連する情報とつなげることもできます。
  • ナレッジグラフは情報エンジンから知識エンジンへの第一歩なんです。
    • ナレッジグラフの情報が充実すれば、ユーザの検索キーワードをもっと正確に理解できるようになり、ウェブ上の情報をもっと深く理解して情報と情報を知的に関連付けられる。

これをみると、有名?なGoogleのミッション「世界中の情報を整理し、世界中の人がアクセスできて使えるようにすること」に通じるものを感じます。(このミッションについては様々な意見がありますけど。)

それはともかく、Googleのナレッジグラフが具体的にどのような実装かはわかりませんが、Googleが持っている知識のデータベースと考えることができそうです。
そしてGoogle Knowledge Graph Search APIが公開されており、このAPIを利用すれば、ナレッジグラフの検索ができます。

本記事では、まずはナレッジグラフの技術的な詳細には立ち入らず、Googleのナレッジグラフがどのような情報を持っているのかを、ブラウザを使って検索して見てみたいと思います。

(参考)

日本語版Wikipediaで「ナレッジグラフ」を調べると以下のように書かれています。
  • ナレッジグラフ(英語:Knowledge Graph)は、様々な情報源から収集したセマンティック検索情報を用いて検索エンジンの検索結果を拡張するためにGoogleが使用する知識ベースである。

これを読むと「ナレッジグラフ」という用語はGoogleの知識ベースのことだけを指すように読めますが、対応する英語版Wikipediaのタイトルは「Google Knowledge Graph」です。そして情報科学における「Knowledge graph」の実装の一つとして書かれています。

また、Googleで「ナレッジグラフ」と入力して検索すると、大雑把にいえば、以下の情報が多く見つかると思います。
  • GoogleのナレッジパネルとSEO(Search Engine Optimization)に関する情報
  • 情報科学分野のナレッジグラフに関する研究や製品などの情報

このように「ナレッジグラフ」という言葉は、様々な観点でいろいろ深いものがあるようですが、本記事では、Googleの知識ベース?としてのナレッジグラフについて見ていきます。


[2]Google Knowledge Graph Search API

Google Knowledge Graph Search APIを利用すると、Googleのナレッジグラフにあるエンティティを検索することができます。

このAPIはGoogleのナレッジグラフに対する検索であり、GoogleがインデックスしているWebページの検索とは異なるものです。また、Google検索の右側に表示されるナレッジパネルの表示内容全てが得られるものではありません。

ところで、このAPIは無料で利用できますが、利用にあたってGCP(Google Cloud Platform)での準備作業や留意事項がありますので、まずはこれらを確認しておきます。

(1)GCPでの準備作業

Google Knowledge Graph Search APIを利用するには、GCP(Google Cloud Platform)のプロジェクトでAPIの有効化とAPIキーの取得が必要です。

以下に、簡単ですが準備作業項目を見ておきます。
①利用するGoogleアカウントの用意
②利用するGCPプロジェクトの用意
③APIの有効化
④APIキーの取得

なお、上記手順は全て無料で行うことができます。また、Google Knowledge Graph Search APIの有効化のために課金を有効化する必要はありません。

①利用するGoogleアカウントの用意

GCPのプロジェクトを利用するためにはGoogleアカウントが必要です。Googleアカウントは新規に作成してもよいし、既存のもの(GMailで利用しているアカウントなど)でもかまいません。

②利用するGCPプロジェクトの用意

利用するGoogleアカウントを決めたら、Cloud Console(統合型 Google Cloud Platform 管理コンソール)にログインします。

利用するGCPのサービスはプロジェクト単位で管理されるため、Google Knowledge Graph Search APIを利用するプロジェクトを決める必要があります。これは新規にプロジェクトを作成してもよいし、既存のプロジェクトを利用することもできます。
プロジェクト単位でセキュリティや利用状況のモニタリング等が分離されますので、手軽に試してみる場合は、テスト用の新しいプロジェクトを作成し、不要になれば削除するのがよいと思います。

③APIの有効化

利用するプロジェクトを選択した後に、Consoleの左側メニューの「APIとサービス/ライブラリ」を選択して、「Knowledge Graph Search API」を検索します。「Knowledge Graph Search API」を選択して、「有効にする」ボタンをクリックします。

④APIキーの取得

Consoleの左側メニューの「APIとサービス/認証情報」を選択すると認証情報画面が表示されます。
画面上にある「+認証情報を作成」を選択し、プルダウン メニューから [API キー] を選択します。
すると、「APIキーを作成しました」画面が表示されると同時に、作成したAPIキーが認証情報画面のAPIキーの一覧に表示されます。
一覧のキー名をクリックすると、APIキーの文字列や詳細な情報を見ることができます。

なお、以下のページにある「API キーを保護する」の項なども参考にしてください。

(2)留意事項など

公式ドキュメントに書かれている留意事項をざっと要約しておきます。
  • Google Knowledge Graph Search APIは無料で利用できますが、プロジェクト毎に、1日あたり最大100,000回までの呼び出しが可能です。
  • 読み出し専用のAPIであり、ナレッジグラフの登録や修正などを行う機能はありません。修正や削除については以下のページなどを参考にしてください。
  • 製品に不可欠なサービスとしての利用には適していない旨の注意書きがあります。
    • 恐らく、無料でもあり、何らかのサービスレベルを保証するものではないという意図だと思います。
  • 検索結果は、関連するエンティティのグラフではなく、検索条件にマッチした個別のエンティティを返します。

[3]APIの利用方法

Google Knowledge Graph Search APIの利用法は大きく2つあります。
  • HTTPリクエストを送信してレスポンスを解析する。
  • クライアントライブラリを利用する。

本記事では、技術的な詳細に立ち入らず、Googleのナレッジグラフが持つデータの雰囲気をつかむことです。HTTPリクエストの内容は単純ですので、今回は最も簡単だと思われるブラウザからHTTPリクエストを送信して結果を表示する方法で試してみます。

以下では、ざっとAPIの仕様を確認し、ブラウザからの利用方法をみておきます。

(1)HTTPリクエスト

Google Knowledge Graph Search APIの仕様は以下のページにあります。

以下に簡単に要約します。

①リクエストの形

https://kgsearch.googleapis.com/v1/entities:search?key=[APIキー]&パラメータ

以下のパラメータを&で連結して指定します。
  • query
    • 型:string
    • 検索する文字列リテラル。
  • ids
    • 型:string
    • エンティティIDのリスト。
    • ...?ids=A&ids=Bのように複数指定することができます。
    • 詳細は割愛しますが、/g/で始まるIDや/m/で始まるIDがあります。
  • languages
    • 型:string
    • 言語コード(ISO639)のリスト。
    • ...?languages=en&languages=jaのように複数指定することができます。
  • types
    • 型:string
    • エンティティのタイプを指定したいときに指定します。例えば、Personなどを指定します。
    • 検索結果に含まれる@typeに対応しています。
  • indent
    • 型:boolean
    • Trueを指定すると、検索結果のJSONがインデントされます。
  • prefix
    • 型:boolean
    • エンティティの名前とエイリアスに対するプレフィックス(最初の部分文字列)の一致を有効にします。 たとえば、接頭辞「Jung」は、「Jung」、「Jungle」、「Jung-hoKang」などのエンティティとエイリアスに一致します。
    • とはいうものの、実際に「Jung」で検索するとprefixの設定に関係なく、Jungleも候補にあがってきますので、検索結果にどのように影響するか、私はよくわかっていません。
  • limit
    • 型:number
    • 検索結果のエンティティ数を制限します。 最大値は500で、デフォルトは20です。
    • 大きな数を指定するとタイムアウトする可能性があるようです。

なお、以下の点に注意してください。
  • keyにはAPIキーを指定します。
  • query文字列にはパーセントエンコーディングが必要です。
  • queryパラメータまたはidsパラメータのどちらか一方を指定する必要があります。
    • queryとidsのどちらも指定しない場合は「One of 'query' or 'ids' must be non-empty.」というエラーになります。
    • 一方、queryとidsの両方を指定するとエラーにはならないようですが、AND検索のような動きのように見えます。(idsがわかっている場合は、queryを指定する積極的な理由は無いような気がします。)

②レスポンスデータ

レスポンスデータはパラメータで指定した条件にマッチしたエンティティのリストです。フォーマットはJSON-LDです。また、schema.orgとGoogle拡張によるタイプとプロパティが利用されています。

本記事では、JSON-LDとか、schema.org云々、結果フィールドの意味などの細かいところは今回は割愛しますが、結果はJSON形式ですし、雰囲気レベルであれば、直観的に分かりやすい内容だと思います。(仕様の隅々までちゃんと理解しようとすると、かなり奥が深いです。。。)

(2022/6/30 追記)
JSON-LD や Schema.org について以下の記事を書きました。よろしければ参考にしてください。

(2)ブラウザから利用する方法

ブラウザから利用する最大のメリットは、特別な環境準備やプログラミングが不要で、かつ検索結果(JSON形式)を見やすく表示されることかと思います。(但し、先のGCP側でAPIの有効化やAPIキーの取得は必要です。)

このため、Googleのナレッジグラフの雰囲気を知るには適していると思います。

使い方は簡単で、ブラウザのURL入力欄に、上記HTTPリクエストの内容を入力します。
具体的には、https://kgsearch.googleapis.com/v1/entities:search の後ろにAPIキーと検索文字列などのパラメータを付加して、ブラウザのURLに入力します。

例えば、以下のパターンを入力します。
https://kgsearch.googleapis.com/v1/entities:search?key=[APIキー]&query=[検索文字列]

?はパラメータの開始を表し、先のHTTPリクエストのパラメータを「パラメータ名=パラメータの値」の形で&で繋ぎます。
ここで、[APIキー]は取得したAPIキーの文字列、[検索文字列]には検索文字列を指定します。

本来は、検索文字列などをパーセントエンコーディングする必要がありますが、ブラウザを利用すれば、自動変換してくれますので、検索文字列に日本語や空白をそのまま書いても問題ありません。

(参考1)
Googleで「パーセントエンコーディング」あるいは「URLエンコード」と検索すると、無料でURLエンコードを行ってくれるツール(サイト)が多く見つかります。もしURLの問題で検索がうまくいかない場合は、URLエンコードしたURLを入力するとうまく行くかもしれません。

(参考2)
ブラウザは結果のJSONを整形して表示してくれるので結果を確認しやすいのですが(但し、IEはJSONファイルのダウンロードになるみたいですが)、特にFirefoxは、下図のように階層的に表示してくれて、かつ折りたたみ/展開もできるので、とても便利です。

FirefoxでGoogle Knowledge Graph Search APIの検索を行った場合の結果表示


[4]具体な検索結果の例

ここでは「東京タワー」を例にいくつか試してみます。

なお、以下のURLにある[APIキー]の部分は、準備で取得したAPIキーの文字列に置き換えて下さい。予めURLをテキストエディタなどで用意して、ブラウザにコピペするのが簡単かと思います。

(1)基本的な検索(queryの指定)

queryに「Tokyo Tower」を指定して検索してみます。
https://kgsearch.googleapis.com/v1/entities:search?key=[APIキー]&query=Tokyo Tower
(ちなみに、queryの部分のパーセントエンコーディングは、query=Tokyo%20Towerとなります。)

すると、以下のように検索結果が表示されると思います。
{
  "@context": {
    "goog": "http://schema.googleapis.com/",
    "detailedDescription": "goog:detailedDescription",
    "@vocab": "http://schema.org/",
    "EntitySearchResult": "goog:EntitySearchResult",
    "resultScore": "goog:resultScore",
    "kg": "http://g.co/kg"
  },
  "@type": "ItemList",
  "itemListElement": [
    {
      "result": {
        "@type": [
          "Thing",
          "CivicStructure",
          "TouristAttraction",
          "Place"
        ],
        "url": "http://www.tokyotower.co.jp/english/",
        "detailedDescription": {
          "articleBody": "The Tokyo Tower is a communications and observation tower in the Shiba-koen district of Minato, Tokyo, Japan. At 332.9 meters, it is the second-tallest structure in Japan. ",
          "url": "https://en.wikipedia.org/wiki/Tokyo_Tower",
          "license": "https://en.wikipedia.org/wiki/Wikipedia:Text_of_Creative_Commons_Attribution-ShareAlike_3.0_Unported_License"
        },
        "name": "Tokyo Tower",
        "description": "Tower in Tokyo, Japan",
        "@id": "kg:/m/0132_x"
      },
      "resultScore": 11580.0859375,
      "@type": "EntitySearchResult"
    },

~~~以下省略~~~
}

itemListElementの下に17件ほど項目があります。上記はこのうち先頭要素を抜き出したものです。

簡単ですが、上記内容の主な項目について補足します。
  • nameに「Tokyo Tower」、"descriptionとして「Tower in Tokyo, Japan」とあります。urlは「http://www.tokyotower.co.jp/english/」です(但し、現在リンク切れのようです)。
  • 「Tower in Tokyo, Japan」のエンティティのURI(ここでは@id)の値は「kg:/m/0132_x」です。
    • エンティティのURIは、APIのパラメータ ids に指定できるエンティティIDを含んだ値になっています。
  • resultの@typeは、「CivicStructure」、「TouristAttraction」、「Place」となっています。
    • これらは、ざっくり言えばラベルやタグのようなものですが、東京タワーが属する概念を表しています。
  • detailedDescriptionには、英語版WikipediaのURLがあり、articleBodyには説明の抜粋があります。
  • 検索結果は、resultScoreが高い順にソートされています。
    • 「Tokyo Tower」という文字の検索に対して、最もスコアが高いのが、観光地にもなっている建造物の「東京タワー」ということになります。他の検索結果をみると、「東京タワー」という映画などもありますが、観光地の東京タワーに比べるとスコアが少し低くなるようです。(このスコアリングにも興味深いものがあります。)

ちなみに、queryには日本語も利用できます。
https://kgsearch.googleapis.com/v1/entities:search?key=[APIキー]&query=東京タワー

この場合も、検索結果は上記と同様に説明は英語です。

(2)言語(日本語など)を指定

パラメータにlanguages=jaを加えてみます。
https://kgsearch.googleapis.com/v1/entities:search?key=[APIキー]&query=Tokyo Tower&languages=ja

すると、以下のように検索結果が表示されると思います。
{
  "@context": {
    "EntitySearchResult": "goog:EntitySearchResult",
    "@vocab": "http://schema.org/",
    "resultScore": "goog:resultScore",
    "goog": "http://schema.googleapis.com/",
    "kg": "http://g.co/kg",
    "detailedDescription": "goog:detailedDescription"
  },
  "@type": "ItemList",
  "itemListElement": [
    {
      "@type": "EntitySearchResult",
      "result": {
        "@id": "kg:/m/0132_x",
        "url": "http://www.tokyotower.co.jp/english/",
        "name": "東京タワー",
        "detailedDescription": {
          "url": "https://ja.wikipedia.org/wiki/%E6%9D%B1%E4%BA%AC%E3%82%BF%E3%83%AF%E3%83%BC",
          "articleBody": "東京タワーは、日本の東京都港区芝公園にある総合電波塔の愛称である。正式名称は日本電波塔。創設者は前田久吉。1958年12月23日竣工。東京のシンボル、観光名所とされる。",
          "license": "https://en.wikipedia.org/wiki/Wikipedia:Text_of_Creative_Commons_Attribution-ShareAlike_3.0_Unported_License"
        },
        "description": "東京 港区の塔",
        "@type": [
          "Thing",
          "TouristAttraction",
          "Place",
          "CivicStructure"
        ]
      },
      "resultScore": 8685.064453125
    },

~~~以下省略~~~
}

エンティティのURIは同じ(@idの値"kg:/m/0132_x",)ですが、今度は、nameが日本語の「東京タワー」になって、detailedDescriptionが日本語版Wikipediaに変わりました。

当然、queryに日本語名を指定することもできます。
https://kgsearch.googleapis.com/v1/entities:search?key=[APIキー]&query=東京タワー&languages=ja


(3)タイプを指定して検索対象を絞る

これまでの例で、「東京タワー」の検索結果はスペースの関係上、先頭要素の1つだけ抜き出していましたが、続く検索結果のエンティティを見ると、「東京タワー」という映画や音楽があることも分かります。

例えば、映画(Movie)の「東京タワー」に絞って検索したい場合は、typesパラメータを追加します。(正確には、@typeに"Movie"を含むものを検索することになります。)
https://kgsearch.googleapis.com/v1/entities:search?key=[APIキー]&query=東京タワー&languages=ja&types=Movie

結果は以下のようになります。
{
  "@context": {
    "detailedDescription": "goog:detailedDescription",
    "EntitySearchResult": "goog:EntitySearchResult",
    "goog": "http://schema.googleapis.com/",
    "@vocab": "http://schema.org/",
    "resultScore": "goog:resultScore",
    "kg": "http://g.co/kg"
  },
  "@type": "ItemList",
  "itemListElement": [
    {
      "result": {
        "name": "東京タワー",
        "description": "2005年の映画",
        "@type": [
          "Thing",
          "Movie"
        ],
        "url": "http://www.tokyo-tower.jp/",
        "@id": "kg:/m/09gljl3"
      },
      "@type": "EntitySearchResult",
      "resultScore": 839.00091552734375
    },
    {
      "resultScore": 727.2138671875,
      "@type": "EntitySearchResult",
      "result": {
        "detailedDescription": {
          "articleBody": "『東京タワー 〜オカンとボクと、時々、オトン〜』は、リリー・フランキーの同名小説を原作とした日本映画である。2007年4月14日に松竹配給で公開された。オダギリジョー主演。第31回日本アカデミー賞最優秀作品賞受賞作品。\nゲストとして小泉今日子、六角精児、宮崎あおい、仲村トオル、柄本明、塩見三省などがカメオ出演していることでも話題となった。",
          "license": "https://en.wikipedia.org/wiki/Wikipedia:Text_of_Creative_Commons_Attribution-ShareAlike_3.0_Unported_License",
          "url": "https://ja.wikipedia.org/wiki/%E6%9D%B1%E4%BA%AC%E3%82%BF%E3%83%AF%E3%83%BC_%E3%80%9C%E3%82%AA%E3%82%AB%E3%83%B3%E3%81%A8%E3%83%9C%E3%82%AF%E3%81%A8%E3%80%81%E6%99%82%E3%80%85%E3%80%81%E3%82%AA%E3%83%88%E3%83%B3%E3%80%9C_(%E6%98%A0%E7%94%BB)"
        },
        "@id": "kg:/m/054xfjm",
        "name": "東京タワー 〜オカンとボクと、時々、オトン〜",
        "@type": [
          "Thing",
          "Movie"
        ],
        "description": "2007年の映画"
      }
    },
~~~以下省略~~~
}

この場合、結果は7件ほどとなりました。

(4)エンティティIDを指定

これまでは名前などのキーワードをもとに検索しましたが、エンティティIDが分かっている場合は、エンティティIDを指定して情報を取得することもできます。

例えば、東京タワーのエンティティのURI(@idの値)は、「kg:/m/0132_x」でした。ここでプリフィクス「kg:」以降の「/m/0132_x」をパラメータidsの値として検索します。
https://kgsearch.googleapis.com/v1/entities:search?key=[APIキー]&ids=/m/0132_x&languages=ja

上記はlanguages=jaも指定していますので、期待通り、検索結果は「東京タワー」が1つだけ得られます。

なお、複数のエンティティIDを同時に検索したい場合は、「ids=エンティティID」を&で繋いで複数指定します。

(参考)
Google Vision APIを利用すると、画像認識した情報からエンティティIDを得ることができます。記事『Vision APIとナレッジグラフ検索で画像認識対象をより深く理解する』も参考にしてみてください。

(参考:2021/8/11追記)
Google Natural Language API のエンティティ分析を利用すると、テキストから人名や地名などのエンティティID(mid)を抽出することができます。記事『Google Natural Language API を利用して固有表現とその付加情報(ナレッジグラフなど)を抽出する』も参考にしてください。

(5)言語を複数指定した場合

languagesパラメータを&でつないで言語を複数指定することもできます。

例えば、先の東京タワーのエンティティIDを指定して、英語と日本語を指定してみます。
https://kgsearch.googleapis.com/v1/entities:search?key=[APIキー]&ids=/m/0132_x&languages=ja&languages=en

すると検索結果は、エンティティの属性の値が日本語と英語で得られます。
{
  "@context": {
    "EntitySearchResult": "goog:EntitySearchResult",
    "kg": "http://g.co/kg",
    "goog": "http://schema.googleapis.com/",
    "resultScore": "goog:resultScore",
    "@vocab": "http://schema.org/",
    "detailedDescription": "goog:detailedDescription"
  },
  "@type": "ItemList",
  "itemListElement": [
    {
      "resultScore": 0,
      "result": {
        "description": [
          {
            "@value": "東京 港区の塔",
            "@language": "ja"
          },
          {
            "@value": "Tower in Tokyo, Japan",
            "@language": "en"
          }
        ],
        "url": "http://www.tokyotower.co.jp/english/",
        "@type": [
          "Place",
          "Thing",
          "CivicStructure",
          "TouristAttraction"
        ],
        "detailedDescription": [
          {
            "url": "https://en.wikipedia.org/wiki/Tokyo_Tower",
            "license": "https://en.wikipedia.org/wiki/Wikipedia:Text_of_Creative_Commons_Attribution-ShareAlike_3.0_Unported_License",
            "inLanguage": "en",
            "articleBody": "The Tokyo Tower is a communications and observation tower in the Shiba-koen district of Minato, Tokyo, Japan. At 332.9 meters, it is the second-tallest structure in Japan. "
          },
          {
            "license": "https://en.wikipedia.org/wiki/Wikipedia:Text_of_Creative_Commons_Attribution-ShareAlike_3.0_Unported_License",
            "articleBody": "東京タワーは、日本の東京都港区芝公園にある総合電波塔の愛称である。正式名称は日本電波塔。創設者は前田久吉。1958年12月23日竣工。東京のシンボル、観光名所とされる。",
            "url": "https://ja.wikipedia.org/wiki/%E6%9D%B1%E4%BA%AC%E3%82%BF%E3%83%AF%E3%83%BC",
            "inLanguage": "ja"
          }
        ],
        "name": [
          {
            "@value": "東京タワー",
            "@language": "ja"
          },
          {
            "@value": "Tokyo Tower",
            "@language": "en"
          }
        ],
        "@id": "kg:/m/0132_x"
      },
      "@type": "EntitySearchResult"
    }
  ]
}

コメント

このブログの人気の投稿

VirtualBoxのスナップショット機能

Google Document AIで画像から表形式データを抽出する(Vision API OCRとの違い)

Ubuntu/Colab環境でPDFファイルのページを画像化する(pdf2image、pdftoppm、pdftocairo)