見出し画像

【R】easyPubMedとDeepL API keyでPubMed論文を収集しabstractを自動和訳する。

●初めに

以前の記事でも取り上げた、PubMed収集に便利なeasyPubMed

大量の論文を収集可能ですが、英語なので内容を誰かに共有する際に和訳するのが面倒なことがあります。
論文和訳に強い翻訳サービスDeepLを使うにもコピペするのは面倒。

そんな中、DeepL API keyを使ってRで翻訳を行う記事を見つけました。

R言語で、現在最強の機械翻訳ツール「DeepL API」を使ってみた件https://skume.net/entry/2021/06/13/235245

上のサイトを参考に、easyPubMedで収集したabstractを自動で翻訳してみました。

WindowsローカルRstudioではUTF-8⇔CP932問題でうまくいかなかったので、Docker Rstudio serverでやっています。

●easyPubMedで論文を収集

# cache clear
rm(list = ls())
gc()
gc()
# load package
if (!require("pacman")) install.packages("pacman")
pacman::p_load(
 tidyverse,
 lubridate,
 easyPubMed
)

# search_word
query <- "Rstudio"

# search whole period
pubmedidlist <- get_pubmed_ids(query)
pubmedidlist$Count

# specify search range
to <- gsub("-", "/", Sys.Date())
from <- gsub("-", "/", Sys.Date() - 60) # 60 days
Querytime <- str_c(' AND("', from, '"[PDat] : "', to, '"[PDat])')
Query <- query %>% str_c(Querytime)
pubmedidlist <- get_pubmed_ids(Query)
pubmedidlist$Count

# create url
# pubmedid <- fetch_all_pubmed_ids(pubmedidlist)
# pubmedidstr <- pubmedid %>% str_c(collapse = ",")
# pubmedidstr %>% str_c("https://www.ncbi.nlm.nih.gov/pubmed/", .) # create PubMed URL from id

papers <- fetch_pubmed_data(pubmedidlist, encoding = "UTF-8")

# create for-loop list
articlelist <- papers %>% articles_to_list()
narticles <- length(articlelist)
pmid <- numeric(narticles)
year <- numeric(narticles)
day <- numeric(narticles)
month <- numeric(narticles)
lastname <- character(narticles)
firstname <- character(narticles)
title <- character(narticles)
abstract <- character(narticles)
journal <- character(narticles)


for (i in 1:narticles) {
 df <- articlelist[[i]] %>% article_to_df(max_chars = 10000)
 pmid[i] <- df[1, ]$pmid %>% as.numeric()
 year[i] <- df[1, ]$year %>% as.numeric()
 month[i] <- df[1, ]$month %>% as.numeric()
 day[i] <- df[1, ]$day %>% as.numeric()
 lastname[i] <- df[1, ]$lastname
 firstname[i] <- df[1, ]$firstname
 title[i] <- df[1, ]$title
 abstract[i] <- df[1, ]$abstract
 journal[i] <- df[1, ]$journal
}

filename <- paste(ymd(Sys.Date()), "_", query, "_PubMed.csv", sep = "")

result <- data.frame(
 pmid = pmid,
 date = paste(year, month, day, sep = "-") %>% ymd(),
 name = paste(lastname, firstname, sep = " "),
 title = title,
 abstract = abstract,
 journal = journal,
 url = paste("https://www.ncbi.nlm.nih.gov/pubmed/", pmid, sep = "")
) %>%
 arrange(desc(date)) %>%
 slice(1:10) # 10 papers

画像1

「RStudio」が含まれる過去60日分の論文を検索し、10論文を抽出しました。

● DeepL API keyをRで使用

サイトを参考にDeepL API keyを取得し、翻訳する関数を定義します。

# curlを用いて、DeepL APIを実行する関数を定義
deepL <- function(Sentence, source_lang = "EN", target_lang = "JA", api_key = api_key) {
 a <- system(
   paste0(
     'curl -s https://api-free.deepl.com/v2/translate -d "auth_key=',
     api_key,
     '" -d "text=',
     str_replace_all(Sentence, pattern = '"', replacement = "'"), # 翻訳文中に""があるとpaste0と干渉してエラーを起こすので''に変換
     '" -d source_lang="',
     source_lang,
     '" -d "target_lang=',
     target_lang,
     '"'
   ),
   intern = T
 )
 b <- strsplit(
   strsplit(
     as.character(a),
     '\"text\":\"'
   )[[1]][2],
   '\"}]}'
 )[[1]][1]
 Sys.sleep(1)

 return(b)
}

早速使ってみます。

# 入力文字列
api_key <- "********"
# from Macbeth
Sentence <- "Tomorrow, and tomorrow, and tomorrow
Creeps in this petty pace from day to day,
To the last syllable of recorded time;
And all our yesterdays have lighted fools
The way to dusty death. Out, out, brief candle!
Life's but a walking shadow, a poor player
That struts and frets his hour upon the stage
And then is heard no more. It is a tale
Told by an idiot, full of sound and fury
Signifying nothing."
source_lang <- "EN"
target_lang <- "JA"

# 翻訳
deepL(
 Sentence = Sentence,
 source_lang = source_lang,
 target_lang = target_lang,
 api_key = api_key
)

[1] "明日、明日、明日と、この些細なペースで日々刻まれ、記録された時間の最後の音節まで;そして、すべての我々の昨日は、埃まみれの死への道を愚者に灯してきたのだ。出て行け、出て行け、短い蝋燭よ!人生は歩く影に過ぎず、舞台の上で自分の時間を闊歩し、気ままに過ごす哀れな役者に過ぎず、その後はもう聞くこともない。それは馬鹿が語る物語、音と怒りに満ち溢れ、何の意味もない。"

ちゃんと翻訳できています。

●DeepL API keyでabstractを翻訳

translation <- map(result$abstract, function(x) {
 deepL(
   Sentence = x,
   source_lang = source_lang,
   target_lang = target_lang,
   api_key = api_key
 )
})
result2 <- mutate(result, abstract_ja = translation)

画像2

いい感じに翻訳できていそうです。


●おまけ 日本語の校正

DeepL先生は非常に日本語がうまいので、文章が下手な日本語でも
日本語→英語に翻訳→日本に翻訳
とするとそこそこいい感じに修正してくれることがあります。

"すごくそういうのって難しい問題だと思うんですけれどもなかなかいい感じに簡単な風に言い換えるのはちょっと誰でもできる感じじゃなくて要するに結構勉強してないと辛いものがあるんじゃないかって形があって一言で言うと誰でもできることじゃないです。"

上の極めて適当な文章を直してみましょう。
作成したdeepL関数のsource_langとtarget_langを入れ替えて二回使ってやります。

Sentence <- "すごくそういうのって難しい問題だと思うんですけれどもなかなかいい感じに簡単な風に言い換えるのはちょっと誰でもできる感じじゃなくて要するに結構勉強してないと辛いものがあるんじゃないかって形があって一言で言うと誰でもできることじゃないです。"
source_lang <- "JA"
target_lang <- "EN"
deepL(
 Sentence = Sentence,
 source_lang = source_lang,
 target_lang = target_lang,
 api_key = api_key
) %>% 
 deepL(
   source_lang = target_lang,
   target_lang = source_lang,
   api_key = api_key
 )

[1] "これは非常に難しい問題だと思うのですが、誰でも簡単に解けるようなものではなく、要するに相当な勉強が必要なものなのです。"

途中の要素は省略されていますが簡潔になりました。
議事録の冗長になりがちな口語を要約する際に力を発揮したりします。

●実行環境

> devtools::session_info()
─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
setting  value
version  R version 4.1.3 (2022-03-10)
os       Ubuntu 20.04.4 LTS
system   x86_64, linux-gnu
ui       RStudio
language (EN)
collate  ja_JP.UTF-8
ctype    ja_JP.UTF-8
tz       Etc/UTC
date     2022-04-10
rstudio  2022.02.1+461 Prairie Trillium (server)
pandoc   2.17.1.1 @ /usr/local/bin/pandoc

─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
package     * version  date (UTC) lib source
assertthat    0.2.1    2019-03-21 [1] RSPM (R 4.1.0)
backports     1.4.1    2021-12-13 [1] RSPM (R 4.1.0)
brio          1.1.3    2021-11-30 [1] RSPM (R 4.1.0)
broom         0.7.12   2022-01-28 [1] RSPM (R 4.1.0)
cachem        1.0.6    2021-08-19 [1] RSPM (R 4.1.0)
callr         3.7.0    2021-04-20 [1] RSPM (R 4.1.0)
cellranger    1.1.0    2016-07-27 [1] RSPM (R 4.1.0)
cli           3.2.0    2022-02-14 [1] RSPM (R 4.1.0)
colorspace    2.0-3    2022-02-21 [1] RSPM (R 4.1.0)
crayon        1.5.1    2022-03-26 [1] RSPM (R 4.1.0)
DBI           1.1.2    2021-12-20 [1] RSPM (R 4.1.0)
dbplyr        2.1.1    2021-04-06 [1] RSPM (R 4.1.0)
desc          1.4.1    2022-03-06 [1] RSPM (R 4.1.0)
devtools      2.4.3    2021-11-30 [1] RSPM (R 4.1.0)
digest        0.6.29   2021-12-01 [1] RSPM (R 4.1.0)
dplyr       * 1.0.8    2022-02-08 [1] RSPM (R 4.1.0)
easyPubMed  * 2.13     2019-03-29 [1] RSPM (R 4.1.0)
ellipsis      0.3.2    2021-04-29 [1] RSPM (R 4.1.0)
fansi         1.0.3    2022-03-24 [1] RSPM (R 4.1.0)
fastmap       1.1.0    2021-01-25 [1] RSPM (R 4.1.0)
forcats     * 0.5.1    2021-01-27 [1] RSPM (R 4.1.0)
fs            1.5.2    2021-12-08 [1] RSPM (R 4.1.0)
generics      0.1.2    2022-01-31 [1] RSPM (R 4.1.0)
ggplot2     * 3.3.5    2021-06-25 [1] RSPM (R 4.1.0)
glue          1.6.2    2022-02-24 [1] RSPM (R 4.1.0)
gtable        0.3.0    2019-03-25 [1] RSPM (R 4.1.0)
haven         2.4.3    2021-08-04 [1] RSPM (R 4.1.0)
hms           1.1.1    2021-09-26 [1] RSPM (R 4.1.0)
httr          1.4.2    2020-07-20 [1] RSPM (R 4.1.0)
jsonlite      1.8.0    2022-02-22 [1] RSPM (R 4.1.0)
lifecycle     1.0.1    2021-09-24 [1] RSPM (R 4.1.0)
lubridate   * 1.8.0    2021-10-07 [1] RSPM (R 4.1.0)
magrittr      2.0.3    2022-03-30 [1] RSPM (R 4.1.0)
memoise       2.0.1    2021-11-26 [1] RSPM (R 4.1.0)
modelr        0.1.8    2020-05-19 [1] RSPM (R 4.1.0)
munsell       0.5.0    2018-06-12 [1] RSPM (R 4.1.0)
pacman      * 0.5.1    2019-03-11 [1] RSPM (R 4.1.0)
pillar        1.7.0    2022-02-01 [1] RSPM (R 4.1.0)
pkgbuild      1.3.1    2021-12-20 [1] RSPM (R 4.1.0)
pkgconfig     2.0.3    2019-09-22 [1] RSPM (R 4.1.0)
pkgload       1.2.4    2021-11-30 [1] RSPM (R 4.1.0)
prettyunits   1.1.1    2020-01-24 [1] RSPM (R 4.1.0)
processx      3.5.3    2022-03-25 [1] RSPM (R 4.1.0)
ps            1.6.0    2021-02-28 [1] RSPM (R 4.1.0)
purrr       * 0.3.4    2020-04-17 [1] RSPM (R 4.1.0)
R.cache       0.15.0   2021-04-30 [1] RSPM (R 4.1.0)
R.methodsS3   1.8.1    2020-08-26 [1] RSPM (R 4.1.0)
R.oo          1.24.0   2020-08-26 [1] RSPM (R 4.1.0)
R.utils       2.11.0   2021-09-26 [1] RSPM (R 4.1.0)
R6            2.5.1    2021-08-19 [1] RSPM (R 4.1.0)
Rcpp        * 1.0.8.3  2022-03-17 [1] RSPM (R 4.1.0)
readr       * 2.1.2    2022-01-30 [1] RSPM (R 4.1.0)
readxl        1.4.0    2022-03-28 [1] RSPM (R 4.1.0)
rematch2      2.1.2    2020-05-01 [1] RSPM (R 4.1.0)
remotes       2.4.2    2021-11-30 [1] RSPM (R 4.1.0)
reprex        2.0.1    2021-08-05 [1] RSPM (R 4.1.0)
rlang         1.0.2    2022-03-04 [1] RSPM (R 4.1.0)
rprojroot     2.0.2    2020-11-15 [1] RSPM (R 4.1.0)
rsconnect     0.8.25   2021-11-19 [1] RSPM (R 4.1.0)
rstudioapi    0.13     2020-11-12 [1] RSPM (R 4.1.0)
rvest       * 1.0.2    2021-10-16 [1] RSPM (R 4.1.0)
scales        1.1.1    2020-05-11 [1] RSPM (R 4.1.0)
sessioninfo   1.2.2    2021-12-06 [1] RSPM (R 4.1.0)
stringi     * 1.7.6    2021-11-29 [1] RSPM (R 4.1.0)
stringr     * 1.4.0    2019-02-10 [1] RSPM (R 4.1.0)
styler        1.7.0    2022-03-13 [1] RSPM (R 4.1.0)
testthat      3.1.3    2022-03-29 [1] RSPM (R 4.1.0)
tibble      * 3.1.6    2021-11-07 [1] RSPM (R 4.1.0)
tidyr       * 1.2.0    2022-02-01 [1] RSPM (R 4.1.0)
tidyselect    1.1.2    2022-02-21 [1] RSPM (R 4.1.0)
tidyverse   * 1.3.1    2021-04-15 [1] RSPM (R 4.1.0)
tzdb          0.3.0    2022-03-28 [1] RSPM (R 4.1.0)
usethis       2.1.5    2021-12-09 [1] RSPM (R 4.1.0)
utf8          1.2.2    2021-07-24 [1] RSPM (R 4.1.0)
vctrs         0.4.0    2022-03-30 [1] RSPM (R 4.1.0)
withr         2.5.0    2022-03-03 [1] RSPM (R 4.1.0)
XML         * 3.99-0.9 2022-02-24 [1] RSPM (R 4.1.0)
xml2          1.3.3    2021-11-30 [1] RSPM (R 4.1.0)

[1] /usr/local/lib/R/site-library
[2] /usr/local/lib/R/library

──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

以上です。
ご覧いただきありがとうございました。