Python使ってpubmedからbibを生成

biopythonで。

#!/usr/bin/env python
# -*- encoding:utf-8 -*-
# kzfm <kerolinq [AT] gmail.com>

def pm2bib(pm):
    author = "; ".join(pm['AU'])
    year = pm['DP'][0:4]
    bib = """@article{PMID:%s,
author = {%s},
title = {%s},
journal = {%s},
year = {%s},
volume = {%s},
number = {%s},
pages = {%s},
}
""" % (pm['PMID'],author,pm['TI'],pm['TA'],year,pm['VI'],pm.get('IP',""),pm['PG'])
    return bib

if __name__ == "__main__":

    from Bio import Entrez, Medline

    Entrez.email = "xxx@gmail.com"
    record = Entrez.read(Entrez.esearch(db="pubmed",term="biopython"))
    idlist = record["IdList"]
    records = Medline.parse(Entrez.efetch(db="pubmed",id=idlist,rettype="medline",retmode="text"))

    for record in records:
        print pm2bib(record)

適当に用意したtex

\documentclass{jarticle}
\begin{document}
\bibliographystyle{plain}
「お互いの犬\cite{PMID:20015970}の写真\cite{PMID:19811691}を撮り合い、帰ったらその写真\cite{PMID:19773334}
を自分のブログ\cite{PMID:19304878}にUPして紹介\cite{PMID:18606172}
し、お互いのブログにお礼コメント\cite{PMID:16403221}をするというのが暗黙のルール\cite{PMID:16377612}です。」

X06HT予約しにいったら、携帯電話が妻名義\cite{PMID:14871861}だったので予約出来なかった。
あと名義変更に一日かかるからあと二回いかないと予約出来ない\cite{PMID:14630660}
という衝撃の事実を聞かされた。多分、アンドロイドへの何か\cite{PMID:12230038}
が試されているんだろう。

\bibliography{test}
\end{document}

できたpdf

pyPdfでdoiを抽出する

普段はCAM::PDFを使っているのだけど、pythonでPDFからdoiを抽出したくなったのでpyPdfを使ってみた。

#!/usr/bin/env python
# -*- encoding:utf-8 -*-

from pyPdf import PdfFileReader
import re

doi_re = re.compile("10.(\d)+/([^(\s\>\"\<)])+")
input = PdfFileReader(file("1267.full.pdf", "rb"))
text = input.getPage(0).extractText()

m = doi_re.search(text)
print m.group(0)

結果

10.1124/dmd.107.019711.ABBREVIATIONS:PKPD,pharmacokinetic-pharmacodynamic;HGF,hepatocytegrowthfactor;PF02341066,

dmdだとdoiと文字の境目が切れないので余計な文字もついてきてしまうなぁ。prefixとsuffixを見ながら判断するようにするのがいいかな。

それにしても、meta情報のtitleに埋め込まれてたり、本文の1page目に書いてあったり、ファイル名そのものだったりと、論文からdoiを抽出するのは結構めんどくさいんだよなぁ。

Machine Learning: An Algorithmic Perspective 14,15章

MCMCとグラフィカルモデリング

この本だけではちょっと理解不足なので、PRMLとかまた読み返そう。

ProductName グラフィカルモデリング (統計ライブラリー)
宮川 雅巳
朝倉書店 / ¥ 3,990 ()
在庫あり。

ProductName パターン認識と機械学習 下 - ベイズ理論による統計的予測
C. M. ビショップ
シュプリンガー・ジャパン株式会社 / ¥ 8,190 ()
在庫あり。

macbookにMongoKitをいれた

>>> from mongokit import *
Traceback (most recent call last):
    from magic import Magic
  File "build/bdist.macosx-10.5-i386/egg/magic.py", line 112, in <module>
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/ctypes/__init__.py", line 353, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: dlopen(/opt/local/lib/libmagic.dylib, 6): image not found

これはfileが入ってないせいらしいので、portで入れとく

$ sudo port install file
--->  Computing dependencies for file
--->  Fetching file
--->  Attempting to fetch file-5.04.tar.gz from http://distfiles.macports.org/file
--->  Verifying checksum(s) for file
--->  Extracting file
--->  Applying patches to file
--->  Configuring file
--->  Building file
--->  Staging file into destroot
--->  Installing file @5.04_0
--->  Activating file @5.04_0
--->  Cleaning file

これでOK

Machine Learning: An Algorithmic Perspective 13章

強化学習

ProductName Machine Learning: An Algorithmic Perspective (Chapman & Hall/Crc Machine Learning & Patrtern Recognition)
Stephen Marsland
Chapman & Hall / ¥ 6,529 ()
通常2~3週間以内に発送

Q学習

いくつかの問題点も指摘されている。例えば Q学習による理論的保証は値の収束性のみであり収束途中の値には具体的な合理性が認められないため学習途中の結果を近似解として用いにくい、パラメータの変化に敏感でありその調整に多くの手間が必要であるなどがある。

SarsaとQ-Learningの違い

CouchDBにsdfを突っ込む

ほとんど化合物情報をTokyo Cabinetで管理してみると同じノリで出し入れできそう。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#!/usr/bin/env python
# -*- encoding:utf-8 -*-

import pybel
import couchdb

sdffile = "pc_sample.sdf"
couch = couchdb.Server()
db = couch.create('pubchem')

mols = pybel.readfile("mol",sdffile)

for mol in mols:
    title = mol.OBMol.GetTitle()
    molstring = mol.write("mol")
    db[title] = {"mol":molstring}

化合物情報みたいな、RDBで管理しやすいようなデータよりは、in vivoの薬理試験とか動態試験みたいな、プロトコル間で比較があまりなくて、かつ所見とかの文章データが重要なもののほうが向いているのかもしれんなぁと思った。PKデータなんてIDで探して、時点と個体のデータがJSONで引っ張ってこれるようにしとけばナイスすぎる!

javascriptからRの関数呼べんかな?そうすればJSONでデータ受け取ってPKfitとか使えんのにな。それかbrewとか

書籍もいくつか出てるけど、日本語ないなぁ。そのうち出るんかな?

ProductName CouchDB: The Definitive Guide
J. Chris Anderson
Oreilly & Associates Inc / 3390円 ( 2010-01-15 )


ProductName Beginning CouchDB
Joe Lennon
Apress / 3783円 ( 2009-12-30 )


ProductName Couchdb in Action
Christopher Chandler
Manning Pubns Co / 4180円 ( 2010-12-28 )


Machine Learning: An Algorithmic Perspective 12章

遺伝アルゴリズム

ProductName Machine Learning: An Algorithmic Perspective (Chapman & Hall/Crc Machine Learning & Patrtern Recognition)
Stephen Marsland
Chapman & Hall / ¥ 6,529 ()
通常2~3週間以内に発送

Four Peaks Problemってのがあるらしい。目的関数が

  • 最初のビットからの連続した1の長さか最後のビットから連続した0の長さの大きいほう
  • 但し、両端の1,0の連続した数が10以上の場合は100ポイント獲得する。

目的関数はこんな感じ。

#!/usr/bin/env python
# -*- encoding:utf-8 -*-

from itertools import takewhile

def o(bits):
   return len(list(takewhile(lambda x: x == 1,bits)))

def z(bits):
       return len(list(takewhile(lambda x: x == 0,reversed(bits))))

def f(bits):
   reward = 100 if o(bits) > 10 and z(bits) > 10 else 0
   return max(o(bits),z(bits)) + reward


if __name__ == "__main__":
    bits1 = [1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
    bits2 = [1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

    for bits in [bits1,bits2]:
        print "score: %d %s" % (f(bits),bits)

#score: 20  [1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
#score: 114 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

要するに素直に探索していくとローカルミニマムに落ちるようになっていて、ピークの数が4つあるのでFour Peaks Problem

連続した1,0の長さでcontour plotを描いた。

4-peaks problem

#!/usr/bin/env python
# -*- encoding:utf-8 -*-

def sim_score():
    for x in range(100):
        for y in range(100):
            if x + y > 100:
                yield 0
            else:
                score = four_peak(x,y)
                yield score

def four_peak(x,y):
    reward = 100 if (x > 10 and y > 10) else 0
    score = max(x,y) + reward
    return score

if __name__ == "__main__":
    from pylab import *

    delta = 1
    x = arange(0, 100, delta)
    y = arange(0, 100, delta)
    X, Y = meshgrid(x, y)
    Z = array([z for z in sim_score()])
    Z.shape = 100,100

    im = imshow(Z,origin='lower' ,alpha=.9)
    colorbar(im)

    cset = contour(X,Y,Z)   
    clabel(cset,inline=1,fmt='%1.1f',fontsize=10)

    hot()
    savefig('4peaks.png')

whoのアウトプットを時間順にソート

mixiにあったはずなのに消えてた。

皆さんこんにちは。Linuxのwhoコマンドのアウトプットを時間昇降順にソート(qsort()を使って)したいと思っています。

pyutmpを使って。

#!/usr/bin/env python
# -*- encoding: utf-8 -*-

from pyutmp import UtmpFile
from time import ctime
utmps = [utmp for utmp in UtmpFile()]

for utmp in sorted(utmps,cmp=lambda x,y: cmp(ctime(x.ut_time),ctime(y.ut_time))):
    print '%s %s %s' % (utmp.ut_user, utmp.ut_line, ctime(utmp.ut_time))

Machine Learning: An Algorithmic Perspective 11章

Optimization and Search

ProductName Machine Learning: An Algorithmic Perspective (Chapman & Hall/Crc Machine Learning & Patrtern Recognition)
Stephen Marsland
Chapman & Hall / ¥ 6,529 ()
通常2~3週間以内に発送

共役勾配法とか。

章としてはあんまそそられなかった。

Machine Learning: An Algorithmic Perspective 10章

次元縮約のアルゴリズム。LDA,PCA,Kernel PCA,ICA,LLE,Isomapあたり。

ProductName Machine Learning: An Algorithmic Perspective (Chapman & Hall/Crc Machine Learning & Patrtern Recognition)
Stephen Marsland
Chapman & Hall / ¥ 6,529 ()
通常2~3週間以内に発送

後半部分がちゃんと理解出来ていない。10.2.1でPCAと多層パーセプトロンの関連性を論じているのだけど、そこがよくわからなかった。あとLLE,MDS,Isomapをきちんと理解してないので、ちゃんと読んで一回実装してみる必要がある。