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