7.4 POSTへの対応

(1/1)
作文の添削をしている先生のイラスト(女性)
7.2 jQueryによる実装」では、jQuery を使ってパラメータをGET渡しする WebAPI の利用方法を紹介した。今回は、POST渡しする WebAPI の1つ、「gooラボ 形態素解析API」を利用した形態素解析を行ってみる。形態素解析とは、入力された文章を、名詞や動詞、読点、句点などの形態素に分解すことである。

目次

サンプル・プログラム

サンプル・プログラムの実行例

gooラボ 形態素解析API
使用する WebAPI は、入力パラメータをPOSTで渡し、出力結果はJSONで得られる。
WebAPIのURL
URL
https://labs.goo.ne.jp/api/morph

入力パラメータ
フィールド名 要否 内  容
app_id 必須 gooラボのアプリケーションID。無料で入手できる。
sentence 必須 解析する日本語テキスト。読点までの1文。UTF-8エンコード。
request_id 任意 リクエストID。
省略時は”labs.goo.ne.jp[タブ文字]リクエスト受付時刻[タブ文字]連番”となる。
info_filter 任意 形態素情報フィルタ。form(表記)、pos(形態素)、read(読み)のうち、出力する情報を文字列で指定する。
複数指定する場合は、”|”で区切って複数記載する。
省略時は”form|pos|read”を指定したものとみなす。
>pos_filter 任意 形態素品詞フィルタ出力対象とする品詞を”|”で区切って指定する。
省略時は全形態素を出力する。
応答データ構造(json) request_id リクエストID info_filter 形態素情報フィルタ pos_filter 形態素品詞フィルタ word_list 形態素リスト

  16: <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <!-- jQuery -->
  17: <script>
  18: // 初期値 ==================================================================
  19: const TITLE = 'gooラボ 形態素解析API(jQuery版)';    //プログラム・タイトル
  20: const REFERENCE = 'https://www.pahoo.org/e-soul/webtech/js00/js00-07-04.html';
  21:                                             //参照サイト
  22: const WIDTH = 600;                          //表示幅(ピクセル)
  23: 
  24: //gooラボ アプリケーションID
  25: //https://labs.goo.ne.jp/apiregister/ にて登録のこと.
  26: const GOOLABS_APPLICATION_ID = '*****************************************';
  27: 
  28: //デフォルト検索キーワード【変更可】
  29: const DEF_QUERY = '「7.2 jQueryによる実装」では、jQueryを使ってパラメータをGET渡しするWebAPIの利用方法を紹介した。今回は、POST渡しするWebAPIの1つ、「gooラボ 形態素解析API」を利用した形態素解析を行ってみる。形態素解析とは、入力された文章を、名詞や動詞、読点、句点などの形態素に分解すことである。';

jQuery公式サイトからダウンロードしてきてもよいが、ここでは、Google APIs に登録されているものを呼び出す形にした。
定数 GOOLABS_APPLICATION_ID には、gooラボ アプリケーションIDを代入する。gooラボ アプリケーションIDの入手方法は「各種WebAPIの登録方法 - gooラボ」を参照のこと。

解説:Ajax通信

 119: /**
 120:  * 検索ボタン押下処理
 121:  * @param   なし
 122:  * @return  なし
 123: */
 124: function parse() {
 125:     //エラー・クリア
 126:     let errmsg = '';
 127:     $('#error').html(errmsg);
 128: 
 129:     //検索結果クリア
 130:     $('#dest').val('');
 131: 
 132:     //検索キーワード
 133:     let query = $('#query').val();
 134:     //空白除去
 135:     query = query.trim();
 136: 
 137:     //WebAPI呼び出し
 138:     $.ajax({
 139:         url:        'https://labs.goo.ne.jp/api/morph',
 140:         type:       'POST',
 141:         async:      true,       //非同期通信フラグの指定
 142:         timeout:    1000,       //タイムアウト時間(ミリ秒)
 143:         data: {
 144:             app_id:         GOOLABS_APPLICATION_ID,
 145:             sentence:       query,
 146:         },
 147:     })
 148: 
 149:     //WebAPI接続成功
 150:     .done(function (result) {
 151:         console.log(result);
 152:         //応答結果あり
 153:         if (typeof result.word_list !'undefined') {
 154:             //応答結果を解析
 155:             let items = analyze_morpheme(result.word_list);
 156:             //一覧表TABLE作成
 157:             let html = printTable(items);
 158:             //一覧表を画面表示
 159:             $('#plists').html(html);
 160: 
 161:         //応答結果なし
 162:         } else {
 163:             errmsg = '検索キーワードが見つかりません.'
 164:             console.error(errmsg);
 165:             $('#error').html('エラー' + errmsg);
 166:         }
 167:     })
 168: 
 169:     //WebAPI接続失敗
 170:     .fail(function (data) {
 171:         console.error(data);
 172:         errmsg = 'WebAPIに接続できません.'
 173:         console.error(errmsg);
 174:         $('#error').html('エラー' + errmsg);
 175:     });
 176: }

以前作成した wikisearch2 関数と同じく、まずエラーや変換後テキストをクリアしておく。
jQuery のセレクタ typePOST に変更するだけでPOST渡しできるようになる。

応答が得られたら、形態素毎に出現回数をカウントして配列 items に格納するユーザー関数 analyze_morpheme を呼び出す。次に、配列 items の内容をTABLEタグに展開し、画面に表示する。

解説:形態素の解析

  56: /**
  57:  * 形態素の解析
  58:  * @param   Array morphs 形態素
  59:  * @return  Array 解析結果
  60: */
  61: function analyze_morpheme(morphs) {
  62:     //解析結果
  63:     let items = [];
  64: 
  65:     let cnt = 0;
  66:     for (let i0i < morphs.lengthi++) {
  67:         for (let j0j < morphs[i].lengthj++) {
  68:             //新規の形態素かどうか
  69:             let surface = morphs[i][j][0];
  70:             let flag = false;
  71:             let k;
  72:             for (k = 0k < cntk++) {
  73:                 if (items[k].surface == surface) {
  74:                     flag = true;
  75:                     break;
  76:                 }
  77:             }
  78:             //新しい形態素を配列に追加
  79:             if (! flag) {
  80:                 items[cnt] = Object();
  81:                 items[cnt].surface = surface;
  82:                 items[cnt].count   = 1;
  83:                 items[cnt].pos     = morphs[i][j][1];
  84:                 items[cnt].reading = morphs[i][j][2];
  85:                 cnt++;
  86:             //形態素の出現回数+1
  87:             } else {
  88:                 items[k].count++;
  89:             }
  90:         }
  91:     }
  92:     //降順ソート
  93:     items.sort(function(a, b) {
  94:         return b.count - a.count;
  95:     });
  96: 
  97:     return items;
  98: }

ユーザー関数 analyze_morpheme は、WebAPI の応答結果を引数とし、形態素毎に出現回数をカウントして配列 items に格納する。
出現回数の降順にソートするには、メソッド sort を利用した。このように無名関数を渡すことで、連想配列のソートを行うことができる。

解説:解析結果TABLE作成

ユーザー関数 make_table は、配列 items の内容をTABLEタグに展開する。

コラム:日本語形態素解析

読書感想文を書く男の子のイラスト
Googleのような全文検索を行うには、日本語テキストを単語に分解し、それを検索データベースに登録する。この分解処理のために形態素解析プログラムが使われてきた。
古いところでは、KAKASI(KAnji KAna Simple Inverter)がある。1992年、Hironobu Takahashさんが、東北大学(当時)の佐藤雅彦さんによって開発された SKK(Simple Kana Kanji converter)を逆から読んだ「分かち書き」プログラムがベースとなっている。
KAKASI の辞書のエントリのほとんどは SKK 辞書を起源としている。KAKASIはGPLで配付され、多くの人によって改良が進められた。

2000年には、奈良先端科学技術大学院大学松本研究室で ChaSen(茶筌)が開発された。京都大学黒橋・褚・村脇研究室で開発された JUMAN をベースに、統計的な手法を用い、解析速度の向上を目指したプログラムだ。
JUMANは、2016年、ディープラーニング技術を導入した JUMAN++ に進化している。

参考サイト

(この項おわり)
header