読み仮名アプリ


先日公開された Yahoo の日本語形態素解析 Web サービスを使って読み仮名振りアプリを作ってみました。手抜きだけどね:)

事前準備として、アプリケーションID登録フォームでアプリケーションIDを取る必要があります。Yahoo のアカウントがあれば、ポチっとその場で取れるので楽。下の読み仮名サービスクラスの appid の --- を取ったIDで置き換えてください。

WinForm なプロジェクトを新規作成して、テキストボックス2つとボタン1つを置きます。ボタンの名前は buttonExec にして、テキストボックスは1,2のままで。テキストボックスは1が入力用、2が変換結果の読み仮名表示用です。デザイナでボタンをダブルクリックして buttonExec_Click を生成しておきます。

フォームのコードはこれだけ。

using System;
using System.Windows.Forms;

namespace Keitaiso
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }

    private void buttonExec_Click( object sender, EventArgs e )
    {
      YomiganaService yomigana = new YomiganaService( this.textBox1.Text );
      this.textBox2.Text = yomigana.Exec();
    }
  }
}

あとは読み仮名サービスクラス。REST は WebClient だけでさらっと書けていいねぇ。POST も書いてみたけどエラーが返ってきてうまく動かなかったので GET のみ公開。

using System;
using System.Text;
using System.Net;
using System.IO;
using System.Xml;

namespace Keitaiso
{
  public class YomiganaService
  {
    // 取得したIDで置き換えてください
    const string appid = "appid=---";

    private string _text;
    public string Text
    {
      get { return this._text; }
    }

    private string _yomigana;
    public string Yomigana
    {
      get { return this._yomigana; }
    }

    public YomiganaService( string text )
    {
      if ( 50 * 1024 <= text.Length )
        throw new ArgumentOutOfRangeException( "text", "長すぎ" );

      this._text = text;
      this._yomigana = "";
    }

    public string Exec()
    {
      using ( WebClient wc = new WebClient() )
      {
        const string serviceUrl = "http://api.jlp.yahoo.co.jp/MAService/V1/parse?";
        const string separator = "&";
        const string results = "results=ma";
        const string maResponse = "ma_response=reading";
        const string maFilter = "ma_filter=1|2|3|4|5|6|7|8|9|10|11|12|13";
        const string request = serviceUrl + appid + separator + results
          + separator + maResponse + separator + maFilter + separator;

        string sentence = "sentence=" + this._text;

        wc.Encoding = Encoding.UTF8;
        string result = wc.DownloadString( request + sentence );
        this._yomigana = Parse( result );
      }
      return this._yomigana;
    }

    private string Parse( string xmlText )
    {
      StringBuilder sb = new StringBuilder();
      using ( StringReader sr = new StringReader( xmlText ) )
      using ( XmlReader reader = XmlReader.Create( sr ) )
      {
        while ( reader.ReadToFollowing( "reading" ) )
        {
          sb.Append( reader.ReadElementString() );
        }
      }
      return sb.ToString();
    }
  }
}

これでできあがり。

MeCab で読み仮名振りをよくやってるんですが、Yahoo も試してみたくて作りました。自分で辞書をいじれないってのはきつい制限だと思うけど、まあ試してみるかと思って。遊んでみてください。

#「十六夜」が「16よる」とか帰ってきたw そんなもんかw