OMIMのエントリを自動翻訳するスクリプト

遺伝病辞典のOMIMは私の様なnon-native かつ門外漢な人には、ひじょーに理解じにくい。でも、大量にざーっとチェックしたいな−と思うときがあるので、日本語になっていると便利かも?というわけで、OMIMをひたすら機械翻訳するスクリプト作りました。
このエントリのテクニックは、以下の2つのエントリを合わせた物です。

準備する物

  • 上の2つのエントリに書かれているgemライブラリ群
  • ネットワーク
  • 知りたいOMIMエントリのID

使い方
知りたいOMIMのエントリIDが265850(PYGMY) と、608747(INSULIN-LIKE GROWTH FACTOR I DEFICIENCY)とすると、

% ruby omim_translate.rb 265850,608747

元の文章と翻訳後の文章が併記されます。こんな感じ(都合上改行していますが、実際はタブ区切りで吐かれます)。

265850
1
CLINICAL FEATURES
Efe Pygmies from the Ituri forest of northeast Zaire have the shortest mean adult stature of any population on earth, with a mean adult male height of 4 feet, 8 inches, and a mean adult female height of 4 feet, 5 inches ({4:Diamond, 1991}).
Efe Pygmiesザイール北東部のイトゥリの森は、 4フィートの高さは成人男性で、 8インチ、 4フィートの高さを意味する、大人の女性、 5インチ( ( 4地球上の任意の成人人口の最短の平均身長がある:ダイヤモンド、 1991 ) ) 。

出力はUTF8なので、そのままではExcelとかで見られません。必要に応じて、nkfとか通してください。

ruby omim_translate.rb | nkf -s > omim_translated.xls

ソース

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

require 'rubygems'
require 'rtranslate'
require 'xmlsimple'
require 'open-uri'
require 'pp'

omim_ids = ARGV.shift.split(",").uniq.sort

count = 0
omim_ids.each do |omim_id|
  count += 1
  url = "http://www.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?" + 
    "db=omim&id=#{omim_id}&mode=xml"
  xml = open(url).read
  omiminfo = XmlSimple.xml_in(xml)
  omiminfo["Mim-entry"].each do |omim_entry|
    mim_no = omim_entry["Mim-entry_mimNumber"][0]
    mim_title =  omim_entry["Mim-entry_title"][0]
    jp_title = Translate.t(mim_title, "ENGLISH", "JAPANESE")  
    puts "#{mim_no}\tTitle\t#{mim_title}\t#{jp_title}"
    STDERR.puts "#{mim_no}\tTitle\t#{mim_title}\t#{jp_title}"
    num = 0
    textfield = nil
    # 2種類のXMLがあるようなので、分岐。
    if omim_entry["Mim-entry_textfields"].nil?
      textfield = omim_entry["Mim-entry_text"][0]["Mim-text"]
    else
      textfield = omim_entry["Mim-entry_textfields"][0]["Mim-text"]
    end
    textfield.each do |text|
      num += 1
      label = text["Mim-text_label"][0]
      en_txt = text["Mim-text_text"][0]
      jp_txt = Translate.t(en_txt, "ENGLISH", "JAPANESE")
      puts "#{mim_no}\t#{num}\t#{label}\t#{en_txt}\t#{jp_txt}"
      #    pp jp_txt
      sleep(1)
    end
  end
end

欠点
文章が長すぎると、Google AJAX APIに拒絶されます。