PHPで文書校正を支援する

(1/1)
Yahoo!JAPANの「校正支援(V2)」は、日本語文書に対して、文字の入力ミスや言葉の誤用がないか、わかりにくい表記や不適切な表現が使われていないかなどをチェックするWebAPIである。

(2021/10/02)現行WebAPIが2022年1月末に終了することから校正支援(V2)に変更。PHP8対応,その他。

目次

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

PHPで文書校正を支援する

サンプル・プログラム

圧縮ファイルの内容
YahooKousei.phpサンプル・プログラム本体

Yahoo!JAPAN 校正支援(V2)

校正支援(V2)は、入力パラメータとしてJSON文字列をPOSTで、User-Agentに Yahoo! JAPAN Webサービス アプリケーションID を指定し、出力結果がJSONで戻るというWebAPIである。
WebAPIのURL
URL
https://jlp.yahooapis.jp/KouseiService/V2/kousei

入力パラメータ
フィールド名 要否 内  容
id 必須 JSON-RPC 2.0のid。値は任意で、指定した値がレスポンスのidに返る。
jsonrpc 必須 "2.0" 固定。
method 必須 "jlp.kouseiservice.kousei" 固定。
params q 必須 校正対象のテキスト。UTF-8エンコード。
応答データ構造(json) id id jsonrpc 2.0 result suggestions word 指摘対象 suggestion 指摘対象の置換先候補(空の場合あり) note 指摘の補足情報(空の場合あり) rule 指摘理由 offset マッチした部分の始まりの位置 length マッチした部分の長さ suggestions word 指摘対象 suggestion 指摘対象の置換先候補(空の場合あり) note 指摘の補足情報(空の場合あり) rule 指摘理由 offset マッチした部分の始まりの位置 length マッチした部分の長さ

解説:テキストを校正する

0193: /**
0194:  * 「Yahoo!JAPAN校正支援Webサービス」を用いてテキストを校正する
0195:  * @param   string $sentence校正するテキスト
0196:  * @param   array  $items    校正結果を格納する配列
0197:  * @return  bool TRUE:成功/FALSE:失敗
0198: */
0199: function getKousei($sentence, &$items) {
0200:     $url = YAHOO_KOUSEI_URL;
0201:     $post = array(
0202:         'id'       => '1234-1',                       //ダミー
0203:         'jsonrpc'  => '2.0',                      //固定値
0204:         'method'   => 'jlp.kouseiservice.kousei', //固定値
0205:         'params'   => array(
0206:             'q' => (string)$sentence               //対象テキスト
0207:         )
0208:     );
0209:     $json = json_encode($post);
0210: 
0211:     //WebAPIにパラメータをPOST渡しする
0212:     $stream = stream_context_create(array('http' => array(
0213:         'header'  => "Content-Type: application/json\r\n" .
0214:                     "User-Agent: Yahoo AppID: " . YAHOO_APPLICATION_ID . "\r\n",
0215:         'method'  => 'POST',
0216:         'content' => $json,
0217:     )));
0218: 
0219:     //WebAPIリクエスト
0220:     $res = file_get_contents($urlFALSE$stream);
0221: 
0222:     if ($res == FALSE) {
0223:         $this->error  = TRUE;
0224:         $this->errmsg = 'WebAPI error: ' . $url;
0225:         return FALSE;
0226:     }
0227: 
0228:     //応答を配列へ代入
0229:     $results = json_decode($res);
0230:     if (! isset($results->result->suggestions))        return FALSE;
0231:     $i = 0;
0232:     foreach ($results->result->suggestions as $suggest) {
0233:         $items[$i]['word'] = isset($suggest->word) ?
0234:             (string)$suggest->word : '';
0235:         $items[$i]['suggestion'] = isset($suggest->suggestion) ?
0236:             (string)$suggest->suggestion : '';
0237:         $items[$i]['note'] = isset($suggest->note) ?
0238:             (string)$suggest->note : '';
0239:         $items[$i]['rule'] = isset($suggest->rule) ?
0240:             (string)$suggest->rule : '';
0241:         $items[$i]['offset'] = isset($suggest->offset) ?
0242:             (int)$suggest->offset : '';
0243:         $items[$i]['length'] = isset($suggest->length) ?
0244:             (int)$suggest->length : '';
0245:         $i++;
0246:     }
0247: 
0248:     return TRUE;
0249: }

WebAPIを呼び出して結果を受け取るのはユーザー関数 getKousei である。結果は配列変数 $items に格納する。

WebAPIに渡すパラメータは  json_encode  関数によってJSON文字列にエンコードする。
User-Agentとして Yahoo! JAPAN Webサービス アプリケーションID を渡すために、 stream_context_create  関数を使ってストリームコンテキストを用意し、 file_get_contents  関数を使って応答JSON文を取得する。

応答JSON文は  json_decode  関数を使って連想配列にデコードし、配列 $items へ格納していく。

解説:校正結果をテキストに反映

0251: /**
0252:  * 校正結果をテキストに反映する
0253:  * @param   string $sentence校正するテキスト
0254:  * @param   array  $items    校正結果を格納した配列
0255:  * @return  string校正結果
0256: */
0257: function setKousei($sentence$items) {
0258:     $outstr = '';
0259:     $pos = 0;
0260: 
0261:     foreach ($items as $val) {
0262:         if ($pos <= $val['offset']) {
0263:             $s = mb_substr($sentence$pos$val['offset'] - $pos);
0264:             $outstr .= $s;
0265:             $s = mb_substr($sentence$val['offset'], $val['length']);
0266:             $outstr .= "<span style=\"color:red;\">{$s}</span>";
0267:             $s = "&nbsp;<span style=\"font-size:70%; color:blue;\">▼{$val['rule']}{$val['note']}";
0268:             if ($val['suggestion'] != '') {
0269:                 $s .= "⇒{$val['suggestion']}";
0270:             }
0271:             $s .= "▼</span>&nbsp;";
0272:             $outstr .= $s;
0273:             $pos = $val['offset'] + $val['length'];
0274:         }
0275:     }
0276: 
0277:     if (mb_strlen($sentence) > $pos) {
0278:         $s = mb_substr($sentence$posmb_strlen($sentence) - $pos);
0279:         $outstr .= $s;
0280:     }
0281: 
0282:     return nl2br($outstr);
0283: }

ユーザー関数 getRuby で得た配列変数 $items をもとに構成結果をHTMLタグに変換して付加するのがユーザー関数 setKousei である。

参考サイト

(この項おわり)
header