1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Pure Rubyで漢字-->ローマ字(英字)変換(feat. suika, romaji)

Last updated at Posted at 2021-07-06

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を取り入れると、もっと簡単に漢字にローマ字に変換してくれると思います。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?