ガイドライン作成時の文献1次スクリーニング

目標

約450文献から16文献を抽出する。
(実際に過去に行った作業であり16文献はその結果である)
まずは16文献がどのように散らばっているかを見てみよう。
f:id:touch-sp:20180130184216p:plain
まんべんなく散らばっていることがわかる。
今回はそれらを集めることが目標。

データの準備

約10万文献から作成した「voc」「word_vectors」を使用。
下記を参照。
touch-sp.hatenablog.com

実際の作業

library(text2vec)

voc <- readRDS("voc")
word_vectors <- readRDS("word_vectors")

pmid <- readLines("PMID.txt")
Absts <- readLines("Absts.txt")

#CQを想定して適当に単語を羅列
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))

model_tfidf = TfIdf$new(smooth_idf = FALSE, sublinear_tf = TRUE, norm = "l1")
dtm_tfidf = model_tfidf$fit_transform(dtm)

doc_vectors <- dtm_tfidf %*% word_vectors

answer <- doc_vectors["0000",, drop = FALSE]
cos_sim <- sim2(x = doc_vectors, 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:20180130185158p:plain
少しは左に片寄ったと思うがまだまだ不十分のような気がする。

データの加工(1)

trim <- function(input_string) {
    result <- gsub("\\bincreasing\\b", "increase", input_string, ignore.case = TRUE, perl = TRUE)
    result <- gsub("\\bincreases\\b", "increase", result, ignore.case = TRUE, perl = TRUE)
    result <- gsub("\\bincreased\\b", "increase", result, ignore.case = TRUE, perl = TRUE)

    result <- gsub("\\bdecreasing\\b", "decrease", result, ignore.case = TRUE, perl = TRUE)
    result <- gsub("\\bdecreases\\b", "decrease", result, ignore.case = TRUE, perl = TRUE)
    result <- gsub("\\bdecreased\\b", "decrease", result, ignore.case = TRUE, perl = TRUE)

    result <- gsub("\\bfactors\\b", "factor", result, ignore.case = TRUE, perl = TRUE)

    result <- gsub("diseases", "disease", result, ignore.case = TRUE)
    result <- gsub("patients", "patient", result, ignore.case = TRUE)

    return(result)
}
#データの加工
Absts <- sapply(Absts, trim)

もともとのばらつき。
f:id:touch-sp:20180130184216p:plain
データ加工なし。
f:id:touch-sp:20180130185158p:plain
データ加工あり(1)
f:id:touch-sp:20180130202303p:plain
残念ながらあまりかわらなかった。

データの加工(2)

library(tm)
Absts <- stemDocument(Absts)

もともとのばらつき。
f:id:touch-sp:20180130184216p:plain
データ加工なし。
f:id:touch-sp:20180130185158p:plain
データ加工あり(1)
f:id:touch-sp:20180130202303p:plain
データ加工あり(2)
f:id:touch-sp:20180201135047p:plain
少し改善。

vocを減らす

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

もともとのばらつき。
f:id:touch-sp:20180130184216p:plain
データ加工なし。
f:id:touch-sp:20180130185158p:plain
データ加工あり(1)
f:id:touch-sp:20180130202303p:plain
データ加工あり(2)
f:id:touch-sp:20180201135047p:plain
vocを減らす
f:id:touch-sp:20180201182420p:plain

正則化なし

model_tfidf = TfIdf$new(smooth_idf = FALSE, sublinear_tf = TRUE, norm = "none")

もともとのばらつき。
f:id:touch-sp:20180130184216p:plain
データ加工なし。
f:id:touch-sp:20180130185158p:plain
データ加工あり(1)
f:id:touch-sp:20180130202303p:plain
データ加工あり(2)
f:id:touch-sp:20180201135047p:plain
vocを減らす
f:id:touch-sp:20180201182420p:plain
正則化なし
f:id:touch-sp:20180201174256p:plain
正則化ありなしでは全く変化なし。