[[ノート/テキストマイニング]]~
訪問者数 &counter();      最終更新 &lastmod();~
> [[ノート/テキストマイニング]]~
> [[ノート/テキストマイニング/テキストマイニングとシソーラス]]~
> [[ノート/テキストマイニング/MeSH]]~
> [[ノート/テキストマイニング/NLTK]]~

**PubMedのテキストマイニング解析 [#j6e417c4]

***アイデア [#zdfc5aa1]
PubMedのAbstractを使ったテキストマイニングの演習。要するにPubMedのデータ(全部は大変だから一部に限定)を、テキストマイニングの手法で解析してみる。

***PubMedアクセス [#cb4c0a9b]
-PubMedのネットワークAPI(ESearch)を使おう 〜 [[Entrez・PubMedをプログラムからアクセスする方法]]
--term=検索文字列。ブール演算子を含んでもよい。⇒ 空にしてみようかな。
--field=検索のフィールド。PubMedで選べるフィールドはaffl, auth, ecno, jour, iss, mesh, majr, mhda, page, pdat, ptyp, si, subs, subh, tiab, word, titl, lang, uid, fltr, vol ⇒ いらない。場合によってはjourで限定することを考えよう。
--日付の指定 reldate=90(今日から90日前まで)、mindate=2001  maxdate=2002/01/01(初め・終わりの日付)、datetype=edat(日付のタイプ、なんだろう?)⇒ これで限定しよう。
--表示する項番 retstart=x retmax=y (xは取り出すレコードの順番。0が先頭でデフォルト、yはいくつ取り出すか)
--取り出すモード retmode=xml (XMLで取り出す。ESearchではxmlしかない。テキストで内容を見たいときはEFetchを使え)
--取り出すタイプ rettype=countかuilist(デフォルト)か
--ソートキー sort=xxx PubMedではauthor, last+author, journal, pub+dateがある。

-Pythonで以前に試したプログラムを使おう 〜 [[ノート/Pythonその2]]
--プログラム &ref(ノート/Pythonその2/getlistandaccess.py); をベースにしよう。

-得られたXML表記をパーズして要素を取出し、データベース(例えばMySQL)に入れたい
--[[23.6. MySQL Python API:http://dev.mysql.com/doc/refman/5.1/ja/python.html]]
--[[【Python】 MySQL-pythonのインストール:http://semanticlog.blogspot.com/2008/02/python-mysql-python.html]]
--[[ 	MySQLのPythonインターフェース:MySQLdb:http://paison.hp.infoseek.co.jp/paison/database/mysqldb.html]]

作業ログ~
oreganoを使う。FreeBSDはMySQLのバージョンが合わず面倒なのでやめた。~
MySQLは既に入っているので、そのまま使う。ユーザのみ作成(GRANT文)~
MySQL-pythonのインストール
-cd /usr/local
-ダウンロード wget http://nchc.dl.sourceforge.net/sourceforge/mysql-python/MySQL-python-1.2.2.tar.gz
-展開 tar -zxvf MySQL-python-1.2.2.tar.gz
-ln -s /usr/local/src/mysql-5.0.45/scripts/mysql_config /usr/local/bin/mysql_config (mysql_configがパス上に見つからないため)
-システムがスレッドセーフでないので、site.cfgを編集してthreadsafeをFalseにする
-python setup.py build
-python setup.py install (suで実行)

-あと~
cp /usr/local/src/mysql-5.0.45/libmysql/.libs/libmysqlclient.so.15 /usr/local/lib/libmysqlclient.so.15~
ln -s /usr/local/lib/libmysqlclient.so.15 /usr/lib/libmysqlclient.so.15~
をしてしまった。

-これにて実行可能になったので、いよいよテストプログラムを実行。テストプログラムは
 import MySQLdb
 
 con = MySQLdb.connect(db="mytest", host="localhost", port=3306,
                       user="xxxxxx", passwd="******")
 cur = con.cursor()
 
 s = "SELECT * FROM mytest"
 cur.execute(s)
 
 r = cur.fetchone()
 while r != None:
   print "%-10s | %-40s" % r
   r = cur.fetchone()
 
 cur.close()
 
 con.close()
-これを、下記のようにして実行する。
 %python mysqltest.py
-結果は
 Yamanouchi | 21
 Tanaka     | 25
-もう1つ、insertするテストプログラム。SQLで使うsingle quote(')をPythonの文字列中に書くには、\(逆スラッシュ、端末では円サイン)でエスケープしてやる必要がある。~
また、age=13とすると変数ageが整数属性を持ってしまい、sを作るときに+で文字列結合できないので、ここではage='13'とした。もし数値属性を持つ変数であれば、+をする前にstr関数などで文字属性に変換する必要がある。
 import MySQLdb
 
 con = MySQLdb.connect(db="mytest", host="localhost", port=3306,
                       user="xxxxxx", passwd="******")
 cur = con.cursor()
 
 name = "Yamada"
 age = "13"
 
 s = "INSERT INTO mytest values (\'" + name + "\', \'" + age + "\')"
 ###print s
 cur.execute(s)
 
 cur.close()
 
 con.close()

次に、XMLのパージングは、Pythonライブラリリファレンスの[[13. 構造化マークアップツール:http://www.python.jp/doc/release/lib/markup.html]]に説明がある。それによるとPython2.3以降は、Expat パーザが Python に取り込まれているので、 xml.parsers.expat モジュールは常に利用できるということなので、これで済むだろう。最初は[[PyXML 追加パッケージ:http://pyxml.sourceforge.net/]]を見ていたが、もし何もせずに使えるもので足りるなら、それがよかろう。

ということで、xml.parsers.expatを使ってみる。特にインストールとかは要らない。~
上記のライブラリリファレンスにある例題をほとんどそのまま実行。但し、xmlデータ入力はファイルからとしてみる。
 import xml.parsers.expat
 
 # 3 handler functions
 def start_element(name, attrs):
     print 'Start element:', name, attrs
 def end_element(name):
     print 'End element:', name
 def char_data(data):
     print 'Character data:', repr(data)
 
 p = xml.parsers.expat.ParserCreate()
 
 p.StartElementHandler = start_element
 p.EndElementHandler = end_element
 p.CharacterDataHandler = char_data
 
 f = open('sample.xml')
 p.ParseFile(f)
入力ファイルxample.xmlの頭の方は
 <?xml version="1.0"?>
 <!DOCTYPE PubmedArticleSet PUBLIC "-//NLM//DTD PubMedArticle, 1st January 2008//EN" "http://www.ncbi.nlm.nih.gov/entrez/query/DTD/pubmed_080101.dtd">
 <PubmedArticleSet>
 <PubmedArticle>
     <MedlineCitation Owner="NLM" Status="In-Process">
         <PMID>18543432</PMID>
         <DateCreated>
             <Year>2008</Year>
             <Month>06</Month>
             <Day>10</Day>
         </DateCreated>
         <Article PubModel="Print">
             <Journal>
                 <JournalIssue CitedMedium="Print">
                     <Issue>1</Issue>
                     <PubDate>
                         <Year>2007</Year>
                     </PubDate>
                 </JournalIssue>
                 <Title>Ernst Schering Foundation symposium proceedings</Title>
             </Journal>
出力はこうなった(対応する Journal End まで)。
 Start element: PubmedArticleSet {}
 Character data: u'\n'
 Start element: PubmedArticle {}
 Character data: u'\n'
 Character data: u'    '
 Start element: MedlineCitation {u'Owner': u'NLM', u'Status': u'In-Process'}
 Character data: u'\n'
 Character data: u'        '
 Start element: PMID {}
 Character data: u'18543432'
 End element: PMID
 Character data: u'\n'
 Character data: u'        '
 Start element: DateCreated {}
 Character data: u'\n'
 Character data: u'            '
 Start element: Year {}
 Character data: u'2008'
 End element: Year
 Character data: u'\n'
 Character data: u'            '
 Start element: Month {}
 Character data: u'06'
 End element: Month
 Character data: u'\n'
 Character data: u'            '
 Start element: Day {}
 Character data: u'10'
 End element: Day
 Character data: u'\n'
 Character data: u'        '
 End element: DateCreated
 Character data: u'\n'
 Character data: u'        '
 Start element: Article {u'PubModel': u'Print'}
 Character data: u'\n'
 Character data: u'            '
 Start element: Journal {}
 Character data: u'\n'
 Character data: u'                '
 Start element: JournalIssue {u'CitedMedium': u'Print'}
 Character data: u'\n'
 Character data: u'                    '
 Start element: Issue {}
 Character data: u'1'
 End element: Issue
 Character data: u'\n'
 Character data: u'                    '
 Start element: PubDate {}
 Character data: u'\n'
 Character data: u'                        '
 Start element: Year {}
 Character data: u'2007'
 End element: Year
 Character data: u'\n'
 Character data: u'                    '
 End element: PubDate
 Character data: u'\n'
 Character data: u'                '
 End element: JournalIssue
 Character data: u'\n'
 Character data: u'                '
 Start element: Title {}
 Character data: u'Ernst Schering Foundation symposium proceedings'
 End element: Title
 Character data: u'\n'
 Character data: u'            '
 End element: Journal
 Character data: u'\n'
ここで、Character data u'\n'は改行で、元データが多分UTF-8でそのために入っている?~
また、Character data u'    'は、各行の先頭にある段下げのための空白。

【欲しいのは?】

 <PubmedArticleSet>
   <PubmedArticle>
      <MedlineCitation ... >
         <PMID> PubMed中でのID </PMID>
         ...
         <Article ...>
            <Journal>
              <JournalIssue ...>
                  <Issue> 巻番号 </Issue>
                  <PubDate>
                     <Year> 発行年 </Year>
                     ...
                  </PubDate>
               </JournalIssue>
               ....
               <Title> ジャーナルのタイトル </Title>
            </Journal>
        <ArticleTitle> 論文のタイトル </ArticleTitle>
            <Abstract>
               <AbstractText> 概要 </AbstractText>
            </Abstract>        
            <Affiliation> 著者所属 </Affiliation>
            <AuthorList ... >
               <Author ...>
                  <LastName> 著者姓 </LastName>
                  <ForeName> 著者名 </ForeName>
                  <Initials> イニシャルで書くと </Initials>
               </Author>
               <Author>
                  ...
               </Author>
            </AuthorList>
            <Language>eng</Language>
            ...
         </Article>
         ...
      </MedlineCitation>
      ...
   </PubmedArticle>
 
   <PubmedArticle>
      ...
   </PubmedArticle>
 
 </PubmedArticleSet>

***シソーラスMeSHの扱い [#w466db01]
-[[MeSHのトップ:http://www.nlm.nih.gov/mesh/meshhome.html]]
-[[XMLタグの解説:http://www.nlm.nih.gov/mesh/xmlmesh.html]]
-[[ダウンロード:http://www.nlm.nih.gov/mesh/filelist.html]]
-[[テキスト形式のサンプル:http://www.nlm.nih.gov/mesh/xml2008sample.txt]]

[[XMLの解説:http://www.nlm.nih.gov/mesh/xmlmesh.html]]によると、3層構造
 Descriptor
     Concept
         Term
になっている。Conceptが概念定義で中心になり、Termは同義語(同じ概念を表す
複数の言葉)が入る。Descriptorはまだよくわからない。

同ページの例で見ると、
 <DescriptorRecord ...><!-- Descriptor  -->
    <DescriptorUI>D000005</DescriptorUI>
    <DescriptorName><String>Abdomen</String></DescriptorName>
    <Annotation> region & abdominal organs...
    </Annotation>
    <ConceptList>
       <Concept PreferredConceptYN="Y"><!-- Concept  -->
           <ConceptUI>M0000005</ConceptUI>
           <ConceptName><String>Abdomen</String></ConceptName>
           <ScopeNote> That portion of the body that lies
           between the thorax and the pelvis.</ScopeNote>
           <TermList>
              <Term ... PrintFlagYN="Y" ... ><!-- Term  -->
                 <TermUI>T000012</TermUI>
                 <String>Abdomen</String><!-- String = the term itself -->
                 <DateCreated>
                    <Year>1999</Year>
                    <Month>01</Month>
                   <Day>01</Day>
                 </DateCreated>
              </Term>
              <Term IsPermutedTermYN="Y" LexicalTag="NON">
                  <TermUI>T000012</TermUI>
                  <String>Abdomens</String>
              </Term>
           </TermList>
       </Concept>
   </ConceptList>
 </DescriptorRecord>
のようになっている。[[テキスト形式のサンプル:http://www.nlm.nih.gov/mesh/xml2008sample.txt]]を、上記のように圧縮してみると、
 <DescriptorRecordSet>
 <DescriptorRecord DescriptorClass = "1">
   <DescriptorUI>D000001</DescriptorUI>
   <DescriptorName>
    <String>Calcimycin</String>
   </DescriptorName>
   <AllowableQualifiersList>
    <AllowableQualifier>
     <QualifierReferredTo>
      <QualifierUI>Q000008</QualifierUI>
       <QualifierName>
       <String>administration &amp; dosage</String>
       </QualifierName>
     </QualifierReferredTo>
     <Abbreviation>AD</Abbreviation>
    </AllowableQualifier>
    あと詳細は略。内容は
      <QualifierName> <String>adverse effects</String> </QualifierName>
      <QualifierName> <String>analogs &amp; derivatives</String> </QualifierName>
      <QualifierName> <String>analysis</String> </QualifierName>
      <QualifierName> <String>antagonists &amp; inhibitors</String> </QualifierName>
      後は省略
  </AllowableQualifiersList>
  <PharmacologicalActionList>
  </PharmacologicalActionList>
 
  <ConceptList>
   <Concept PreferredConceptYN="Y">
    <ConceptUI>M0000001</ConceptUI>
    <ConceptName>
     <String>Calcimycin</String>
    </ConceptName>
    <TermList>
     <Term  ConceptPreferredTermYN="Y"  IsPermutedTermYN="N"  LexicalTag="NON"  PrintFlagYN="Y"  RecordPreferredTermYN="Y">
      <TermUI>T000002</TermUI>
      <String>Calcimycin</String>
     </Term>
    </TermList>
   </Concept>
   <Concept PreferredConceptYN="N">
    <ConceptUI>M0353609</ConceptUI>
    <ConceptName>
     <String>A-23187</String>
    </ConceptName>
    <TermList>
     <Term  ConceptPreferredTermYN="Y"  IsPermutedTermYN="N"  LexicalTag="LAB"  PrintFlagYN="N"  RecordPreferredTermYN="N">
      <TermUI>T000001</TermUI>
      <String>A-23187</String>
     </Term>
     <Term  ConceptPreferredTermYN="N"  IsPermutedTermYN="Y"  LexicalTag="LAB"  PrintFlagYN="N"  RecordPreferredTermYN="N">
      <TermUI>T000001</TermUI>
      <String>A 23187</String>
     </Term>
     <Term  ConceptPreferredTermYN="N"  IsPermutedTermYN="N"  LexicalTag="LAB"  PrintFlagYN="N"  RecordPreferredTermYN="N">
      <TermUI>T000004</TermUI>
      <String>A23187</String>
     </Term>
     <Term  ConceptPreferredTermYN="N"  IsPermutedTermYN="N"  LexicalTag="NON"  PrintFlagYN="N"  RecordPreferredTermYN="N">
      <TermUI>T000003</TermUI>
      <String>Antibiotic A23187</String>
     </Term>
     <Term  ConceptPreferredTermYN="N"  IsPermutedTermYN="Y"  LexicalTag="NON"  PrintFlagYN="N"  RecordPreferredTermYN="N">
      <TermUI>T000003</TermUI>
      <String>A23187, Antibiotic</String>
     </Term>
    </TermList>
   </Concept>
  </ConceptList>
 </DescriptorRecord>
 </DescriptorRecordSet>
要するに
 Descriptor Calcimycin
   Concept    Calcimycin
     Term       Calcimycin
   Concept    A-23187
     Term       A-23187
     Term       A 23187
     Term       A23187
     Term       Antibiotic A23187
     Term       A23187, Antibiotic
という構造になっている。


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS