[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
[[ノート/テキストマイニング]]~
訪問者数 &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>
終了行:
[[ノート/テキストマイニング]]~
訪問者数 &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>
ページ名: