More Related Content
Similar to 20161127 doradora09 japanr2016_lt (9)
More from Nobuaki Oshiro (20)
20161127 doradora09 japanr2016_lt
- 6. LDAとは
• “Latent Dirichlet Allocation”の略
• 文書中の単語の「トピック」を確率的に求める言語モデル
• 各単語が「隠れトピック」(話題、カテゴリー)から生成されて
いる、と想定して、そのトピックを文書集合から教師無しで推
定することが目的
- 8. 例:以下の3つのニュース記事をLDA
1. 博多駅前 再び道路7センチほど沈み込む 通行止めに
• 26日未明、福岡市のJR博多駅前の大規模に道路が陥没した現場付近で、再び道路が
最大で深さ7センチほど沈んでいるのが見つかり、警察は周辺の交通を規制して、詳し
い状態などを調べています。・・・
2. 陥没めど立たぬ休業補償 飲食店など博多駅前事業者 福岡市に
問い合わせ50件
• 福岡市のJR博多駅前の道路陥没事故で休業を余儀なくされた飲食店などの事業者から
損失補償に関する問い合わせが市に相次ぎ、11日までに50件を超えた。・・・
3. 陥没周辺の建物は? 福岡市「倒壊の恐れなし」 専門家「地震
の揺れに注意を」
• 陥没事故の周辺では、建物の倒壊など二次被害も懸念された。福岡市は8日、陥没箇所を中心
に東西約400メートル、南北約150メートルにある42棟で応急危険度判定を実
施。・・・
- 9. 例:以下の3つのニュース記事をLDA
1. 博多駅前 再び道路7センチほど沈み込む 通行止めに
• 26日未明、福岡市のJR博多駅前の大規模に道路が陥没した現場付近で、再び道路が
最大で深さ7センチほど沈んでいるのが見つかり、警察は周辺の交通を規制して、詳し
い状態などを調べています。・・・
2. 陥没めど立たぬ休業補償 飲食店など博多駅前事業者 福岡市に
問い合わせ50件
• 福岡市のJR博多駅前の道路陥没事故で休業を余儀なくされた飲食店などの事業者から
損失補償に関する問い合わせが市に相次ぎ、11日までに50件を超えた。・・・
3. 陥没周辺の建物は? 福岡市「倒壊の恐れなし」 専門家「地震
の揺れに注意を」
• 陥没事故の周辺では、建物の倒壊など二次被害も懸念された。福岡市は8日、陥没箇所を中心
に東西約400メートル、南北約150メートルにある42棟で応急危険度判定を実
施。・・・
- 12. LDA準備
• 単語をカウント
# 他の2記事もdoc.2, doc.2として同様に読み込む(省略)
#複数文章をリスト化
doc.list <- NULLdoc.list <- list(doc.1, doc.2, doc.3)
names(doc.list) <- c("doc1", "doc2", "doc3")
library(lda)
# ターム行列作成(単語ごとにカウント)
term.table <- table(unlist(doc.list))
term.table <- sort(term.table, decreasing = TRUE)
# 単語一覧
vocab <- NULL
vocab <- names(term.table)
> head(term.table)
> 市 陥没 補償 1 道路 福岡
> 22 14 13 11 11 11
- 13. LDA準備
• 文章がどの単語に一致するかでindex化
get.terms <- function(x) {
index <- match(x, vocab)
index <- index[!is.na(index)]
rbind(as.integer(index - 1), as.integer(rep(1, length(index))))
}
documents <- NULL
documents <- lapply(doc.list, get.terms) > head(documents)
>$doc1
> [,1] [,2] [,3] [,4] [,5]
>[1,] 17 46 231 4 42
>[2,] 1 1 1 1 1
- 14. LDA準備
• LDA用の各種パラメータの準備
D <- length(documents) # 記事の数
W <- length(vocab) # 単語の数
doc.length <- sapply(documents, function(x) sum(x[2, ])) #記事ごとの単語数
N <- sum(doc.length) # トータルの単語数
term.frequency <- as.integer(term.table)
K <- 10 ## トピック数
G <- 200 ## 反復回数
alpha <- 0.02 #αパラメータ
eta <- 0.02 #ηパラメータ
トピック数は試行錯誤しながら調整
- 15. LDA実行
• LDAの実施とトピックの単語確認
library(lda)
set.seed(357)
fit <- lda.collapsed.gibbs.sampler(documents = documents, K = K, vocab = vocab,
num.iterations = G, alpha = alpha,
eta = eta, initial = NULL, burnin = 0,
compute.log.likelihood = TRUE)
# 各トピックにおける上位3位の単語の行列。
top.words <- top.topic.words(fit$topics, 3, by.score = TRUE)
print(top.words)
>print(top.words)
> [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
>[1,] "規模" "市" "補償" "くい" "棟" "こと" "福岡" "事業" "陥没" "現場”
>[2,] "警察" "事故" "者" "危険" "倒壊" "2" "5" "問い合わせ" "1" "道路”
>[3,] "7" "工事" "損失" "力" "福岡" "メートル" "詳しい" "JV" "4" "付近"
- 16. LDA実行
• LDAの実施とトピックの単語確認
library(lda)
set.seed(357)
fit <- lda.collapsed.gibbs.sampler(documents = documents, K = K, vocab = vocab,
num.iterations = G, alpha = alpha,
eta = eta, initial = NULL, burnin = 0,
compute.log.likelihood = TRUE)
# 各トピックにおける上位3位の単語の行列。
top.words <- top.topic.words(fit$topics, 3, by.score = TRUE)
print(top.words)
>print(top.words)
> [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
>[1,] "規模" "市" "補償" "くい" "棟" "こと" "福岡" "事業" "陥没" "現場”
>[2,] "警察" "事故" "者" "危険" "倒壊" "2" "5" "問い合わせ" "1" "道路”
>[3,] "7" "工事" "損失" "力" "福岡" "メートル" "詳しい" "JV" "4" "付近"
この状態だとよく分からないので可視化する
- 17. LDA-Vis
• パラメータ設定と実行
# パラメータ
theta <- t(apply(fit$document_sums + alpha, 2, function(x) x/sum(x)))
phi <- t(apply(t(fit$topics) + eta, 2, function(x) x/sum(x)))
# create the JSON object to feed the visualization:
display_word_num = 20 #表示する単語数
json <- createJSON(phi = phi,
theta = theta,
doc.length = doc.length,
vocab = vocab,
term.frequency = term.frequency,
R = display_word_num
)
## 古いvisフォルダがある場合はエラー出るので削除する事
serVis(json, out.dir = 'vis', open.browser = T )