[Java+jsoup]Yahoo!JAPAN Web APIを利用して日本語文章校正ツールを作ってみる

webtool

文章を書くのが苦手な僕ですが、何故かブログを書いています。
まー好き勝手な事を適当に書くだけなので問題無いっちゃ無いんですが、書いた文章を校正してくれるツールでもあれば便利なのになと思い、軽く調べてみたところ、Yahoo!JAPANが提供しているWeb APIに文章校正支援APIが有るのを発見しました。

このAPIは、文字の入力ミスや言葉の誤用がないか、わかりにくい表記や不適切な表現が使われていないかなどをチェックしてくれるようです。

という訳で、今回はこのAPIを使ってツールを作ってみます。

まずはYahooアカウントでログインしている事を確認し、デベロッパーネットワークから新しいアプリケーションを登録します。

サーバ上で動かすツールを作るので、Web APIを利用する場所はサーバーサイドを選択しました。
アプリケーション名はとりあえず”日本語文章校正支援ツール”とし、サイトURLはツール公開用に作ったサイトのURL(http://tadegg.net/)としました。
利用するスコープは、オークション関連や質問、回答投稿関連の機能は利用しないのでデフォルト(未チェック)のままとし、登録。

registComplete

登録が完了するとアプリケーションIDとシークレットコードが払い出されました。
APIを使用するにはこのIDが必要ですので保存しておきます。

校正支援API(校正支援API)の使い方としては、
規定のURL(http://jlp.yahooapis.jp/KouseiService/V1/kousei)に対してHTTPのGETまたはPOSTリクエストを発行し、レスポンスで校正ワードが返ってきますので、それをパースする必要があります。

GETリクエストで利用する場合は下記のようなリクエストになります。
GET例)http://jlp.yahooapis.jp/KouseiService/V1/kousei?appid=<あなたのアプリケーションID>&sentence=%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%81%AE%E6%96%87%E7%AB%A0%E3%81%A7%E3%81%99%E3%80%82
必須パラメータの”appid”には、先ほどアプリケーション登録時に発行されたIDを設定し、”sentence”パラメータに校正対象の日本語文字列をURLエンコーディングして設定します。

GETでは校正対象の文章が長文だった場合に桁数オーバーして対応できませんので封印し、POSTを利用します。

POSTの場合もGET同様、パラメータ”appid”にアプリケーションIDを設定し、”sentence”に文章を設定して送信すれば良いだけですのでお手軽ですね。
ちなみに校正オプション設定として指摘グループが3種類、指摘詳細項目が17種類あり、それぞれチェック対象/対象外の設定が出来ます。

指摘グループは”filter_group”パラメータに設定し、未指定の場合は全てチェック対象となります。
チェック対象を絞りたい場合は、下記1~3をカンマ区切りで設定します。

1: 表記・表現の間違いや不適切な表現に関する指摘
2: わかりやすい表記にするための指摘
3: 文章をよりよくするための指摘

指摘詳細項目は”no_filter”パラメータに設定し、未指定の場合は全てチェック対象となります。
こちらはパラメータに設定した番号をチェック対象から外すようになっています。

1: 誤変換  例:人事異同→人事異動
2: 誤用  例:煙に巻く→けむに巻く
3: 使用注意  例:外人墓地→外国人墓地
4: 不快語  例:がんをつける→にらむ
5: 機種依存または拡張文字(EUC表示不可の場合も指摘されます) 例:○付き数字、一部の旧字体など
6: 外国地名  例:モルジブ→モルディブ
7: 固有名詞  例:ヤフーブログ→Yahoo!ブログ
8: 人名  例:ベートーヴェン→ベートーベン
9: ら抜き  例:食べれる→食べられる
10: 当て字  例:出鱈目、振り仮名
11: 表外漢字あり  例:灯籠→灯●
12: 用字  例:曖昧→あいまい
13: 用語言い換え(商標など)  例:セロテープ→セロハンテープ
14: 二重否定  例:聞かなくはない 
15: 助詞不足の可能性あり  例:学校行く
16: 冗長表現  例:ことができます
17: 略語  例:ADSL→非対称デジタル加入者線(ADSL)

使用方法が大体分かったところで、テストプログラムを書いて動かしてみましょう。
使用言語はJavaで、HTMLパーサーとしてjsoupを使用します。

	public static void main(String[] args) throws IOException {
		Document doc = null;
		try {
			String sentence = "遙か彼方に小形飛行機が見える。";
			
			Map<String,String> param = new HashMap<String,String>();
			param.put("appid", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-");
			param.put("sentence", sentence);
			
			/* filter_group
			 * 指摘グループの番号をコンマで区切って指定します。
				1: 表記・表現の間違いや不適切な表現に関する指摘
				  -誤変換、誤用、使用注意語、不快語(使用不適切な語や隠語など)、
				  機種依存文字または拡張文字、外国地名、固有名詞、人名、ら抜き言
				  葉 が指摘されます。
				2: わかりやすい表記にするための指摘
				  -当て字、表外漢字、用字(※) が指摘されます。
				  ※日本新聞協会「新聞用語集」、共同通信社「記者ハンドブック」を
				  主な参考としています。
				3: 文章をよりよくするための指摘
				  -用語言い換え、二重否定、助詞不足の可能性あり、冗長表現、
				  略語 が指摘されます。
				無指定の場合は、すべての指摘を返します。
			 */
			param.put("filter_group", "");
			
			/* no_filter
			 * filter_groupで指定した指摘グループから除外する指摘を指定します。
				指摘番号をコンマで区切って指定します。
				1: 誤変換  例:人事異同→人事異動
				2: 誤用  例:煙に巻く→けむに巻く
				3: 使用注意  例:外人墓地→外国人墓地
				4: 不快語  例:がんをつける→にらむ
				5: 機種依存または拡張文字(EUC表示不可の場合も指摘されます) 例:○付き数字、一部の旧字体など
				6: 外国地名  例:モルジブ→モルディブ
				7: 固有名詞  例:ヤフーブログ→Yahoo!ブログ
				8: 人名  例:ベートーヴェン→ベートーベン
				9: ら抜き  例:食べれる→食べられる
				10: 当て字  例:出鱈目、振り仮名
				11: 表外漢字あり  例:灯籠→灯●
				12: 用字  例:曖昧→あいまい
				13: 用語言い換え(商標など)  例:セロテープ→セロハンテープ
				14: 二重否定  例:聞かなくはない 
				15: 助詞不足の可能性あり  例:学校行く
				16: 冗長表現  例:ことができます
				17: 略語  例:ADSL→非対称デジタル加入者線(ADSL)
			 */
			param.put("no_filter", "");
			
			doc = Jsoup.connect("http://jlp.yahooapis.jp/KouseiService/V1/kousei")
					  .data(param)
					  .timeout(5000)
					  .post();
		} catch (IOException e) {
			e.printStackTrace(System.err);
			return;
		}
		System.out.println(doc);
	}

こんな感じで動かした結果、「遙か彼方に小形飛行機が見える。」という文章の指摘として

<!--?xml version="1.0" encoding="UTF-8"?-->
<html>
 <head></head>
 <body>
  <resultset xmlns="urn:yahoo:jp:jlp:KouseiService" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="urn:yahoo:jp:jlp:KouseiService http://jlp.yahooapis.jp/KouseiService/V1/kousei.xsd"> 
   <result> 
    <startpos>
     0
    </startpos> 
    <length>
     2
    </length> 
    <surface>
     遙か
    </surface> 
    <shitekiword>
     ●か
    </shitekiword> 
    <shitekiinfo>
     表外漢字あり
    </shitekiinfo> 
   </result> 
   <result> 
    <startpos>
     2
    </startpos> 
    <length>
     2
    </length> 
    <surface>
     彼方
    </surface> 
    <shitekiword>
     彼方(かなた)
    </shitekiword> 
    <shitekiinfo>
     用字
    </shitekiinfo> 
   </result> 
   <result> 
    <startpos>
     5
    </startpos> 
    <length>
     5
    </length> 
    <surface>
     小形飛行機
    </surface> 
    <shitekiword>
     小型飛行機
    </shitekiword> 
    <shitekiinfo>
     誤変換
    </shitekiinfo> 
   </result> 
  </resultset> 
 </body>
</html>

というレスポンスが返ってきました。
各フィールドの仕様は以下です。

フィールド	説明
ResultSet	校正結果のすべてを含みます。
Result		指摘を返します。
StartPos	対象文字列開始位置(先頭からの文字数)。
Length		対象文字列長(対象文字数)。
Surface		対象表記。
ShitekiWord	言い換え候補文字列。複数の候補が返される際には、間に読点がはさまれます。
ShitekiInfo	指摘の詳細情報。リクエストパラメータ no_filterの説明で挙げた指摘内容のうち、どれか1つを表示します。

指摘の語句ごとにがあり、その中で対象表記、言い換え候補、指摘の詳細情報があります。とりあえず必要なのはこれだけでしょう。
“小形飛行機”というsurfaceに対して、誤変換というshitekiinfoがあり、言い換え候補として”小型飛行機”という指摘などが含まれています。

以上、簡単に使えますね。

ちなみに、このレスポンスをパースし、指摘項目の設定や文章修正機能なども組み込んだWebツールとして日本語文章校正,校閲,添削支援ツールを公開してみましたので使ってみてください。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>