なるほど、なるほど。
- using Newtonsoft.Json.Linq;
- using System;
- using System.IO;
- using System.Linq;
- using System.Net;
- using System.Text;
- using System.Web;
- namespace Example
- {
- public static class Ext
- {
- public static string GetResponseFrom(this string url)
- {
- WebRequest req = WebRequest.Create(url);
- using (WebResponse res = req.GetResponse())
- using (Stream stm = res.GetResponseStream())
- using (StreamReader sr = new StreamReader(stm, Encoding.GetEncoding("utf-8")))
- {
- return sr.ReadToEnd();
- }
- }
- public static string GetForConvWithGoogleTransliterate(this string hiragana)
- {
- StringBuilder url = new StringBuilder("http://www.google.com/transliterate?langpair=ja-Hira|ja&text=");
- url.Append(HttpUtility.UrlEncode(hiragana));
- return url.ToString().GetResponseFrom();
- }
- public static T SelectOneOf<T>(this T[] array)
- {
- for (int i = 0; i < array.Length; i++)
- {
- Console.WriteLine("{0} {1}", i + 1, array[i]);
- }
- int n;
- do
- {
- Console.Write("Select Number> ");
- Int32.TryParse(Console.ReadLine(), out n);
- }
- while (n < 1 || n > array.Length);
- return array[n - 1];
- }
- public static string ToKanji(this string hiragana)
- {
- StringBuilder kanji = new StringBuilder();
- JArray jar = JArray.Parse(hiragana.GetForConvWithGoogleTransliterate());
- foreach (JToken jt in jar)
- {
- var convArray = jt[1].ToArray();
- Console.WriteLine("{0}: {1} for conversion", jt[0], convArray.Length);
- kanji.Append((string)convArray.SelectOneOf());
- }
- return kanji.ToString();
- }
- }
- public class Program
- {
- public static void Main(string[] args)
- {
- Console.Write("Input Hiragana> ");
- Console.WriteLine(Console.ReadLine().ToKanji());
- }
- }
- }
- /*
- * Build:
- *
- * gmcs -r:Newtonsoft.Json.dll,System.Web.dll jinput.cs
- *
- * Run:
- *
- * mono jinput.exe
- *
- */
$ mono jinput.exe Input Hiragana> きみはじつにばかだな "きみは": 5 for conversion 1 "君は" 2 "きみは" 3 "キミは" 4 "黄身は" 5 "王は" Select Number> 1 "じつに": 5 for conversion 1 "実に" 2 "じつに" 3 "実二" 4 "拾に" 5 "ジツに" Select Number> 1 "ばかだな": 5 for conversion 1 "ばかだな" 2 "馬鹿だな" 3 "バカだな" 4 "バカ田な" 5 "ばかだな" Select Number> 2 君は実に馬鹿だな
変換候補は五つで Max のようです。
以下、解説。
事前準備
Json.NET を使用しているので、その導入を行います。ダウンロードした Json35r8.zip の「展開先/Bin/DotNet/Newtonsoft.Json.dll」を GAC に登録します。
$ sudo gacutil -i Newtonsoft.Json.dll -package 2.0 Package exported to: /usr/lib/mono/2.0/Newtonsoft.Json.dll -> ../gac/Newtonsoft.Json/3.5.0.0__30ad4fe6b2a6aeed/Newtonsoft.Json.dll Installed Newtonsoft.Json.dll into the gac (/usr/lib/mono/gac)
-package 2.0 としたのは、ビルド時に参照指定する際、アセンブリファイル名だけで済ますためです。
$ gmcs -r:Newtonsoft.Json.dll,System.Web.dll jinput.cs
どんなデータが返ってくるの?
まず、こんなデータが返ってきます。- [
- [
- "\u304D\u307F\u306F",
- [
- "\u541B\u306F","\u304D\u307F\u306F","\u30AD\u30DF\u306F","\u9EC4\u8EAB\u306F","\u738B\u306F",
- ],
- ],
- [
- "\u3058\u3064\u306B",
- [
- "\u5B9F\u306B","\u3058\u3064\u306B","\u5B9F\u4E8C","\u62FE\u306B","\u30B8\u30C4\u306B",
- ],
- ],
- [
- "\u3070\u304B\u3060\u306A",
- [
- "\u3070\u304B\u3060\u306A","\u99AC\u9E7F\u3060\u306A","\u30D0\u30AB\u3060\u306A","\u30D0\u30AB\u7530\u306A","\u3070\u304B\u3060\u306A",
- ],
- ],
- ]
Before:
- string jsonArray = url.ToString().GetResponseFrom().Replace(@"\", "%");
- return HttpUtility.UrlDecode(jsonArray);
After:
- return url.ToString().GetResponseFrom();
になります。
以下は、デコード済みのイメージということで・・・。
- [
- [
- "きみは",
- [
- "君は","きみは","キミは","黄身は","王は",
- ],
- ],
- [
- "じつに",
- [
- "実に","じつに","実二","拾に","ジツに",
- ],
- ],
- [
- "ばかだな",
- [
- "ばかだな","馬鹿だな","バカだな","バカ田な","ばかだな",
- ],
- ],
- ]
Json.NET を使う
JSON 形式の配列を、Json.NET から提供される JArray オブジェクトに変換します。- JArray jar = JArray.Parse(hiragana.GetForConvWithGoogleTransliterate());
このオブジェクトを ToString() で確認してみると、
- [
- [
- "きみは",
- [
- "君は",
- "きみは",
- "キミは",
- "黄身は",
- "王は"
- ]
- ],
- [
- "じつに",
- [
- "実に",
- "じつに",
- "実二",
- "拾に",
- "ジツに"
- ]
- ],
- [
- "ばかだな",
- [
- "ばかだな",
- "馬鹿だな",
- "バカだな",
- "バカ田な",
- "ばかだな"
- ]
- ]
- ]
おおお、インデンドされて、分かりやすくなりました。
上記の例だと、「きみはじつにばかだな」が「きみは」「じつに」「ばかだな」の3文節に分かれて、それぞれが JToken オブジェクトとして扱えます。
それぞれの JToken オブジェクト(トークン)は、もとの文字列を保持するトークン、変換候補を保持するトークンで構成され、さらに変換候補保持トークンの中は、変換候補一個一個のトークンという構成になります。
- foreach (JToken jt in jar)
- {
- var convArray = jt[1].ToArray();
- Console.WriteLine("{0}: {1} for conversion", jt[0], convArray.Length);
- kanji.Append((string)convArray.SelectOneOf());
- }
所感
実際の使い所はどの辺になるのでしょうか?2012.06.19 追記:
少し改修して、GitHub に上げてみました。
4 件のコメント:
追加:
public static string GetResponseFrom(this string url)
変更:
Before: public static T SelectOne<T>(this T[] array)
After: public static T SelectOneOf<T>(this T[] array)
に伴う修正を行ないました。
返ってきた JSON 形式データへのデコードに関する記述を修正しました。
Before:
public static string GetResponseFromGoogleTransliterate(this string hiragana)
public static string TranslateHira(this string hiragana)
After:
public static string GetForConvWithGoogleTransliterate(this string hiragana)
public static string ToKanji(this string hiragana)
に伴う変更を行ないました。
GitHub に上げたことを追記しました。
コメントを投稿