世の中の全ての化合物を取得する part2
さて、4ヶ月ほど前に一度「世の全ての化合物を取得する」と意気込んだ後どうなったかと申しますと、苦戦しています。
Substanceの方のデータベースからファイルをダウンロードしてsid, cid, nameを抜き出しました。
物質に対してユニークなのはcidとのことなので、cidとnameの組み合わせをユニークにしてデータベースに突っ込んでみました。
ざっくり解説
上記方針を解説します。
まずSubstanceにはかなりダブりがあります(SubstanceのIDがSID)。
例えばserotoninはSID111677885に登録されていると同時にSID134971779にも同名で登録されています。
対してCompoundsはこれら別SIDの同物質をまとめている、というのがPubchemの説明でした。
すなわち、SID111677885もSID134971779も一つのCompounds(CID5205)に紐づけられています。
ゆえに、cidとnameをDBに突っ込めばcidのユニーク数が物質の数になりますし、同一のcidを持つnameはある物質の別名であると言える“はず”でした。
どうなったか
さて、sidを使ってDBに登録したら同name別sidの物質がたくさん発生してしまうはずです。
一方でcidを使えば、同name別cidは発生しないはずです。
本当に全ての同name別sidが一つのcidに集約されていればの話ですが。。。
serotoninで検索。
8件のダブり!
いくつか見てみます。
CID5202は確かにserotoninです。
他のを見てみると、 微妙に違う!
放射性同位体(炭素11)が使われていたり、Hが一つ多かったりC鎖が一つ長かったり。
ページ内のsynonyms(同義語)にはserotonin cationなど別の名前が書かれておりserotoninとそのままズバリ表記されている物質はありませんでした。
ということはCompoundがユニークな物質のデータベースであるのは正しそうです。
しかし今回情報元にしたSubstanceは参照が間違っていたり、完璧ではありませんでした。
ぐぬぬ。
他にもInsulinなどのタンパク質はヒト由来、ブタ由来では微妙に分子式が変わっていました。
Compoundではこれらは厳密に区分されていましたが、Substance由来の情報ではいずれもInsulinとして扱っているのでserotoninの時と同じように同name別cidが発生していました。
方針
求めていたほど完璧な区分がされていないみたいですが、
現状CompoundのFTPサーバに収められているデータからは名前が取れないのでしょうがないですね。
機械的に間違っている名前を修正するにはレコードとサイトの表記を比較しないといけないので現実的ではないです。
それやるならそもそもCompoundのFTPサーバじゃなくてWebページからスクレイピングすればいいのですが、
もしそれをやろうと思ったら1億弱のWebページにアクセスしなくてはいけません。
出典: About PubChem
スクレイピングのお作法に従って1ページ1秒でスクレイピングした場合、ぶっ通しでやっても3年強かかります。やってられん。
なので、多少精度は落ちますがまずは今回作成したデータベースを使ってどこまでのことができるか試してみます。
ちなみに、「別名を別レコードとして登録」&「名前がないCompoundは登録しない」&「cid, nameの組み合わせでユニーク制約」などの条件で処理しました。
公式サイトではCompoundは9470万と書いてありますが、DBへの登録数は1億6000万ぐらいになりました。