arrow_back

Natural Language API を使用してテキストをカテゴリに分類する

参加 ログイン
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

Natural Language API を使用してテキストをカテゴリに分類する

Lab 1時間 universal_currency_alt クレジット: 5 show_chart 中級
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

GSP063

Google Cloud セルフペース ラボ

概要

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

ラボの内容

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

設定と要件

[ラボを開始] ボタンをクリックする前に

こちらの手順をお読みください。ラボの時間は記録されており、一時停止することはできません。[ラボを開始] をクリックするとスタートするタイマーは、Google Cloud のリソースを利用できる時間を示しています。

このハンズオンラボでは、シミュレーションやデモ環境ではなく、実際のクラウド環境を使ってご自身でラボのアクティビティを行うことができます。そのため、ラボの受講中に Google Cloud にログインおよびアクセスするための、新しい一時的な認証情報が提供されます。

このラボを完了するためには、下記が必要です。

  • 標準的なインターネット ブラウザ(Chrome を推奨)
注: このラボの実行には、シークレット モードまたはシークレット ブラウジング ウィンドウを使用してください。これにより、個人アカウントと受講者アカウント間の競合を防ぎ、個人アカウントに追加料金が発生することを防ぎます。
  • ラボを完了するために十分な時間を確保してください。ラボをいったん開始すると一時停止することはできません。
注: すでに個人の Google Cloud アカウントやプロジェクトをお持ちの場合でも、このラボでは使用しないでください。アカウントへの追加料金が発生する可能性があります。

ラボを開始して Google Cloud コンソールにログインする方法

  1. [ラボを開始] ボタンをクリックします。ラボの料金をお支払いいただく必要がある場合は、表示されるポップアップでお支払い方法を選択してください。 左側の [ラボの詳細] パネルには、以下が表示されます。

    • [Google コンソールを開く] ボタン
    • 残り時間
    • このラボで使用する必要がある一時的な認証情報
    • このラボを行うために必要なその他の情報(ある場合)
  2. [Google コンソールを開く] をクリックします。 ラボでリソースが起動し、別のタブで [ログイン] ページが表示されます。

    ヒント: タブをそれぞれ別のウィンドウで開き、並べて表示しておきましょう。

    注: [アカウントの選択] ダイアログが表示されたら、[別のアカウントを使用] をクリックします。
  3. 必要に応じて、[ラボの詳細] パネルから [ユーザー名] をコピーして [ログイン] ダイアログに貼り付けます。[次へ] をクリックします。

  4. [ラボの詳細] パネルから [パスワード] をコピーして [ようこそ] ダイアログに貼り付けます。[次へ] をクリックします。

    重要: 認証情報は左側のパネルに表示されたものを使用してください。Google Cloud Skills Boost の認証情報は使用しないでください。 注: このラボでご自身の Google Cloud アカウントを使用すると、追加料金が発生する場合があります。
  5. その後次のように進みます。

    • 利用規約に同意してください。
    • 一時的なアカウントなので、復元オプションや 2 要素認証プロセスは設定しないでください。
    • 無料トライアルには登録しないでください。

その後このタブで Cloud Console が開きます。

注: 左上にある [ナビゲーション メニュー] をクリックすると、Google Cloud のプロダクトやサービスのリストが含まれるメニューが表示されます。 ナビゲーション メニュー アイコン

Cloud Shell をアクティブにする

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

  1. Google Cloud コンソールの上部にある「Cloud Shell をアクティブにする」アイコン 「Cloud Shell をアクティブにする」アイコン をクリックします。

接続した時点で認証が完了しており、プロジェクトに各自の PROJECT_ID が設定されます。出力には、このセッションの PROJECT_ID を宣言する次の行が含まれています。

Your Cloud Platform project in this session is set to YOUR_PROJECT_ID

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

  1. (省略可)次のコマンドを使用すると、有効なアカウント名を一覧表示できます。
gcloud auth list
  1. [承認] をクリックします。

  2. 出力は次のようになります。

出力:

ACTIVE: * ACCOUNT: student-01-xxxxxxxxxxxx@qwiklabs.net To set the active account, run: $ gcloud config set account `ACCOUNT`
  1. (省略可)次のコマンドを使用すると、プロジェクト ID を一覧表示できます。
gcloud config list project

出力:

[core] project = <project_ID>

出力例:

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

タスク 1. Cloud Natural Language API を有効にする

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

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

  1. [API とサービスの有効化] をクリックします。
  1. 次に、検索ボックスで「language」を検索します。

  2. [Cloud Natural Language API] をクリックします。

API が有効になっていない場合は、[有効にする] ボタンが表示されます。

  1. [有効にする] をクリックして、Cloud Natural Language API を有効にします。

API が有効になると、次のような API の情報が表示されます。

API の詳細([管理] と [この API を試す] という 2 つのボタンと、[API が有効] チェックマークを含む)

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

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

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

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

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

  4. 次に、生成したキーをコピーして [閉じる] をクリックします。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。

API キーを作成する

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

この後のステップを実行するために、プロビジョニングされているインスタンスに SSH で接続してください。

  1. ナビゲーション メニューを開き、[Compute Engine] > [VM インスタンス] を選択します。プロビジョニングされた linux-instance が表示されます。
  1. [SSH] ボタンをクリックします。インタラクティブ シェルが表示されます。

  2. コマンドラインで以下のコマンドを入力します。<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 つの記事を分類し、同じ手法で大規模なニュース コーパスを整理していく方法について説明します。

  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. request.json という名前のファイルを作成し、以下のコードを追加します。お好みのコマンドライン エディタ(nano、vim、emacs)を使用してファイルを作成してもかまいません。
{ "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 } ] }

Speech API のリクエストを作成し、Speech API を呼び出すことができました。

  1. 次のコマンドを実行して result.json ファイルにレスポンスを保存します。
curl "https://language.googleapis.com/v1/documents:classifyText?key=${API_KEY}" \ -s -X POST -H "Content-Type: application/json" --data-binary @request.json > result.json エンティティ分析のレスポンスを確認する

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

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

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

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

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

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

  • 作業するテキストの種類を確認するため、次のコマンドを実行して 1 つの記事を表示してみます(gsutil は Cloud Storage のコマンドライン インターフェースです)。
gsutil cat gs://spls/gsp063/bbc_dataset/entertainment/001.txt

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

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

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

  1. コンソールのナビゲーション メニュー > [BigQuery] に移動します。

  2. [完了] をクリックします。

  3. データセットを作成するには、プロジェクト ID の横にある [アクションを表示] アイコンをクリックし、[データセットを作成] を選択します。

[データセットを作成] がハイライト表示された [アクションを表示] メニュー

  1. データセットの名前を「news_classification_dataset」にして、[データセットを作成] をクリックします。

  2. テーブルを作成するには、news_classification_dataset の横にある [アクションを表示] アイコンをクリックして、[テーブルを作成] を選択します。

  1. 以下の設定で新しいテーブルを作成します。
  • テーブルの作成元: 空のテーブル
  • テーブル名: article_data
  1. [スキーマ] で、[フィールドを追加] をクリックして、次の 3 つのフィールドを追加します。
フィールド名 種類 モード
article_text STRING NULLABLE
category STRING NULLABLE
confidence FLOAT NULLABLE

[テーブルを作成] ページの [スキーマ] セクション内のフィールド リスト(article-text、category、confidence を含む)

  1. [テーブルを作成] をクリックします。

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

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。

分類したテキストデータ用の新しいデータセットとテーブルを作成する

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

この後のステップを実行するために、Cloud Shell に接続してください。プロンプトが表示されたら、[続行] をクリックします。

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

  1. プロジェクト ID を環境変数としてエクスポートします。
export PROJECT={{{project_0.project_id | Project ID}}}
  1. 次のコマンドを実行して、サービス アカウントを作成します。
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 にテキストデータを送信する準備が整いました。

  1. Google Cloud 用の Python モジュールを使用して Python スクリプトを作成します。

さまざまなクラウド クライアント ライブラリが存在し、どの言語でも同じことができます。

  1. classify-text.py という名前のファイルを作成し、ファイルの中に次のコードをコピーします。お好みのコマンドライン エディタ(nano、vim、emacs)を使用してファイルを作成してもかまいません。
from google.cloud import storage, language, bigquery # Google Cloud Storage(GCS)、NL、BigQuery クライアントを設定する storage_client = storage.Client() nl_client = language.LanguageServiceClient() bq_client = bigquery.Client(project='{{{project_0.project_id | Project ID}}}') dataset_ref = bq_client.dataset('news_classification_dataset') dataset = bigquery.Dataset(dataset_ref) table_ref = dataset.table('article_data') table = bq_client.get_table(table_ref) # 記事テキストを NL API の classifyText メソッドに送信する def classify_text(article): response = nl_client.classify_text( document=language.Document( content=article, type_=language.Document.Type.PLAIN_TEXT ) ) return response rows_for_bq = [] files = storage_client.bucket('qwiklabs-test-bucket-gsp063').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), nl_response.categories[0].name, nl_response.categories[0].confidence)) print("Writing NL API article data to BigQuery...") # 記事テキストとカテゴリデータを BigQuery に書き込む errors = bq_client.insert_rows(table, rows_for_bq) assert errors == []

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

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

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

現在、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 テーブルに移動して、[クエリ] > [新しいタブ] をクリックし、テーブルに対してクエリを実行します。

[新しいタブ] オプションがハイライト表示された [クエリ] プルダウン メニュー

  1. [未保存のクエリ] ボックスの結果を編集し、SELECT と FROM の間にアスタリスクを入れます。
SELECT * FROM `{{{project_0.project_id | Project ID}}}.news_classification_dataset.article_data`
  1. [実行] をクリックします。

クエリが完了すると、データが表示されます。

  1. 右にスクロールして、カテゴリ列を表示します。

カテゴリ列には、Natural Language API から記事に対して返された最初のカテゴリの名前が含まれ、confidence には、API による記事の分類の信頼度を示す 0〜1 の値が含まれています。

次のステップでは、データに対してより複雑なクエリを実行する方法について説明します。

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

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

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

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

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

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

クエリの結果(ここに /News/Politics や /Business & Industrial といった複数のカテゴリが表示されている)

/Arts & Entertainment/Music & Audio/Classical Music のように漠然としたカテゴリが返された記事を見つけたい場合は、次のようなクエリを使用します。

SELECT * FROM `{{{project_0.project_id | Project ID}}}.news_classification_dataset.article_data` WHERE category = "/Arts & Entertainment/Music & Audio/Classical Music"

また、クエリを次のようにすると、Natural language API から返された信頼スコアが 90% を超えている記事のみを取得することができます。

SELECT article_text, category FROM `{{{project_0.project_id | Project ID}}}.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 でのデータのインポートと分析

クエストを完了する

このセルフペース ラボは、「Machine Learning APIs」、「Data Engineering」、「Language, Speech, Text, & Translation with Google Cloud APIs」クエストの一部です。クエストとは学習プログラムを構成する一連のラボのことで、完了すると成果が認められてバッジが贈られます。バッジは公開して、オンライン レジュメやソーシャル メディア アカウントにリンクできます。このラボの修了後、このラボが含まれるクエストに登録すれば、すぐにクレジットを受け取ることができます。受講可能なすべてのクエストについては、Google Cloud Skills Boost カタログをご覧ください。

次のラボを受講する

BQML で分類モデルを使用して訪問者の購入を予測するに進んでクエストを続けるか、以下をお試しください。

次のステップと詳細情報

Google Cloud トレーニングと認定資格

Google Cloud トレーニングと認定資格を通して、Google Cloud 技術を最大限に活用できるようになります。必要な技術スキルとベスト プラクティスについて取り扱うクラスでは、学習を継続的に進めることができます。トレーニングは基礎レベルから上級レベルまであり、オンデマンド、ライブ、バーチャル参加など、多忙なスケジュールにも対応できるオプションが用意されています。認定資格を取得することで、Google Cloud テクノロジーに関するスキルと知識を証明できます。

マニュアルの最終更新日: 2023 年 9 月 20 日

ラボの最終テスト日: 2023 年 10 月 13 日

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