Hatena::ブログ(Diary)

驚異のアニヲタ社会復帰への道

Prima Project

2013-02-17

HTMLファイルからデータの抽出

データを取得したわけだが、ここから病院紹介文や給与などを抽出しよう。

まず、作業ディレクトリpmet2013を作り、そこにhtmlファイルがたくさんあるとする。

保存したファイルと病院名を取得する。

#ターミナル
ls *html > hospital.txt

HTMLファイルにはいろいろ構造があるらしく、うまくparseしたらいろいろ情報が取れるらしいのだが(HTMLParserBeautifulSoup)、よくわからなかったので文字列マッチでゴリ押しした。

また、数値だけほしいところにものすごい邪魔な注意書きみたいなことを書くやつがいるので、本当に抽出したい数列の前後を指定してsplit & joinでゴリ押しした。

抽出する要素、その要素から何回readlineするか、抽出する文字列の前、抽出する文字列の後ろ、の順。

これをheader.txtとして保存する。

<div class="matching">	1	 	<
<div class="hospno">	1	(	)
<div class="rinen_title">病院の理念</div>	2	NA	NA
<dt class="short">診療の特徴、実績</dt>	3	NA	NA
<dt class="short">電子カルテ</dt>	2	NA	<
<dt>一日平均入院患者数</dt>	2	NA	人
<dt>一日平均外来患者数</dt>	2	NA	人
<dt>平均在院日数(一般/精神)</dt>	2	NA	日
<dt>年間分娩件数</dt>	2	NA	件
<dt>年間剖検件数</dt>	2	NA	件
<dt class="multiline">年間臨床病理研究会(CPC)の<br>実施状況</dt>	2	/	回
<dt>当院の救急医療の特徴</dt>	2	NA	NA
<dt>一日平均救急外来患者数</dt>	2	NA	人
<dt>一日平均救急車搬送患者数</dt>	2	NA	人
<dt>年間心肺停止状態搬送患者数</dt>	2	NA	人
<dt>回数(月平均)</dt>	2	NA	回
<dt>当直手当</dt>	2	NA	(
<span class="highlight">一年次</span></dt>	3	NA	円
賞与	0	与	円
<span class="highlight">二年次</span></dt>	3	NA	円
賞与	0	与	円
想定手取月額	2	約	円
<dt>研修中の人数(一年次)</dt>	2	NA	人
<dt>研修中の人数(二年次)</dt>	2	NA	人
<dt>昨年度受験者人数(合計)</dt>	2	NA	人
<dt>昨年度採用人数(合計)</dt>	2	NA	人
<dt>昨年度採用()</dt>	2	NA	人
<dt>昨年度採用()</dt>	2	NA	人
<dt class="block">指導医から一言</dt>	3	NA	NA
<dt class="block">先輩研修医からの病院紹介と、この病院を選んだ理由</dt>	3	NA	NA

Pythonで日本語を扱うときには、エンコーディングの問題でやたらと不都合があるらしいので、これを修正しつつ、半角文字で書いて欲しいところを全角で書くのがやつらのやり方なので、これも強制的に半角に変換する

 

wd = "/pmet2013/"
outwd = "/pmet2013/"
import codecs
import unicodedata
import re
hospitals = [h0.strip() for h0 in codecs.open(wd + "hospital.txt", "rU", "utf-8")]
#取り出す項目, readlineする回数, splitする前, splitする後ろ
hname = [g0.strip().split("\t") for g0 in codecs.open(wd + "header.txt", "rU", "utf-8")]
label = ["hpname", "matching", "hpno", "rinen", "tokutyou", "her", "adpt", "outpt", "hpdays", "birth", "outpsy", "cpc", "er", "eroutpt", "amb", "cpa", "duty", "duty_pay", "1st_pay", "1st_bonus", "2nd_pay", "2nd_bonus", "salary", "1st_dr", "2nd_dr", "applicant", "hired", "hiredM", "hiredF", "supervisor", "intern"]
#html構造内のこういうやつは邪魔なのでsplitで消すことにする。
iranai = ["<br>", "</div>", "<dd>", "</dd>"]
res = []
hname0 = [d0[0] for d0 in hname]

for h1 in hospitals:
	f0 = codecs.open(wd + h1.strip(), "rU", "utf-8")
	output = [u"0"]*len(hname)
	
	for f1 in f0:
		tmp = unicodedata.normalize('NFKC', f1.strip()) #日本語が処理できるように変換する
		tmpin = map(lambda x: x in tmp, hname0) #処理したい項目があるか
		if any(tmpin):
			tmpidx = tmpin.index(True) #処理したい項目
			for i in range(int(hname[tmpidx][1])):
				tmp = "".join(f0.readline().strip().split("\t")) #タブ区切りと
				tmp = "".join(tmp.split(",")) #カンマ区切りがうっとしい
				tmp = unicodedata.normalize('NFKC', tmp)
			
			if not all(map(lambda x:x == u"NA", hname[tmpidx][2:])) and len(tmp) != 0:
				if tmp == u"&nbsp;":
					tmp = u""
				else:
					if hname[tmpidx][2] != u"NA": #文字列先頭がある場合
						tmp = tmp.split(hname[tmpidx][2])[1].split(hname[tmpidx][3])[0]
					else: #文字列先頭がない場合
						tmp = tmp.split(hname[tmpidx][2])[0].split(hname[tmpidx][3])[0]
			
			if output[hname0.index(u"賞与")] != u"0" and tmpidx == hname0.index(u"賞与"): #賞与の項目がふたつあるので
				output[hname0.index(u"賞与", hname0.index(u"賞与")+1)] = tmp
			else:
				output[tmpidx] = tmp
	
	print h1 #邪魔ならコメントアウト
	tmpres = [unicodedata.normalize('NFKC', "".join(h1.split(".html")))] + output
	res0 = []
	#htmlの邪魔なやつらはさようなら
	for t0 in tmpres:
		for iranai0 in iranai:
			t0 = "".join(t0.split(iranai0))
		
		res0 += [t0]
	
	res += [res0]

#ファイルの書き出し
w0 = codecs.open(outwd + "result.txt", "w", "utf-8")
w0.write("\t".join(label))
w0.write("\n")
for p0 in res:
	w0.write("\t".join(p0))
	w0.write("\n")

w0.close()

2013-02-16

MikuHatsune2013-02-16

臨床研修病院解析

卒後医師臨床研修という制度が、文部科学省のお達しである。

全国の医学生マッチングと呼ばれるアルゴリズムによって就職活動を行う。このシステムはマッチング協議会によって行われる。

これはいわゆる就活なので、医学生たちは病院見学に行ったり実習に参加したりするわけだが、マッチング参加病院には人気の差があるわけで…

この人気の差とか、今後人気が出るにはどうしたらいいかを、マーケティング戦略的なことでどうにかこうにかできたらと。

 

マッチング結果資料によると、中間発表での倍率や、最終的に満席にならなかったプログラムなど、いろいろわかる。

人気具合をどうにか定量しようと、公益財団法人医療研修推進財団(PMET)にある臨床研修病院ガイドブックからデータを抽出して、解析しようという試み。

なお、この記事を書いている時点で、2013年度版を解析します。

解析がひと通り済んだら(本当に済むの?)、それを流用して2014年度以降もする…かなぁ…

 

データベースからデータを抽出する

データの加工