トピックモデルを使った文献スクリーニング

データの準備

約10万文献を使用。
下記を参照。
touch-sp.hatenablog.com

トピックモデルの作成

library(text2vec)

#データの読み込み
new_stopwords <- readRDS("new_stopwords")
Absts <- readLines("Absts_train.txt")

#単語の抽出
it <- itoken(Absts, tolower, word_tokenizer)
voc <- create_vocabulary(it, stopwords = new_stopwords)
voc <- prune_vocabulary(voc, doc_count_min = 5L)
voc <- voc[!grepl("^[0-9]*$", voc$term),]

dtm <- create_dtm(it, vocab_vectorizer(voc))

lda_model <- LDA$new(n_topics = 10, doc_topic_prior = 0.1, topic_word_prior = 0.01)

doc_topic_distr <-
    lda_model$fit_transform(x = dtm, n_iter = 1000,
                            convergence_tol = 0.001, n_check_convergence = 25,
                            progressbar = FALSE)

新しいデータに適応

pmid <- readLines("PMID_456.txt")
Absts <- readLines("Absts_456.txt")

cq = "smoking increase risk mortality cardiovascular disease development renal failure patient with CKD"

#データにCQを追加
Absts <- c(cq, Absts)
pmid <- c("0000", pmid)

it <- itoken(Absts, tolower, word_tokenizer, ids = pmid)

dtm <- create_dtm(it, vocab_vectorizer(voc))

new_topic <- lda_model$transform(dtm)

answer <- new_topic["0000",, drop = FALSE]
cos_sim <- sim2(x = new_topic, y = answer, method = "cosine", norm = "l2")
result <- sort(cos_sim[, 1], decreasing = TRUE)[-1]

結果の確認

seikai <- readLines("seikai.txt")
bar <- names(result) %in% seikai
barplot(bar, axes = F)

もともとのばらつき。
f:id:touch-sp:20180130184216p:plain
実施後。
f:id:touch-sp:20180202105221p:plain

データ加工

library(tm)
Absts <- stemDocument(Absts, "en")

voc <- prune_vocabulary(voc, doc_count_min = 10L)

もともとのばらつき。
f:id:touch-sp:20180130184216p:plain
データ加工なし。
f:id:touch-sp:20180202105221p:plain
データ加工あり。
f:id:touch-sp:20180202113051p:plain

トピック数を増やす

lda_model <- LDA$new(n_topics = 20, doc_topic_prior = 0.1, topic_word_prior = 0.01)

もともとのばらつき。
f:id:touch-sp:20180130184216p:plain
トピック数10
f:id:touch-sp:20180202113051p:plain
トピック数を増やす。(n=20)
f:id:touch-sp:20180202121225p:plain

さらにトピック数を増やす

lda_model <- LDA$new(n_topics = 30, doc_topic_prior = 0.1, topic_word_prior = 0.01)

もともとのばらつき。
f:id:touch-sp:20180130184216p:plain
トピック数を増やす。(n=20)
f:id:touch-sp:20180202121225p:plain
さらにトピック数を増やす。(n=30)
f:id:touch-sp:20180202123427p:plain