Hatena::Grouprubyist

Rubyで遊ぶよ

 | 

2009-07-01

JSMigemoの辞書XMLをJSONっぽい形式にしてみる

16:59

JSMigemo の辞書ファイルは、40個以上の XML である。一度にダウンロードするファイルを小さくする工夫だと思うのだけど、ちょっと扱いにくい感がある。

それを、こんなふうな JSON っぽい形式にしてみた。

var migemoDict = {
 "あ" : [
  ["あ", ["浴"]],
  ["あ", ["合", "会", "逢"]],
  ["あ", ["挙", "揚", "上"]],
  ["あ", ["阿", "娃", "唖", "亜"]],
  ["あ", ["合", "会"]],
  ["あ", ["遭", "合", "逢", "会"]],
  ["あ", ["当", "有", "合", "会", "蓬", "充"]],
  ["あ", ["合", "会", "空", "開"]],
  ["あ", ["有", "在", "荒"]],
  ["あ", ["会", "合"]],
  ["あ", ["編"]],
  ["あ", ["飽", "開", "明", "空"]],
  ["あ", ["悪"]],

などなど (完全なファイル)。ちゃんとした JSON なら UTF-8 文字はエスケープしないといけないが、そうするとサイズが1.5倍になるので。

こんな感じのスクリプトで。

#!/usr/local/ruby1.9/bin/ruby
# -*- coding: utf-8 -*-
Encoding.default_external = "utf-8"

dict = []
Dir.new('.').each{|file|
  if file =~ /^dict\d\d\.xml$/
    open(file){|f|
      while line = f.gets
        next if line =~ /^</
        tmp = line.strip.split(/\t/)
        key = tmp.shift
        values = tmp
        dict.push([key, values])
      end
    }
  end
}

x = ''
puts 'var migemoDict = {'
dict.sort{|a,b| a.first <=> b.first}.each{|kv|
  if kv[0][0] != x
    puts " ], " if x != ''
    x = kv[0][0]
    puts " \"#{x}\" : ["
  end
  puts "  [\"#{kv[0]}\", #{kv[1]}],"
}
puts ' ]'
puts '}'

JSMigemo のどこにもライセンスが書いてないのだけど、まあ自由に使って大丈夫だと思う。


しかしこうやって見るとけっこう無駄の多い並び方をしてるなあ。

ちょっと使ってみてまた修正するかも。


こっちのがいいかな

var migemoDict = {
 "あ" : {
  "あ":["合", "会", "遭", "逢", "当", "有", "蓬", "充", "悪", "在", "荒", "編", "飽", "開", "明", "空", "挙", "揚", "上", "浴", "阿", "娃", "唖", "亜"],
  "あい":["愛", "哀", "相", "姶", "挨", "合"],
  "あいかわ":["相変", "相川"],
  "あいさつ":["挨拶"],
  "あいしゃ":["愛車"],
  "あいしょう":["愛称", "相性"],
  "あいじょう":["愛情"],
  "あいだ":["間"],
#!/usr/local/ruby1.9/bin/ruby
# -*- coding: utf-8 -*-
Encoding.default_external = "utf-8"

dict = {}
Dir.new('.').each{|file|
  if file =~ /^dict\d\d\.xml$/
    open(file){|f|
      while line = f.gets
        next if line =~ /^</
        tmp = line.strip.split(/\t/)
        key = tmp.shift
        values = tmp
        if dict.has_key?(key)
          dict[key] = (dict[key]+values).uniq
        else
          dict[key] = values.uniq
        end
      end
    }
  end
}

x = ''
puts 'var migemoDict = {'
dict.to_a.sort{|a,b| a.first <=> b.first}.each{|kv|
  if kv[0][0] != x
    puts " }, " if x != ''
    x = kv[0][0]
    puts " \"#{x}\" : {"
  end
  puts "  \"#{kv[0]}\":#{kv[1]},"
}
puts ' }'
puts '}'
 |