RubyやRailsで独立に使える漢字をローマ字に変換する方法
1. 序論
Rubyで漢字を、カナやひらを経って、ローマ字に変換するGemは、kakasi, miyabi, zipang, nattoのようにすでにいくつかあります。
しかし、これらは、古くて最新Ruby Ver.3でバグったり、CやJavaのような外部ライブラリを用いるのでインストールが面倒だったり、httpリクエスト通信するので遅かったりする問題があります。
そこで、最近Suikaという形態素解析器Gemを見つけました。
Suikaは漢字をカナに変換できるので、romaji Gemと合わせて、漢字をローマ字に変換する方法を思いついたので、共有を兼ねてメモします。
テスト環境:
ruby --version
# ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-linux]
2. Gem紹介
2.1 Suika (last updated at 2021)
本家のブログ-->https://yoshoku.hatenablog.com/entry/2020/07/05/090000
Github-->https://github.com/yoshoku/suika
用途:漢字-->カナ
なぜか食べ物の名前をしているこのGemは、日本語の形態素解析器です。
Pure Rubyなので、外部ライブラリが必要なく、インストールが簡単です。
なお、Suika単体ではローマ字に変換はできないので、後にromaji Gemと合わせて使います。
2.1.1 インストール方法:
gem install suika
2.1.2 使用方法:
require 'suika'
tagger = Suika::Tagger.new
tagger.parse('すもももももももものうち').each { |token| puts token }
# すもも 名詞,一般,*,*,*,*,すもも,スモモ,スモモ
# も 助詞,係助詞,*,*,*,*,も,モ,モ
# もも 名詞,一般,*,*,*,*,もも,モモ,モモ
# も 助詞,係助詞,*,*,*,*,も,モ,モ
# もも 名詞,一般,*,*,*,*,もも,モモ,モモ
# の 助詞,連体化,*,*,*,*,の,ノ,ノ
# うち 名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
2.2 romaji (last updated at 2017)
Github-->https://github.com/makimoto/romaji
用途:カナ/ひら-->Romaji
割と認知度の高いGemで、漢字からの変換はできないけれど、かなやひらをローマ字に変換してくれます。
2.2.1 インストール方法:
gem install romaji
2.2.2 使用方法:
require "romaji"
Romaji.kana2romaji "スシ" #=> "sushi"
Romaji.romaji2kana "sushi" #=> "スシ"
Romaji.romaji2kana "sushi", :kana_type => :hiragana #=> "すし"
3. Suika X romajiサンプルコード
この二つを合わせて、漢字-->Romaji変換スクリプトを書きます。
例)
require 'suika'
require "romaji"
$tagger = Suika::Tagger.new # Slow why?
def kanji_to_romaji(word)
kana_arr = $tagger.parse(word).map{ |w|
if w.split(',')[-1] != '*'
w.split(',')[-1] # Get last kana
else
w.split("\t")[0] # Get original
end
}
romaji = kana_arr.map{ |k| Romaji.kana2romaji(k) }.join()
return romaji
end
kanji_to_romaji('Suikaは、まだ、遊んでみるには良いけど、使ってはいけない。')
# "suikawa、mada、asondemiruniwayoikedo、tsukaxtsutewaikenai。"
kanji_to_romaji('湯川 秀樹は、日本の理論物理学者。')
# "yukawa hidekiwa、nipponnorironbutsurigakusha。"
4. 今後
上記例文で、if...else...
は、単語帳にない名詞などのカナが'*'になる問題があるので入れました。これはSuikaの機能が増えるとよりスッキリなると思います。
また、Suikaでromajiを取り入れると、もっと簡単に漢字にローマ字に変換してくれると思います。