PubMed でシンプソン係数
PubMed(生命科学系の論文検索サイト:http://www.ncbi.nlm.nih.gov/sites/entrez)の論文を使って,生命現象(or 遺伝子)の関係(共起)を調べよう!ってことでシンプソン係数の計算を題材にしてみました.シンプソン係数が大きいほど,入力した2遺伝子(2単語)が頻繁に同時に論文に現れるので,関係が強いと推定できます.
中で使っているRubyコードsimpson.rb(このエントリの最後に書きます)は,引数に2つの遺伝子(単語)を入れると,独立した検索数とシンプソン係数が出てきます.
./simpson.rb CDK2 CDK6
CDK2 CDK6 3779 743 321 0.432032301480485
上記の例では,CDK2, CDK6が検索語,CDK2が3779件,CDK6が743件,CDK2 & CDK6が321件,シンプソン係数は0.432...となっています.
シンプソン係数は汎用的なものなので,WikiPediaで共起を調べるには,
「たつをのChangeLog - Wikipediaのキーワードリンクを使って関連語データを作ってみた」
( http://chalow.net/2007-06-09-3.html )などを参照.
Google や, Y!のAPIでも可能です.
- シンプソン係数を求めるrubyのコード(simpson.rb)
#!/usr/bin/env ruby require 'rexml/document' require 'open-uri' def count(gene) fp = open("http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term="+gene) source = fp.read fp.close doc = REXML::Document.new source return doc.elements['/eSearchResult/Count'].text.to_i end def simpson(gene1_count, gene2_count, gene12_count) if gene1_count <= 0 || gene2_count <= 0 return nil elsif gene1_count < gene2_count return gene12_count.to_f / gene1_count.to_f end return gene12_count.to_f / gene2_count.to_f end def main(gene1,gene2) gene1_count = count(gene1) gene2_count = count(gene2) gene12_count = count(gene1 + "+" + gene2) s = simpson(gene1_count, gene2_count, gene12_count) puts [gene1, gene2, gene1_count, gene2_count, gene12_count, s].join("\t") end exit if ARGV.size != 2 main(ARGV[0],ARGV[1])