47の心得シリーズをトピックモデルで分類する。

MikuHatsune2013-08-05

「本当に」医者に殺されない47の心得というシリーズ物があって、これをトピックモデルで解析する。
ざっと読んだ感じ、臨床検査と薬剤の使い方について言及しているものが多いので、こんな感じでトピックが抽出できたらいいと思う。
本当は30くらい溜まった時点で次に筆者がどんなことについて言及するのかを機械学習で予測しようとしたけど執筆スピードが速すぎたので結局こんなんに落ち着いてしまった。
 
結果はこんな感じ。上位頻出20単語から、それっぽいトピックを人力で名付けた。
パッと見は悪くなさそうなんだが、トピック1に胃ろうの話がきていたりトピック8がタバコに引きずられたけどタイトルをよくよく見たら結局薬のことだったりと薬のトピックが多かった。

Topic 上位 下位 内容
1 患者 問題 よう さん から ぼく それ 飲む がん 医者 しま 言う 治療 検診 思う できる 日本 お薬問題
2 よう 0 患者 問い 1 医者 6 高齢者 から 問題 20 さん しま 風邪 優秀 5 高齢者に対するお薬問題
3 医者 よう から ぼく 日本 それ 抗生物質 問題 メイアクト フロ モック さん 2 看護師 医療 しま 抗生物質の使い方問題
4 患者 よう 問題 時間 医者 病院 さん ぼく 思う から できる がん 待ち よい 評価 外来 待ち時間問題
5 患者 から よう さん 医療 それ 0 呼吸 人工 可能 多様 しま 1 5 検診 問題 意思決定問題
6 患者 よう 検査 医者 医療 から 異常 さん 必要 それ 日本 尿酸 しま できる ぼく 病気 検査問題
7 1 患者 から 医者 9 さん 点滴 2 3 飲む 問題 5 使う よう 20 4 ppi お薬問題
8 よう 血圧 1 高い 医者 3 4 タバコ 5 0 8 問題 から 使う 患者 治療 阻害 さん 血圧とタバコ?
9 よう 喘息 治療 ステロイド オフ リン 使う 医学 患者 問題 医療 極論 医者 もの から 2元極論者的な?
10 日本 血圧 患者 高い 医者 よう 問題 下げる 学会 治療 思う 研究 これ 0 ぼく 捏造 見る 医学研究・学会界隈の問題


 
前処理
ブログから47つの心得の本文を取ってきて txt 保存して mecab にかける。薬品名が出るので辞書拡張してどうにかこうにかしようと思っていたけど、前にやったはてなキーワード(あんまり役に立ってないけど)でもジアゼパムセルシンは抽出できていた。しかし本文でかなり言及されていたディオバンやPL顆粒が抽出されていなかったのでどんまい。
Pyhtonでやりました。

import sys
import os
import MeCab
import codecs
import unicodedata

wd1 = "/iwata/"
wd2 = "/iwata/mecab/"

os.listdir(wd1)
"名詞", "動詞", "形容詞"
txt = []
for i in os.listdir(wd1):
	if i.endswith(".txt"):
		txt += [i]

tagger = MeCab.Tagger("-Ochasen")
for i in range(len(txt)):
	f0 = codecs.open(wd1 + txt[i], "rU", "utf-8")
	w0 = codecs.open(wd2 + txt[i], "w", "utf-8")
	for line in f0:
		tmp = unicodedata.normalize('NFKC', line.rstrip())
		mecab0 = tagger.parse(tmp.encode("utf-8")).decode("utf-8")
		w0.write(mecab0[:-4])
	
	w0.close()

 
トピックモデルを実行する。文章が47しかないので CTM で十分できるだろう。トピック数は多い感じがするが10に設定した。

library(topicmodels)
library(lda)
library(RMeCab)

wd <- "/iwata/mecab/"
kokoroe <- list.files(wd, "txt")

lex <- c("名詞", "動詞", "形容詞")
doc0 <- rep(0, length(kokoroe))
for(i in seq(doc0)){
	tmp <- read.delim(paste(wd, kokoroe[i], sep=""), header=FALSE)
	word <- unlist(mapply(function(x) grep(x, as.character(tmp[,4])), lex))
	doc0[[i]] <- paste(as.character(tmp[word, 3]), collapse=" ")
}

lex1 <- lexicalize(doc0)
dtm1 <- ldaformat2dtm(lex1$documents, lex1$vocab)
ctm1 <- CTM(dtm1, 10)

これだと使用頻度が少ない単語や、すべての文章で使われていて特異性の低い単語が頻出するので、TFIDFを用いてそういう単語は除外してやり直した。

TFIDF <- function(corpus, progress=FALSE){ # lexicalize した corpus を使用
	res <- matrix(0, nr=length(corpus$vocab), nc=4)
	dimnames(res) <- list(corpus$vocab, c("documents", "count", "freq", "score"))
	res[, "documents"] <- length(corpus$documents)
	wordset <- mapply(function(x) x[1,], corpus$documents) # documents中の単語リスト
	allfreq <- matrix(unlist(corpus$documents), nr=2)
	wordfreq <- tapply(allfreq[2,], allfreq[1,], sum) # すべての単語の、全documents中の出現頻度
	for(v in seq(corpus$vocab)){ # vocab と i は 1 ずれているので注意
		count_docs <- sum(sapply(lapply(wordset, "==", v-1), any)) # その単語が出現する文章の数
		res[v, "freq"] <- count_docs
		if(progress){ # Linux用。プログレスバーを付ける
			pb <- txtProgressBar(min=1, max=length(corpus$vocab), style=3)
			setTxtProgressBar(pb, v)
		}
	}
	res[, "count"] <- wordfreq
	res[, "score"] <- log(res[, "count"]) * log(res[, "documents"]/res[, "freq"])
	return(as.data.frame(res))
}

s0 <- TFIDF(lex1, TRUE)
term1 <- rownames(s0)[s0$score > 0]
lex2 <- list(documents=lexicalize(doc0, vocab=term1), vocab=term1)
dtm2 <- ldaformat2dtm(lex2$documents, lex2$vocab)
ctm2 <- CTM(dtm2, 10)

g0 <- ctm2@gamma
t0 <- c(as.matrix(read.delim("clipboard", header=FALSE))) # タイトル一覧
rownames(g0) <- paste(paste(paste("Topic", topics(ctm2), sep=""), seq(nrow(g0)), sep=" #"), t0)
h0 <- hclust(dist(g0), method="ward")
plot(h0, xlab="心得")

タイトル一覧。コピペして使える。

2度めもかかりつけ医にいこう
よい医者の見分け方
クラリスばっか使う医者にはご用心
フロモックスとかメイアクトばっか出す医者にはご用心
医療のリスクは分散より集中
PPIの出しすぎにご用心
ロキソニンやボルタレン。ずっと飲むのはご用心
尿酸値「だけ」を治療する医者にはご用心
検査を治療する医者には要注意 じゃ、何を治療したらいいの?
いろんな人がいてもいい。いろんな治療があってもいい。糖尿病治療の多様性
なんでバカ売れ?DPP-4阻害薬
末梢循環改善薬は、何を循環させてるの?
高血圧の治療薬 そのいびつさ
そもそも高血圧に薬は必要か
ほんとうに恐ろしいニコチン中毒
変化し続ける医療の世界 テオフィリンの話
なかなか微妙なラマの話
心不全にはジギタリスか
点滴してくれと、言ってはいけない
モメにモメている乳がん検診
正しそうでずるい、総死亡率
日本の医者が、ハートは100点、頭が0点な理由
日本の医者が、ハートは100点、頭が0点な理由その2
日本の看護師も変わらなきゃ
その処方で大丈夫?薬をオーダーする前に
ポリファーマシーにサヨナラを
待ち時間は、患者が()悪い
大病院の前に、かかりつけ医を
あなたの後にも患者はいる
本当は怖い、患者中心の医療
ぼくは患者にウソをつく
インフォームド・コンセントではないやり方で
性教育と他者
医者の方も、待ち時間を減らそう
どこまでウソか。エラスポールの話
高血圧学会がとるべき態度
健康診断に意味はあるか
がん検診に意味はあるか リボーン
リビング・ウィルをどう考えるか。パラダイムシフトの可能性について
胃瘻というツール
患者の不利益はアンタッチャブルか
胃がん検診は本当に必要?
そんなにCT撮っちゃって
ぼくは出さない(飲まない)、PL顆粒
高齢者の不眠は、難しい
医学・医療最大の敵は、「極論」である
医者はジャッジ(裁判官)ではない。患者は主役ではない。中心のない医療のススメ