連載第6回目の目的

連載第6回目と第7回目では、Excel VBAにおけるJSONデータによるWebサービスの呼び出しについての手順を学びます(なお、前回Amazon PAを告知しておりましたが諸般の事情によりまたの機会にさせていただきました。ご了承下さい)。連載第3回目などでは、APIへの入力パラメータはURLに含む形式(GETメソッド)を使用してきましたが、今回はJSON形式のデータをメッセージボディとしてAPIの入力パラメータを渡す形式(POSTメソッド)を使用します。サービスの中には、入力パラメータをJSON形式で受け取るものも多数ありますので、似たようなケースでは同様の手順でのAPI呼び出しなどに応用できるでしょう。
題材としては、ヤフー株式会社の提供する「Yahoo! JAPANテキスト解析API」を用います。このAPIは、日本語のテキストをさまざまな形で解析できるいくつかの機能を無償で提供します。今回はこれに含まれる「ルビ振り」機能を使用して、ワークシート上にあるテキストに自動でルビ(ふりがな)を振るExcelワークシートを作成します(図1)。 今回は、「Yahoo! JAPANテキスト解析API」の概要を紹介し、IDの取得、API呼び出しのテストまでを取り上げます。

  • 図1:完成サンプル

完成サンプルのExcelファイル
https://github.com/wateryinhare62/mynavi_excelvba_webservice

なお、本連載では動作確認をWindows 10 Pro(64bit)、Microsoft 365(Excel 16.0、VBA 7.1)で行っています。旧バージョンや単体のExcelで試す場合にはご注意ください。

Yahoo! JAPANテキスト解析APIについて

Yahoo! JAPANテキスト解析API(以降、テキスト解析API)は、ヤフー株式会社が提供するWebサービスのひとつです。同社のWebサービスには、ほかにショッピングAPI、YOLP(地図)、Yahoo! ID連携、求人APIなどがありますが、テキスト解析APIは日本語のテキストをさまざまな形で解析できる機能を提供します。

  • 日本語形態素解析
  • かな漢字変換
  • ルビ振り
  • 校正支援
  • 日本語係り受け解析
  • キーフレーズ抽出
  • 自然言語理解


これらの機能は、無償で利用できます。ただし、利用には一定の約束ごとと制限がありますので、事前に以下URLにある「開発のヒント」に目を通しておいてください。基本的には、商用利用はできないこと、APIの利用に一定の制限がある、クレジット表記を行うなどです。これらについては、必要なときに都度触れていきます。

APIドキュメント - Yahoo!デベロッパーネットワーク
https://developer.yahoo.co.jp/sitemap/

テキスト解析APIを使う準備

テキスト解析APIの利用には、Yahoo! JAPAN IDが必要です。IDを持っていない方は、以下から登録を行ってください。登録には、携帯電話番号が必要です。以降は、ログインしての作業になります。

Yahoo! JAPAN ID登録
https://account.edit.yahoo.co.jp/registration

そして、アプリケーションの登録が必要です。アプリケーションの登録は、APIを使うアプリケーションを識別し、APIの利用状況をモニタする目的で必要となっています。登録するとアプリケーションIDが発行されます。このIDは今回作成するアプリケーションにおいて、各自がプログラム中に設定する必要があります。アプリケーションの登録は、以下から行います。なお、アプリケーションの登録はテキスト解析APIに限ったものではなく、その他のAPIも含めたものとなっています。

アプリケーション登録
https://e.developer.yahoo.co.jp/register

上記URLにアクセスすると、図2のアプリケーション情報の入力ページが表示されます。表1の要領で、必要な項目を入力してください。入力/選択の必要のない項目は省略しています。

  • 図2:新しいアプリケーションを開発

表1:アプリケーション登録で入力する内容

項目 内容
ID連携利用有無 ID連携を利用しない(テキスト解析の利用では連携なしでOK)
利用者情報 種別を実情に合わせて選択
個人情報提供先としてユーザーへ開示することに同意しますか? 同意しない(個人情報の収集を行わないため)
契約者住所の国または地域 国または地域を実情に合わせて選択
アプリケーション名 「MyNavi Text Analyzer」など
サイトURL 利用者のホームページ、ブログなどのURLを入力
アプリケーションの説明 「テキスト解析APIを利用して、ふりがなを自動的にふるアプリケーション」など

入力したら、最後の項目の「ガイドラインに同意しますか?」について「同意する」を選択して[確認]をクリックします。図3の確認画面に移行しますので、入力内容に問題がなければ[登録]をクリックします。

  • 図3:入力内容の確認

「登録完了」と表示されれば登録は成功です。ページに表示されるClient IDを控えておいてください。このIDは、API呼び出しの際に必要となります。試しに、番号1に表示されているURLをクリックしてみてください。取得したIDに基づき、ショッピング商品検索APIから検索が実行されて、結果が表示されれば成功です(結果はJSON形式で返されます)。

  • 図4:登録完了

これで、アプリケーションの登録ができました。

APIの呼び出しをテストする

テキスト解析APIの利用にあたっては、以下のページの記載内容に目を通しておいてください。ここには、APIの利用に必要な情報がコンパクトにまとめられています。

テキスト解析 - Yahoo!デベロッパーネットワーク
https://developer.yahoo.co.jp/webapi/jlp/

今回はふりがなを振っていきますので、「Yahoo! JAPANが提供するテキスト解析WebAPI」から「ルビ振り」をクリックします。このAPIでは、漢字かな交じり文に、ひらがなとローマ字のふりがな(ルビ)を付けることができます。今回は、ルビを振るテキストは、冒頭で触れたようにPOSTメソッドで送信します。これまでの回のサンプルは、すべてGETメソッドで送信していました。

  • GETメソッド…APIに渡すデータはURLに埋め込む
  • POSTメソッド…APIに渡すデータはメッセージボディとして送信する

また、送信するデータはJSON形式である必要があります。これまでは、JSON形式で結果を受け取ることはあっても、送信するデータはJSON形式ではありませんでした(GETメソッドでしたので当たり前なのですが)。今回は、送信するデータをJSON形式データとして組み立てる手順も紹介します。
今回も、Windows PowerShellを用いてAPI呼び出しをテストしてみましょう。まず、リクエストURL(エンドポイント)は、以下のようになります。クエリパラメータはなく、必要な情報はリクエストヘッダとメッセージボディで与えます。

https://jlp.yahooapis.jp/FuriganaService/V2/furigana

リクエストヘッダに必要なのは、User-AgentとContent-Typeです。User-AgentにはアプリケーションIDを指定し、Content-Typeにはメッセージボディのコンテンツタイプとしてapplication/jsonを指定します。以下のコマンドで、$headersプロパティに連想配列としてそれぞれの値を格納しています。

> $headers = @{
  "User-Agent" = "Yahoo AppID: dj00…"         ←各自のアプリケーションIDを設定
  "Content-Type" = "application/json"
}

テスト用のJSONデータは、リスト1のとおりです。PowerShellで扱うため、ファイルのエンコーディングは、シフトJIS(Shift JIS)にしておいてください。

[リスト1]request.json

{
  "id": "9999",         ←ID(任意の「内容)
  "jsonrpc": "2.0",     ←バージョン(固定)
  "method": "jlp.furiganaservice.furigana",     ←メソッド(固定)
  "params": {
    "q": "ワークシートの漢字かな交じり文に自動でふりがなを振ってみよう!",      ←ふりがなを振る文字列(任意の内容)
    "grade": 1          ←学年(下記参照)
  }
}

gradeキーは、ふりがなを振る基準となる学年で、1~8の数値を指定します(文字列を指定すると、指定しない場合と同じになりますので注意)。1~6は小学校の学年、7は中学生(小学校で習う漢字以外にふりがなを振る)、8は一般(常用漢字以外にふりがなを振る)です。指定しない場合、すべてにふりがなを振ります。 今回のサンプルでは、コンボボックスによって、どの学年を対象にふりがなを振るか選択できるようにしています。 このJSONファイルを読み込んで、ConvertFrom-Jsonコマンドレットにて連想配列として$paramプロパティに格納します。-InputObjectは入力先で、この場合は-Rawオプション付きのGet-Contentコマンドレットでファイルをすべて読み込んだものとしています。すぐに$paramプロパティの内容を確認しています。

> $param = ConvertFrom-Json -InputObject (Get-Content request.json -Raw)
> $param
id     jsonrpc method                       params
--     ------- ------                       ------
9999 2.0     jlp.furiganaservice.furigana @{q=ワークシートの漢字かな交じり文に自動でふりがなを振ってみよう!; grade=1}

$paramは連想配列なので、APIに渡すためにConvertTo-JsonコマンドレットでJSON形式の文字列を作成し、それをUTF-8文字列にエンコードします。

> $poststr = ConvertTo-Json $param
> $poststr
{
    "id":  "9999",
    "jsonrpc":  "2.0",
    "method":  "jlp.furiganaservice.furigana",
    "params":  {
         "q":  "ワークシートの漢字かな交じり文に自動でふりがなを振ってみよう!",
         "grade":  1
               }
}
> $postbytes = [System.Text.Encoding]::UTF8.GetBytes($poststr)
> $postbytes
123
13
10
…略…
13
10
125

今回は、内容を確認しながら進めていますのでこのような手順になっていますが、JSONファイルの中身をそのままUTF-8エンコードしても構いません。

> $jsonstr = Get-Content request.json -Raw
> $postbytes = [System.Text.Encoding]::UTF8.GetBytes($jsonstr)

ヘッダ情報である$headers、メッセージボディである$postbytesが揃ったので、リクエストを投げてみます。リクエストは、これまでも登場したInvoke-WebRequestコマンドレットです。-Methodオプションで、メソッドにPOSTを指定するのを忘れないようにしてください。メッセージボディは、-Bodyオプションに指定します。漢字とフリガナが混じったJSONデータが返ってきていたら成功です。

> $result = Invoke-WebRequest https://jlp.yahooapis.jp/FuriganaService/V2/furigana -Headers $headers -Method POST -Body $postbytes
> $result.Content
{"id":"9999","jsonrpc":"2.0","result":{"word":[{"surface":"ワーク"},{"surface":"シート"},{"surface":"の"},{"furigana":"かんじ","roman":"kanzi","surface":"漢字"},{"furigana":"かなまじり","roman":"kanamaziri","subword":[{"furigana":"かな","roman":"kana","surface":"かな"},{"furigana":"ま","roman":"ma","surface":"交"},{"furigana":"じり","roman":"ziri","surface":"じり"}],"surface":"かな交じり"},{"furigana":"ぶん","roman":"bun","surface":"文"},{"surface":"に"},{"furigana":"じどう","roman":"zidou","surface":"自動"},{"surface":"で"},{"surface":"ふりがな"},{"surface":"を"},{"furigana":"ふっ","roman":"huxtu","subword":[{"furigana":"ふ","roman":"hu","surface":"振"},{"furigana":"っ","roman":"xtu","surface":"っ"}],"surface":"振っ"},{"surface":"て"},{"surface":"みよ"},{"surface":"う"},{"surface":"!"}]}}

ここで、レスポンスで返ってきたJSONデータの構造を見てみましょう。その概略をリスト2に示します。

[リスト2]ルビ振り結果のJSONデータの構造

{
  "id": "9999", … リクエスト時に指定したidと同じもの
  "jsonrpc": "2.0", … リクエスト時に指定したjsonrpcと同じもの
  "result": { …(1)すべての結果はここに含まれる
    "word": [ … 結果は配列となっている
      {
        …略
      },
      {
        "furigana": "かなまじり", … (2)ふりがな(不要な場合は存在しない)
        "roman": "kanamaziri", … (3)ローマ字(不要な場合は存在しない)
        "subword": [ … (4)ふりがなを細分する場合に存在、配列となっている
          {
            "furigana": "かな", … (2)細分化されたふりがな(不要な場合は存在しない)
            "roman": "kana", … (3)細分化されたローマ字(不要な場合は存在しない)
            "surface": "かな" … (5)細分化された被ふりがな文字列
          },
          …略…
        ],
        "surface": "かな交じり" … (5)被ふりがな文字列
      },
      …略…
    ]
  }
}

ポイントは、結果はすべてresultにまとめられており、その配下の配列wordにすべての被ふりがな文字列、ふりがななどが格納されているということです(1)。surface(5)は被ふりがな文字列で、必ず存在します。furigana(2)はそれに対するふりがな、roman(3)はそれに対するローマ字です。いずれも、不要な場合は存在しません。 なお、subword(4)が存在する場合には、それはふりがなの細分化された情報があるという意味になります。基本的には、この例の「かな交じり」のように、ふりがなはある程度まとまった文字列に対して付与されますが、「かな」「交」「じり」に分割した、細かなふりがなを得ることができます。subwordを使う使わないは自由ですが、使った方がふりがなをより細かく振ることができます。 今回のサンプルでは、チェックボックスによって、どちらの情報を使ってふりがなを振るか選択できるようにしています。

  [NOTE]API利用上の制限
--------------------------------------------------------------------------------
ルビ振りWeb APIは、24時間以内で1つのアプリケーションIDにつき50000件のリクエストが上限となっています。また、リクエストあたりの最大サイズを4KBに制限しています。今回のような実験では、回数は問題ないでしょうが被ふりがな文字列のUTF-8エンコード後の長さがあまり大きくならないようにしましょう。
--------------------------------------------------------------------------------

ワークシートの準備

APIが使えることを確認できたら、ワークシートを用意し、基本的なデザインを行っていきましょう。以下ではボタンの配置や書き込む文字列などを挙げていきますが、細かな位置やサイズの指示は特に行いませんので、完成サンプルを見ながら各自で調整してください。配置および書き込むものは、以下のとおりです。

  • アプリケーションのタイトル(説明は省略)
  • 「ふりがな対象学年」コンボボックス
  • 「ふりがなを細かく振る」チェックボックス
  • 「ふりがな入力開始」ボタン
  • ふりがな入力対象と入力結果を収納する表
  • クレジット表示

コンボボックス、チェックボックス、ボタンを配置する

まず、3つのコントロール(コンボボックス、チェックボックス、ボタン)をワークシート上部に配置します。配置の方法は3つとも同じなので、ここではコンボボックスを例に説明します。 [開発]タブをクリックし、[コントロール]グループの[挿入]ボタンをクリックすると、コントロール一覧がメニューとして表示されます([開発]タブが表示されていない場合は連載第1回を参照)。ここから、「ActiveX コントロール」カテゴリにある[コンボ ボックス(ActiveX コントロール)]をクリックします。マウスカーソルの形状が「+」に変わって、好きな位置に好きな大きさのコンボボックスを配置できるようになります(図5)。

  • 図5:コンボボックスを配置する

コンボボックスを配置したら、プロパティを調整します。[開発]タブが表示されている状態で、[デザインモード]をクリックして有効にして、コンボボックスの上で右クリックします。表示されるメニューから[プロパティ]をクリックしてプロパティウィンドウを開き、AutoSizeプロパティをTrueに設定します(図6)。

  • 図6:コンボボックスのプロパティを調整する

同様に、チェックボックスとボタンを配置してください。双方とも、AutoSizeプロパティをTrueに設定し、Captionプロパティをそれぞれ「ふりがなを細かく振る」「ふりがな入力開始」に設定します。ひとまず、ここまでの作業状態を確認しましょう(図7)。

  • 図7:コントロールが配置された

ふりがな入力対象と入力結果を収納する表を作成する

表は、以下の構成とします。とりあえず、10個の文字列にふりがなを振ることにします。

  • No(番号、プログラム上は意味はありません)
  • ふりがな入力対象(被ふりがな文字列)
  • 「ふりがな付き」(ふりがなを<>で囲んで文字列に埋め込んだもの)
  • 「ローマ字付き」(ふりがなのローマ字を<>で囲んで文字列に埋め込んだもの)
  • 「ふりがな埋め込み」(ふりがなをExcelのふりがな機能を使って文字列に付加したもの)

クレジット表記を配置する

ヤフー提供のWebサービスでは、クレジットの表記が義務付けられていますので、適当な形式で表記しましょう。

クレジット表示 - Yahoo!デベロッパーネットワーク
https://developer.yahoo.co.jp/attribution/

今回は、最もシンプルな「(I) プレーンテキスト形式」を使用することにします。

ここまでの作業状態を確認しましょう(図8)。

  • 図8:ワークシートが準備された

ここで、ブックを保存しておきます。ブック名は何でもよいですが、形式を「Excel マクロ有効ブック (*.xlsm)」にしてください。マクロを有効にしておかないと、VBAのスクリプトを実行できないからです。このあとも、適当なタイミングでブックを保存してください。

まとめ

今回は、ヤフー提供のテキスト解析APIの概要と、JSONデータをAPIに引き渡す手順や、JSONデータの見方、ワークシートの基本的な準備について紹介しました。 次回は、今回の続きとして、VBAのスクリプトを中心に紹介していきます。

WINGSプロジェクト 山内直著/山田祥寛監修
<WINGSプロジェクトについて>テクニカル執筆プロジェクト(代表山田祥寛)。海外記事の翻訳から、主にWeb開発分野の書籍・雑誌/Web記事の執筆、講演等を幅広く手がける。一緒に執筆をできる有志を募集中