700 以上のラボとコースにアクセス

Natural Language API を使用した非構造化テキストの分類

ラボ 1時間 universal_currency_alt クレジット: 5 show_chart 上級
info このラボでは、学習をサポートする AI ツールが組み込まれている場合があります。
700 以上のラボとコースにアクセス

概要

Cloud Natural Language API を使用すると、テキストからエンティティを抽出して感情分析や構文解析を行い、分析したテキストをカテゴリに分類できます。このラボでは、テキスト分類を中心に演習を行います。700 以上のカテゴリが登録されたデータベースを使用するこの API 機能により、大規模なテキスト データセットの分類が容易になります。

ラボの内容

  • Natural Language API(NL API)リクエストを作成し、curl で API を呼び出す
  • NL API のテキスト分類機能を使用する
  • テキスト分類機能を使ってニュース記事のデータセットに関する理解を深める

必要なもの

  • Google Cloud Platform プロジェクト
  • ブラウザ(ChromeFirefox など)

設定と要件

ラボの設定

各ラボでは、新しい Google Cloud プロジェクトとリソースセットを一定時間無料で利用できます。

  1. Qwiklabs にシークレット ウィンドウでログインします。

  2. ラボのアクセス時間(例: 1:15:00)に注意し、時間内に完了できるようにしてください。
    一時停止機能はありません。必要な場合はやり直せますが、最初からになります。

  3. 準備ができたら、[ラボを開始] をクリックします。

  4. ラボの認証情報(ユーザー名パスワード)をメモしておきます。この情報は、Google Cloud Console にログインする際に使用します。

  5. [Google Console を開く] をクリックします。

  6. [別のアカウントを使用] をクリックし、このラボの認証情報をコピーしてプロンプトに貼り付けます。
    他の認証情報を使用すると、エラーが発生したり、料金の請求が発生したりします。

  7. 利用規約に同意し、再設定用のリソースページをスキップします。

Google Cloud Shell の有効化

Google Cloud Shell は、開発ツールと一緒に読み込まれる仮想マシンです。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働します。

Google Cloud Shell を使用すると、コマンドラインで Google Cloud リソースにアクセスできます。

  1. Google Cloud コンソールで、右上のツールバーにある [Cloud Shell をアクティブにする] ボタンをクリックします。

    ハイライト表示された Cloud Shell アイコン

  2. [続行] をクリックします。

環境がプロビジョニングされ、接続されるまでしばらく待ちます。接続した時点で認証が完了しており、プロジェクトに各自のプロジェクト ID が設定されます。次に例を示します。

Cloud Shell ターミナルでハイライト表示されたプロジェクト ID

gcloud は Google Cloud のコマンドライン ツールです。このツールは、Cloud Shell にプリインストールされており、タブ補完がサポートされています。

  • 次のコマンドを使用すると、有効なアカウント名を一覧表示できます。
gcloud auth list

出力:

Credentialed accounts: - @.com (active)

出力例:

Credentialed accounts: - google1623327_student@qwiklabs.net
  • 次のコマンドを使用すると、プロジェクト ID を一覧表示できます。
gcloud config list project

出力:

[core] project =

出力例:

[core] project = qwiklabs-gcp-44776a13dea667a6 注: gcloud ドキュメントの全文については、 gcloud CLI の概要ガイド をご覧ください。

タスク 1. Cloud Natural Language API が有効になっていることを確認する

  1. 画面左上のナビゲーション メニュー アイコン(ナビゲーション メニュー アイコン)をクリックします。

  2. [API とサービス] > [有効な API とサービス] を選択します。

  3. [+ API とサービスの有効化] をクリックします。

  4. 次に、検索ボックスで「language」を検索します。[Cloud Natural Language API] をクリックします。

  5. API が有効になっていない場合は、[有効にする] ボタンが表示されます。[有効にする] をクリックして、Cloud Natural Language API を有効にします。

API が有効になっている場合は、[Cloud Natural Language API] タイルに [管理] ボタンが表示されます。

タスク 2. API キーを作成する

curl を使用して Natural Language API にリクエストを送信するため、リクエスト URL に渡す API キーを生成する必要があります。

  1. API キーを作成するには、コンソールのナビゲーション メニューをクリックし、[API とサービス] > [認証情報] をクリックします。

  2. [+ 認証情報を作成] をクリックします。

  3. プルダウン メニューで [API キー] を選択します。

  4. 生成された API キーをコピーし、[閉じる] をクリックします。

API キーが準備できたので、リクエストごとに API キーの値を挿入しなくて済むようにするために、環境変数にキーを保存します。

  1. Cloud Shell で次のコマンドを実行します。<your_api_key> の部分は、コピーしたキーに置き換えてください。
export API_KEY=<YOUR_API_KEY>

タスク 3. ニュース記事を分類する

Natural Language API の classifyText メソッドを使用すると、1 つの API 呼び出しでテキストデータをカテゴリに分類できます。このメソッドは、テキスト ドキュメントに適用されるコンテンツ カテゴリのリストを返します。返されるカテゴリの具体性には幅があり、/Computers & Electronics のように大まかなカテゴリもあれば、/Computers & Electronics/Programming/Java (Programming Language) のように非常に具体的なカテゴリもあります。700 以上あるカテゴリ候補の全リストはコンテンツ カテゴリ ガイドでご確認ください。

ここでは、最初に 1 つの記事を分類し、同じ手法で大規模なニュース コーパスを整理していく方法について説明します。取り上げるのは、The New York Times の料理セクションの記事にあった、次の見出しと説明です。

A Smoky Lobster Salad With a Tapa Twist. This spin on the Spanish pulpo a la gallega skips the octopus, but keeps the sea salt, olive oil, pimentón and boiled potatoes.(タパスをアレンジしたスモーキー ロブスター サラダ。スペイン料理、プルポ・ア・ラ・ガジェガ(ガリシア風タコ)をヒントにしたこの一品には、タコは使いませんが、岩塩、オリーブオイル、ピメントン、ゆでジャガイモを使います。)

  1. Cloud Shell で次のコードを入力し、request.json ファイルを作成します。Cloud Shell コードエディタ以外のコマンドライン エディタ(nano、vim、emacs)を使用してもかまいません。

Cloud Shell の [エディタを開く] ボタン

  1. request.json という名前の新しいファイルを作成し、以下を追加します。
{ "document":{ "type":"PLAIN_TEXT", "content":"A Smoky Lobster Salad With a Tapa Twist. This spin on the Spanish pulpo a la gallega skips the octopus, but keeps the sea salt, olive oil, pimentón and boiled potatoes." } }
  1. このテキストを、次の curl コマンドを使って Natural Language API の classifyText メソッドに送信します。
curl "https://language.googleapis.com/v1/documents:classifyText?key=${API_KEY}" \ -s -X POST -H "Content-Type: application/json" --data-binary @request.json

レスポンスを確認します。

出力:

{ categories: [ { name: '/Food & Drink/Cooking & Recipes', confidence: 0.85 }, { name: '/Food & Drink/Food/Meat & Seafood', confidence: 0.63 } ] }

このテキストに対し、次の 2 つのカテゴリが API から返されます。

  • /Food & Drink/Cooking & Recipes
  • /Food & Drink/Food/Meat & Seafood

テキストには、これがレシピであることもシーフードが含まれることもはっきりとは書かれていませんが、この API を使えば分類することができます。1 つの記事を分類することでもこの機能の優れた点がわかりますが、本当の利点は、次のように大規模なテキストデータを扱うことで見えてきます。

タスク 4. 大規模なテキスト データセットを分類する

BBC のニュース記事を集めたこちらの一般公開データセットを使って、classifyText メソッドで大量のテキストを含むデータセットをわかりやすく整理していきましょう。このデータセットには、2004 年から 2005 年までの間に書かれた 5 つの分野(ビジネス、エンターテインメント、政治、スポーツ、テクノロジー)の記事が 2,225 件含まれています。一般公開されている Google Cloud Storage バケットの中には、これらの記事のサブセットがあります。記事は 1 件ずつ 1 つの .txt ファイルになっています。

データを調べて Natural Language API に送信するために、Cloud Storage から各テキスト ファイルを読み取り、classifyText エンドポイントに送信し、その結果を BigQuery テーブルに保存する Python スクリプトを作成します。BigQuery は、大規模なデータセットの保存や分析を容易にする Google Cloud のビッグデータ ウェアハウス ツールです。

  • 作業するテキストの種類を確認するため、次のコマンドを実行して 1 つの記事を表示してみます。

    gcloud storage cat gs://cloud-training-demos-text/bbc_dataset/entertainment/001.txt

次に、データを保存する BigQuery テーブルを作成します。

タスク 5. 分類したテキストデータを保存する BigQuery テーブルを作成する

Natural Language API にテキストを送信する前に、各記事のテキストとカテゴリの保存場所を用意する必要があります。

  1. Google Cloud コンソールでナビゲーション メニューナビゲーション メニュー アイコン)の [BigQuery] をクリックします。

  2. BigQuery の起動画面が表示されたら、[完了] をクリックします。

  3. 左側のパネルでプロジェクト名の横にある [アクションを表示] アイコン([アクションを表示] アイコン)をクリックした後、[データセットを作成] をクリックします。

  4. [データセット ID] に「news_classification_dataset」と入力します。

  5. [データセットを作成] をクリックします。

  6. データセット名の横にあるアクションを表示アイコンをクリックし、[テーブルを作成] をクリックします。以下の設定で新しいテーブルを作成します。

  • テーブルの作成元: 空のテーブル
  • テーブル名: article_data
  • [スキーマ] の下にある [フィールドを追加](+)をクリックし、 article_textSTRING 型)、 categorySTRING 型)、 confidenceFLOAT 型)の 3 つのフィールドを追加します。
  1. [テーブルを作成] をクリックします。

現在、テーブルは空の状態です。次のステップで、Cloud Storage から記事を読み取り、それを Natural Language API に送信して分類し、結果を BigQuery に保存していきます。

タスク 6. ニュースデータを分類して結果を BigQuery に保存する

ニュースデータを Natural Language API に送信するスクリプトを作成する前に、サービス アカウントを作成する必要があります。このアカウントは、Python スクリプトから Natural Language API と BigQuery に対して認証を行う際に使用されます。

  1. まず Cloud Shell に戻り、Cloud プロジェクトの名前を環境変数としてエクスポートします。<your_project_name> は、ラボの [ラボの詳細] パネルに表示される GCP プロジェクト ID に置き換えてください。
export PROJECT=<your_project_name>
  1. 次に、Cloud Shell から次のコマンドを実行してサービス アカウントを作成します。
gcloud iam service-accounts create my-account --display-name my-account gcloud projects add-iam-policy-binding $PROJECT --member=serviceAccount:my-account@$PROJECT.iam.gserviceaccount.com --role=roles/bigquery.admin gcloud projects add-iam-policy-binding $PROJECT --member=serviceAccount:my-account@$PROJECT.iam.gserviceaccount.com --role=roles/serviceusage.serviceUsageConsumer gcloud iam service-accounts keys create key.json --iam-account=my-account@$PROJECT.iam.gserviceaccount.com export GOOGLE_APPLICATION_CREDENTIALS=key.json

これで、Natural Language API にテキストデータを送信する準備が整いました。

データを送信するために、Google Cloud 用の Python モジュールを使用して Python スクリプトを作成します。さまざまなクラウド クライアント ライブラリが多数存在し、どの言語からでも同じことができます。

  1. classify-text.py という名前のファイルを作成し、ファイルの中に以下をコピーします。YOUR-PROJECTGCP プロジェクト ID に置き換えてください。
注: プロジェクト ID の値を囲む単一引用符は削除せず、そのままにしてください。 from google.cloud import storage, language_v1, bigquery # GCS、NL、BigQuery クライアントを設定する storage_client = storage.Client() nl_client = language_v1.LanguageServiceClient() # 必要な操作: 下記の YOUR_PROJECT をプロジェクト ID に置き換える bq_client = bigquery.Client(project='YOUR_PROJECT') dataset_ref = bq_client.dataset('news_classification_dataset') dataset = bigquery.Dataset(dataset_ref) table_ref = dataset.table('article_data') # Update this if you used a different table name table = bq_client.get_table(table_ref) # 記事テキストを NL API の classifyText メソッドに送信する def classify_text(article): response = nl_client.classify_text( document=language_v1.types.Document( content=article, type_='PLAIN_TEXT' ) ) return response rows_for_bq = [] files = storage_client.bucket('cloud-training-demos-text').list_blobs() print("Got article files from GCS, sending them to the NL API (this will take ~2 minutes)...") # ファイルを NL API に送信し、結果を BigQuery に送信するために保存する for file in files: if file.name.endswith('txt'): article_text = file.download_as_bytes() nl_response = classify_text(article_text) if len(nl_response.categories) > 0: rows_for_bq.append((str(article_text), str(nl_response.categories[0].name), nl_response.categories[0].confidence)) print("Writing NL API article data to BigQuery...") # 記事テキストとカテゴリデータを BQ に書き込む errors = bq_client.insert_rows(table, rows_for_bq) assert errors == []

これで、記事を分類して BigQuery にインポートする準備が整いました。

  1. 次のスクリプトを実行します。
python3 classify-text.py

スクリプトが完了するまで 2 分ほどかかりますので、その間に処理内容について説明します。

注: python3 classify-text.py の実行時にエラーが発生した場合、Cloud Shell が切断される可能性があります。この問題を解決するために、次のコマンドを実行して環境変数をエクスポートし、python3 classify-text.py コマンドを再実行してください。

  • export PROJECT=(GCP プロジェクト ID)
  • export GOOGLE_APPLICATION_CREDENTIALS=key.json

Google では、google-cloud という Python クライアント ライブラリを使用して、Cloud Storage、Natural Language API、BigQuery にアクセスしています。まず、サービスごとにクライアントが作成され、BigQuery テーブルに参照が作成されます。一般公開されているバケットに含まれる各 BBC データセット ファイルへの参照は、files です。これらのファイルを順番に処理し、記事を文字列としてダウンロードし、それぞれを classify_text 関数の Natural Language API に送信します。Natural Language API からカテゴリが返されたすべての記事について、記事とそのカテゴリデータが rows_for_bq リストに保存されます。各記事の分類が完了すると、insert_rows() によって BigQuery にデータが挿入されます。

注: 1 つのドキュメントに対して Natural Language API から複数のカテゴリが返されることがありますが、このラボでは話をシンプルにするため、返された最初のカテゴリのみ保存すれば問題ありません。

スクリプトの実行が完了したら、記事データが BigQuery に保存されたことを確認します。

  1. BigQuery で article_data テーブルに移動して、[クエリ] > [新しいタブ] をクリックします。

article_data テーブル

  1. [無題] ボックスの結果を編集し、SELECT と FROM の間にアスタリスクを入れます。
SELECT * FROM `news_classification_dataset.article_data`
  1. [実行] をクリックします。

クエリが完了すると、データが表示されます。右にスクロールして、カテゴリ列を表示します。

カテゴリ列には、Natural Language API から記事に対して返された最初のカテゴリの名前が含まれ、confidence には、API による記事の分類の信頼性を示す 0〜1 の値が含まれています。次のステップでは、データに対してより複雑なクエリを実行する方法について説明します。

タスク 7. 分類されたニュースデータを BigQuery で分析する

まず、データセットで最も多かったカテゴリを確認します。

  1. BigQuery コンソールで、[+ クエリを新規作成] をクリックします。

  2. 次のクエリを入力します。

SELECT category, COUNT(*) c FROM `news_classification_dataset.article_data` GROUP BY category ORDER BY c DESC
  1. [実行] をクリックします。

クエリの結果として、次のような内容が表示されます。

BQ query results.png

  1. /Arts & Entertainment/Music & Audio/Classical Music のように大まかなカテゴリの記事が返されるようにする場合は、次のクエリを実行します。
SELECT * FROM `news_classification_dataset.article_data` WHERE category = "/Arts & Entertainment/Music & Audio/Classical Music"
  1. Natural language API から返された信頼スコアが 90% を超えている記事のみを取得するには、次のクエリを実行します。
SELECT article_text, category FROM `news_classification_dataset.article_data` WHERE cast(confidence as float64) > 0.9

その他のクエリ方法について詳しくは、BigQuery のドキュメントをご確認ください。BigQuery は多数の可視化ツールとも統合されています。分類したニュースデータを可視化したい場合は、BigQuery のデータポータル クイックスタートをご参照ください。

お疲れさまでした

このラボでは、Natural Language API のテキスト分類メソッドを使ってニュース記事を分類する方法を学習しました。最初に 1 つの記事を分類する方法を学び、その後、大規模なニュース データセットを NL API で分類して BigQuery で分析する方法を学びました。

学習した内容

  • Natural Language API classifyText リクエストの作成と curl を使用した API の呼び出し
  • Google Cloud の Python モジュールによる大規模なニュース データセットの分析
  • BigQuery でのデータのインポートと分析

Copyright 2020 Google LLC All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。

始める前に

  1. ラボでは、Google Cloud プロジェクトとリソースを一定の時間利用します
  2. ラボには時間制限があり、一時停止機能はありません。ラボを終了した場合は、最初からやり直す必要があります。
  3. 画面左上の [ラボを開始] をクリックして開始します

シークレット ブラウジングを使用する

  1. ラボで使用するユーザー名パスワードをコピーします
  2. プライベート モードで [コンソールを開く] をクリックします

コンソールにログインする

    ラボの認証情報を使用して
  1. ログインします。他の認証情報を使用すると、エラーが発生したり、料金が発生したりする可能性があります。
  2. 利用規約に同意し、再設定用のリソースページをスキップします
  3. ラボを終了する場合や最初からやり直す場合を除き、[ラボを終了] はクリックしないでください。クリックすると、作業内容がクリアされ、プロジェクトが削除されます

このコンテンツは現在ご利用いただけません

利用可能になりましたら、メールでお知らせいたします

ありがとうございます。

利用可能になりましたら、メールでご連絡いたします

1 回に 1 つのラボ

既存のラボをすべて終了して、このラボを開始することを確認してください

シークレット ブラウジングを使用してラボを実行する

このラボの実行には、シークレット モードまたはシークレット ブラウジング ウィンドウを使用してください。これにより、個人アカウントと受講者アカウントの競合を防ぎ、個人アカウントに追加料金が発生することを防ぎます。