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 は入れ子にしても、別に問題ないよ〜。
末尾に '$' か '*' があったら、取り除きます。
メソッドの末尾に、! がついてるよね。
これは、破壊的メソッドを表してるんだ。
付いてないメソッドは、レシーバを変更せずに、新しいオブジェクトを返すだけなんだけどね、
破壊的メソッドはレシーバを変更するよ。