Ruby で ATOK の辞書を Google IME の辞書に変換してみた を書いてみた

diveintounlimit さんの ATOK→GoogleIME用の辞書変換ツールを作ってみたよ! みて、やってみた。
CUI だけどね。

全ソースはこちら:

# encoding: shift_jis

Encoding.default_internal   = Encoding::Shift_JIS
Encoding.default_external   = Encoding::Shift_JIS

if ARGV.length > 0 then
  # ATOK なテーブル。
  replaced_targets = [ '名詞',         '単漢字',       '顔文字',       '固有一般',     '固有商品',
                       '固有人他',     '固有人姓',     '固有人名',     '固有組織',     '固有地名', 
                       '名詞サ変',     '名詞ザ変',     '名詞形動',     '名サ形動',     '数詞',
                       '副詞',         '連体詞',       '接続詞',       '感動詞',       '独立詞', 
                       '接頭詞',       '助数詞',       '冠数詞',       '接尾語',       'ワ行五段',
                       'ワ行五段音便', 'カ行五段',     'カ行上二段',   'カ変動詞',     'サ行五段', 
                       'サ変動詞',     'ザ変動詞',     'タ行五段',     'タ行上二段',   'ナ行五段',
                       'ナ変動詞',     'マ行五段',     'マ行上二段',   'ラ行上二段',   'ラ行五段', 
                       'ラ行上二段',   'ラ変動詞',     'ガ行五段',     'ガ行上二段',   'ハ行上二段',
                       'バ行五段',     'バ行上二段',   'ハ行四段',     '一段動詞',     '形容詞', 
                       '形容詞ウ',     '形容動詞',     '形動タリ',     '終助詞',       '形容詞イ',
                       '形容詞エ',     '接頭語'
                     ]
  # Google IME なテーブル。
  replaced_afters  = [ '名詞',         '名詞',         '名詞',         '固有名詞',     '固有名詞',
                       '人名',         '',           '',           '組織',         '地名',
                       '名詞サ変',     '名詞サ変',     '名詞形動',     '名詞形動',     '',
                       '副詞',         '連体詞',       '接続詞',       '感動詞',       '感動詞',
                       '接頭詞',       '助数詞',       '助数詞',       '接尾一般',     '動詞ワ行五段',
                       '動詞ワ行五段', '動詞カ行五段', '動詞カ行五段', '動詞カ行五段', '動詞サ行五段',
                       '動詞サ行五段', '動詞サ行五段', '動詞タ行五段', '動詞タ行五段', '動詞ナ行五段',
                       '動詞ナ行五段', '動詞マ行五段', '動詞マ行五段', '動詞ラ行五段', '動詞ラ行五段',
                       '動詞ラ行五段', '動詞ラ行五段', '動詞ガ行五段', '動詞ガ行五段', '動詞バ行五段',
                       '動詞バ行五段', '動詞バ行五段', '動詞バ行五段', '動詞一段',     '形容詞',
                       '形容詞',       '形容詞',       '形容詞',       '形容詞',       '形容詞',
                       '形容詞',       '名詞'
                     ]

  # 2 つの配列をミックスしてハッシュを作成します。
  replaced_book = Hash( *replaced_targets.zip( replaced_afters ).flatten )

  File.open(ARGV[1], "w") do |input|
    # 指定されたファイル(ATOK の辞書のダンプ)を読み込みます。
    File.open(ARGV[0], "r") do |output|
      output.each_line do |line|
        line.chomp!

        if line =~ /^!!/ then
          # コメント。
        elsif line =~ /[$*]$/ then
          # 末尾に '$' か '*' があったら、取り除きます。
          line.gsub!( /[$*]$/, "" )

          replaced_book.each do |key, value|
            # ATOK 側配列の要素を正規表現にします。
            re = Regexp.compile( key )
            if line =~ re then
              line.gsub!( re, value )
              break
            end
          end
          input.puts line
        end

      end

    end
  end
else
  puts "ひきすーちょーだいっ"
end

使い方

$ ruby atok2gime.rb <変換したい ATOK の辞書> <Google IME の辞書の名前>

ちょっとした───全然要らない───解説

ここでちょっとした解説をば。

ATOK なテーブル。

そのまんま。

Google IME なテーブル。

これもそのまんま。

2 つの配列をミックスしてハッシュを作成します。

ねえ、気付いた?
前、ソースだけ晒してたときは、 for をブン回してガリガリハッシュを作ってたけど、今は、なんか呪文を使ってる。

[:A, :B, :C].zip([123, 456, 789])
=> [ [:A, 123], [:B, 456], [:C, 789] ]

Array#zip は、レシーバと受け取った配列をペアにして返してくれるんだ。
それでね、そのままではハッシュは食べてくれない。
入れ子にした配列をぶっつぶして、平らにしたいよね。
こういうときは、 Array#flatten が役に立ってくれるよ。
配列をそのまんま一つの引数に渡したいときは、`*' を頭につけるといいよっ。

指定されたファイル(ATOK の辞書のダンプ)を読み込みます。

File.open は入れ子にしても、別に問題ないよ〜。

末尾に '$' か '*' があったら、取り除きます。

メソッドの末尾に、! がついてるよね。
これは、破壊的メソッドを表してるんだ。
付いてないメソッドは、レシーバを変更せずに、新しいオブジェクトを返すだけなんだけどね、
破壊的メソッドはレシーバを変更するよ。

ATOK 側配列の要素を正規表現にします。

それで、置換するってわけ。
ぜーんぶ終わったら、ファイルにカキコするよ〜。