読者です 読者をやめる 読者になる 読者になる

大学生からの Web 開発

廃れない技術よ 我が身に

日本語の読みがなを返す Gem を作った

Ruby ライブラリ Gem

日本語の読みがなを返す Gem である rubyfuri(ルビふり) を作った。

Yahoo!デベロッパーネットワークテキスト解析:ルビ振り を利用している。

github.com

使い方

YOUR APP IDデベロッパーネットワークで取得できるアプリケーション ID.

rubyfuri = Rubyfuri::Client.new('YOUR APP ID')

rubyfuri.furu('大きな空')
#=> 'おおきなそら'

rubyfuri.furu(['広い', '日光', '時計'])
#=> ['ひろい', 'にっこう', 'とけい']

作った理由

はてなインターンの前半課題に id:SWIMATH2 さんが ルビふりAPI を利用していたのを思い出して、自分も使ってみた。

この API, ただ読みがなを返してくれるわけじゃなくて以下のように形態素っぽい形にして返してくる(形態素ではない)。

<resultset xmlns="urn:yahoo:jp:jlp:FuriganaService" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="urn:yahoo:jp:jlp:FuriganaService http://jlp.yahooapis.jp/FuriganaService/V1/furigana.xsd">
    <result>
        <wordlist>
            <word>
                <surface>
                    青い
                </surface>
                <furigana>
                    あおい
                </furigana>
                <roman>
                    aoi
                </roman>
                <subwordlist>
                    <subword>
                        <surface></surface>
                        <furigana>
                            あお
                        </furigana>
                        <roman>
                            ao
                        </roman>
                    </subword>
                    <subword>
                        <surface></surface>
                        <furigana></furigana>
                        <roman>
                            i
                        </roman>
                    </subword>
                </subwordlist>
            </word>
            <word>
                <surface></surface>
                <furigana>
                    そら
                </furigana>
                <roman>
                    sora
                </roman>
            </word>
        </wordlist>
    </result>
</resultset>

で、パースするのに一手間かかって面倒だったので Gem を作った。

便利なところ

rubyfuri には、実際に API とやり取りするより簡略化されているのともうひとつメリットがある。配列を与えた時、各要素をまとめて一回のリクエストで処理しているため、API 使用回数の節約、また愚直にひとつの文字列につき 1 リクエストを直列に送るよりも高速化される。

学び

ちゃんとテストを書こう、と思って作り始めた Gem なんだけど、このエントリを書いているときにテストあんまり書けてない。

それでも RSpec でいくつかテストを書いての学び。describe 節で対象メソッドを記述して、その下に subject でテストする処理を書く。で、その下に context 節を作ると DRY な感じで良く書ける。

describe '#furu' do
  subject do
    instance.furu(text)
  end
  
  context '文字列が空の場合' do
    let(:text) do
      ''
    end
    
    it '~~~~' do
      # ~~~~
    end
  
  context '配列が与えられた場合' do
    let(:text) do
      ['今日は', '雲が', '青い']
    end

    it '=====' do
      # ============
    end
  end
  end
end

まとめ

API ラッパー作った。

github.com