FC2ブログ

記事一覧

漢字のふりがなを取得する方法 -Yahoo REST API- | Xamarin.Forms

 
今回はXamarin.Formsで漢字交じりの文字列からふりがなを取得する方法についてご紹介いたします。AndroidとiOSで共通して使用ができます。
尚、ふりがなの取得にはYahoo APIを今回採用しました。

WindowsではWindows.Globalization.JapanesePhoneticAnalyzerで取得可能ですが、当然プラットフォームが異なるので使用できません。

Androidではkuromoji/jakaroma/Kakasi などのJavaソースが公開されており、BindingLibraryを作成してjarファイルをXamarin上で動作することができますが、jarファイルの容量が11MBを超えている為、アプリにそのサイズは厳しいという事で、断念しました。

iOSではCoreFoundationに相当のクラスが用意されているようですが、Xamarinのクラスライブラリ内に見つかりません。

それに比べてAPIであればRESTで呼び出して使用するだけなので、プログラムを100%PCLのみで共通化でき、軽量・メンテナンスフリーであることがメリットだと思います。(それにヤフー程の規模の企業は簡単には潰れないでしょう。。。)





前提条件
・Windows10 Pro 64Bit
・Visual Studio 2015 Community Update3
・Xamarin 4.3.0.795 (NuGet Xamarin.Forms 2.3.4.247)
・macOS Sierra 10.12.4 / Xcode8.3.1 / Xamarin.iOS 10.6.0.10



1.Yahooの登録

(1)以下のURLでYahooIDと紐づけを行います。(YahooIDが無い方はYahooJapanのサイトで作成してください。)
https://developer.yahoo.co.jp/

xamarin_yahoo_api_furigana_01.png


(2)アプリを登録します。クライアントサイドで作成します。
https://e.developer.yahoo.co.jp/register

xamarin_yahoo_api_furigana_02.png


(3)ルビ振りAPIの概要を確認します。
https://developer.yahoo.co.jp/webapi/jlp/furigana/v1/furigana.html
基本的にはURLにGETを投げてリターンのXMLを取得するだけです。

URLパラメータは3種類。
appid:アプリケーションID。「アプリケーションの管理」→アプリケーション情報にあるClientIDです。
sentence:ふりがなに変換したい文字列(必ずURLエンコードして渡してください)
grade:指定しないほうが良いです。grade=8に設定するとふりがなが取得できません。

尚、念のため制限事項があるようですのでお伝えしておきます。
・アプリケーションID毎に50000件のリクエストが上限となっています。
・1リクエストの最大サイズを100KBに制限されています。

私の印象としては、かなり良心的な設定で特に気にしないで良いかなって感じです。
1リクエストの最大サイズは全て2バイト文字だとして、100KB×1000B÷2B=50000字までです。小説でない限りは超えそうにないですし、アプリケーションID毎の上限もアプリの利用者数に応じてYahooIDを増やしてしまえばどうとでもなりそうかなって思っています。



2.結果をXMLで確認

取得したアプリケーションID(ClientID)と変換したい文字列をURLに組み込んでみます。
https://jlp.yahooapis.jp/FuriganaService/V1/furigana?appid=アプリケーションID&sentence=%E5%B1%B1%E7%94%B0%E8%8A%B1%E5%AD%90
このようなURLをブラウザに貼り付けると、返ってきたデータは以下のようなXML形式となっていました。

<ResultSet xmlns="urn:yahoo:jp:jlp:FuriganaService" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:yahoo:jp:jlp:FuriganaService https://jlp.yahooapis.jp/FuriganaService/V1/furigana.xsd">
<Result>
<WordList>
<Word>
<Surface>山田</Surface>
<Furigana>やまだ</Furigana>
<Roman>yamada</Roman>
</Word>
<Word>
<Surface>太郎</Surface>
<Furigana>たろう</Furigana>
<Roman>tarou</Roman>
</Word>
</WordList>
</Result>
</ResultSet>

結果を確認するとローマ字にも変換が可能ですね。



3.PCLの実装方法

以下のファイルをPCLに実装します。
HttpWebRequestで変換のURLを送信し、XMLを受信します。
次にXMLのFuriganaフィールドに入っているデータを連結してふりがなを完成させます。

YahooAPI.cs
using System.Threading.Tasks;
using System.Xml;
using System.IO;
using System.Net;
public static class YahooAPI
{
    private const string FuriganaUrl = "https://jlp.yahooapis.jp/FuriganaService/V1/furigana";
       
    public static async Task<string> GetPhonetic(string accountId, string kanji)
    {
        string result = String.Empty;
        try
        {
            //HttpWebRequestを用いた接続例
            var request = HttpWebRequest.Create(FuriganaUrl + "?appid=" + accountId + "&sentence=" + System.Net.WebUtility.UrlEncode(kanji)) as HttpWebRequest;
            request.Method = "GET";
            request.Accept = "*/*";
            using (HttpWebResponse response = await request.GetResponseAsync() as HttpWebResponse)
            {
                Stream stream = response.GetResponseStream();
                using (StreamReader reader = new StreamReader(stream, System.Text.Encoding.UTF8))
                {
                    result = reader.ReadToEnd();
                }
            }

            //取得したXMLファイルからふりがなのフィールドを抜き出して連結する
            string furigana = await Task.Run(() =>
            {
                //XMLをLinqで取得する方法
                //var doc = XDocument.Parse(result);
                //IEnumerable<string> furiganaList = from w in doc.Descendants("Word")
                //                                   select w.Attribute("Furigana").Value;
                //XMLから取得できたふりがなリストの文字列を連結する
                //return String.Join("", furiganaList);

                //Linqでうまく取得できないため
                //XmlReaderでループして読み取る
                string ret = String.Empty;
                using (XmlReader reader = XmlReader.Create(new StringReader(result)))
                {
                    while (reader.Read())
                    {
                        switch (reader.NodeType)
                        {
                            case XmlNodeType.Element:
                                if (reader.Name == "Furigana" &&
                                    reader.Read() && //進む
                                    reader.HasValue)
                                {
                                    ret += reader.Value;
                                }
                                break;
                        }
                    }
                }
                return ret;
            });
               
            return furigana;
        }
        catch (System.Net.Http.HttpRequestException hre)
        {
            System.Diagnostics.Debug.WriteLine(hre.Message + System.Environment.NewLine + hre.StackTrace);
            return String.Empty;
        }
        catch (Exception ex)
        {
            System.Diagnostics.Debug.WriteLine(ex.Message + System.Environment.NewLine + ex.StackTrace);
            return String.Empty;
        }
    }
}

XMLのデータはLinqで絞り込み&取得できるはずなんですが、私の知識不足の為、Xamarinで動作させると正しく取得ができませんでした。よってXmlReaderで取得しています。ご了承くださいませ。



4.使用方法

フリガナを取得したいEntryオブジェクトの Completed イベントまたは Unfocused イベントでYahooにリクエストします。

RegisterCustomerPage.xaml.cs
this.txtFirstName.Completed += (async (s, e) =>
{
    this.txtFirstNameKana.Text = await YahooAPI.GetPhonetic("YahooAppId", this.txtFirstName.Text);
});
this.txtLastName.Completed += (async (s, e) =>
{
    this.txtLastNameKana.Text = await YahooAPI.GetPhonetic("YahooAppId", this.txtLastName.Text);
});

ちなみに、今回は全角ひらがなに変換していますが、カタカナに変換したい場合は以下の力技ライブラリを用いると良いでしょう。
http://wiki.dobon.net/index.php?free%2FkanaxsCSharp




最後までお読みいただきありがとうございます。
当ブログの内容をまとめた Xamarin逆引きメニュー は以下のURLからご覧になれます。
http://itblogdsi.blog.fc2.com/blog-entry-81.html


関連記事

コメント

コメントの投稿

カテゴリ別記事一覧

広告

プロフィール

石河 純


著者名 :石河 純
自己紹介:素人上がりのIT技術者。趣味は卓球・車・ボウリング

IT関連の知識はざっくりとこんな感じです。
【OS関連】
WindowsServer: 2012/2008R2/2003/2000/NT4
Windows: 10/8/7/XP/2000/me/NT4/98
Linux: CentOS RedHatLinux9
Mac: macOS Sierra 10.12 / OSX Lion 10.7.5 / OSX Snow Leopard 10.6.8
【言語・データベース】
VB.net ASP.NET C#.net Java VBA
Xamarin.Forms
Oracle10g SQLServer2008R2 SQLAnywhere8/11/16
ActiveReport CrystalReport ReportNet(IBM)
【ネットワーク関連】
CCNP シスコ技術者認定
Cisco Catalyst シリーズ
Yamaha RTXシリーズ
FireWall関連
【WEB関連】
SEO SEM CSS IIS6/7 apache2

休みの日は卓球をやっています。
現在、卓球用品通販ショップは休業中です。