それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

日本語(ローマ字)表記をひらがなにする。

日本語(ローマ字)表記をひらがなにしたい

「shatiku → しゃちく」 にしたい

本日の目的 ローマ字で表現された名前を変換したい。

hatarakusaibou のような名前を ’はたらくさいぼう’のようにひらがな表記に変えたい。

ローマ字を'ひらがな'に変換できれば、ひらがなから漢字にできるかもしれない。

ローマ字→ひらがな→漢字 に変換できればいいよね。

力技もある。

tr 使えばできそうよね。正規表現でパターン網羅すれば良いわけですし。

力技で、 'kakikukeko' を 'かきくけこ' に tr すればいいと思ったけども 変換テーブル用意するのも、めんどくさい

調べたら。 romkan という gem があった

使ってみる

bundle add romkan
require 'romkan'
puts "kitakyuushuu".to_kana

実行結果

$ bundle exec ruby sample.rb 
きたきゅうしゅう

お、行けそう。

使うときの注意点

意外と使い所が難しい。

  • waha にする
  • アルファベットの大文字が混じるとおかしくなるので、事前に小文字化しておくと良い
  • 英単語と混じってる場合、スペースなどの区切りで置換対象から除外する。
  • 子音が連続する単語は置換から除外する。

大文字が行頭に混じると困る。例

>> 'Osaka Namba'.to_hepburn.to_kana
=> "Oさか Nあmば"

小文字にするとまだまし

>> 'Osaka Namba'.downcase.to_hepburn.to_kana
=> "おさか なmば"

それでも 難波を Namba と表記されると辛いし、大阪をOsakaと表記されると辛い。

英単語混じりはつらい

たとえば、 Death March からはじまる異世界をローマ字とすると、次のようになる。

>> text = 'Death_March_kara_Hajimaru_Isekai_Kyousoukyoku'
>> puts text.downcase.gsub(/_/,' ').gsub(/ wa /, 'ha').gsub(/\s|_/,'').to_hepburn.to_kana
=> "であthまrchからはじまるいせかいきょうそうきょく"

連続する単語を置換するには厳しそうだ。

子音(小文字)が連続する単語や、末尾が子音で終わる単語を置換対象から外すというヒューリスティックな解決策しかなさそう。

text = 'Death_March_kara_Hajimaru_Isekai_Kyousoukyoku'
puts text = text.downcase.gsub(/_/,' ')
                .gsub(/ wa /, 'ha')
                .split(/\s+/)
                .map{|e| e=e.to_hepburn.to_kana unless  e=~/[^aiueon]$/ ; e   }
                .join(' ')
# => death march から はじまる いせかい きょうそうきょく

こんな感じ??

母音の連続は扱えない

連続する母音は、省略表記されることが多いのだけど、これをうまく扱う方法が思いつかない。

'osaka'.to_kana
#=> "おさか"
>> 'kyushu'.to_kana
=> "きゅしゅ"

なんに使うの?

日本語のローマ字で書かれた、大量のPDFがあったり、HTMLファイルがあったり、テーブル定義があったりします。 読みにくくて仕方がないので、ひらがな・漢字に変換できれば便利になるよね。

参考資料