32x32

TsVV 20.07.2018

Используем R для облегчения анализа научной литературы

Язык программирования R можно использовать не только для сложных вычислений, но и для облегчения рутинных операций при ознакомлении с научной литературой. Основной трудностью в этом плане, на мой взгляд, является уж очень большое количество публикаций практически по любой тематике, которых становится всё больше и больше. В итоге, актуальной задачей является облегчение труда исследователя. Хотя бы при подборе статей для прочтения.

 

 

1. Поиск литературы

Для поиска литературы я обычно использую следующие источники:

  1. Web of Science.
  2. Science Direct.
  3. Google Академия.

Для удобства поиска в Google Академии я использую расширение Google Scholar:

 

Я предпочитаю работать со статьями в формате pdf, поэтому использую сервис Kopernio, который ставится как расширение в браузер и упрощает поиск статей именно в формате pdf в перечисленных выше источниках:

 

Найденные статьи в формате pdf сохраняем на диске для последующей работы.

2. Поиск статей, содержащих ключевую фразу

Пространство — иллюзия, дисковое пространство — тем более.

Сохраняя файлы на диске, я стараюсь их классифицировать сразу. Но любая научная статья может попадать сразу в несколько категорий. Можно, конечно, делать несколько копий файлов — по одному в каждую категорию, но рано или поздно количество сохранённых файлов превысит разумные для запоминания пределы. Поэтому я пользуюсь следующим алгоритмом:

  1. Создать список всех статей.
  2. Найти те из них, что содержат нужную фразу.
  3. Открыть найденные файлы для просмотра.

2.1. Создание списка статей

Все файлы с расширением .pdf можно найти поиском, но чтобы этого не делать вручную, создадим командный файл pdf2list.cmd:

chcp 1251
forfiles /P "D:\Бібліотека" /M "*.pdf" /S /C "cmd /c if @isdir==FALSE echo @path" > pdf_list.txt
chcp 866

После запуска командного файла мы получаем файл pdf_list.txt, содержащий список всех файлов с расширением .pdf в папке D:\Бібліотека.

Обратите внимание, что каждая строка заключена в кавычки:

 

2.2. Поиск статей, содержащих ключевую фразу

Для поиска статей, содержащих определённую ключевую фразу, можно воспользоваться следующим скриптом R:

# Задаём строку для поиска
findText = 'natural language processing'

# Список полных путей к pdf, для обновления списка запускать pdf2list.cmd
inputFileList = './pdf_list.txt'

# Подключаем библиотеку для чтения текста из pdf
library(pdftools)

# Подключаем библиотеку для concatenate
library(ngram)

# Загружаем список файлов с полными путями
files = scan(inputFileList, what = array(" "), sep="\n") 

# Убираем " из текста
files = gsub("\"", "", files)

# Загружаем текст из файлов
texts <- lapply(files, pdf_text)

# Один документ - одна строка
text_df <- data_frame(doc = 1:length(texts), text = unlist(lapply(texts, concatenate)))

# Подключаем библиотеку для %like%
library(data.table)

# Узнаём номера документов, содержащих findText
pdfIndexes = text_df$doc[text_df$text %like% findText]

# Создаём список файлов, содержащих findText
fileList = files[pdfIndexes]

# Сохраняем 
write(fileList, 'fileList.txt') 

В результате получаем файл fileList.txt, содержащий пути к статьям, содержащим ключевую фразу.

Можно или искать каждый файл вручную, или открыть их все сразу.

2.3. Открыть все найденные файлы для просмотра

Открыть все файлы из fileList.txt можно с помощью следующего командного файла:

chcp 1251
FOR /F "tokens=*" %%i in (fileList.txt) do "C:\Program Files (x86)\Foxit Software\Foxit Reader\FoxitReader.exe" "%%i"
chcp 866

P.S. Если Вы пользуетесь другой программой для просмотра pdf, замените путь к программе.

3. Поиск статей с наибольшим упоминанием ключевых слов

Проблема поиска статей по ключевой фразе в том, что не учитывается сколько раз ключевые слова упоминаются в статье. Если найдено большое количество статей по ключевой фразе, то хотелось бы ранжировать их по частоте упоминания ключевых слов.

Для этого можно воспользоваться следующим скриптом R, записав ключевые слова в файл key_words.txt (каждое слово с новой строки):

# Список полных путей к pdf
inputFileList = './fileList.txt' 

# Ключевые слова
inputKeyWords = './key_words.txt'

# Подключаем библиотеку для чтения текста из pdf
library(pdftools)

# Подключаем библиотеку для работы с токенами
library(tidyverse)
library(tidytext)

# Подключаем библиотеку для concatenate
library(ngram)

# Загружаем список файлов с полными путями
files     = scan(inputFileList, what = array(" "), sep="\n")

# Загружаем список ключевых слов
key_words = scan(inputKeyWords, what = array(" "), sep="\n", encoding = "UTF-8")

# Загружаем текст из файлов
texts <- lapply(files, pdf_text)

# Загружаем список стоп-слов библиотеки tidytext
data(stop_words)

# Один документ - одна строка
text_df <- data_frame(doc = 1:length(texts), text = unlist(lapply(texts, concatenate)))

# Поиск всех слов
pdf_words <- text_df %>%
  unnest_tokens(word, text)

# Убираем стоп-слова
pdf_words <- pdf_words %>%
  anti_join(stop_words)

# Подсчитываем количество слов по документам
pdf_word_counts_by_doc <- pdf_words %>%
  count(doc, word, sort = TRUE) %>%
  ungroup()

# Сохранение результатов
write.csv2(pdf_word_counts_by_doc[pdf_word_counts_by_doc$word == key_words, ], 'pdf_word_counts_by_doc.csv', fileEncoding = "UTF-8")

По итогам работы скрипта мы получаем файл pdf_word_counts_by_doc.csv, содержащий номер документа (номер строки файла fileList.txt), ключевые слова и частоту их упоминания в каждом документе. Открыв файл либо в Excel, либо в LibreOffice Calc, получим примерно такую картину:

 

Для удобства можно воспользоваться инструментом Сводная таблица:

 

Таким образом легче найти релевантные статьи. Остаётся только прочитать. Но что делать, если вы не знаете язык, на котором написана статья?

4. Перевод иностранных статей с помощью переводчика Google

К примеру, Вы нашли файл pdf со статьёй на латышском/корейском/китайском языке. И после прочтения аннотации на английском языке хотите хоть в общих чертах понять о чём статья. Один из быстрых способов — использовать Переводчик Google.

Вот только при копировании текста из pdf файла приходиться вручную убирать переносы строк:

This is a sample
text that has copied
from PDF file.

При копировании большого куска текста это несколько утомляет. А если строки длинные, то эти переносы не особо то и видно:

Для исправления переносов можно использовать любой текстовый редактор с нумерацией строк, например Notepad++:

Скрипт R, который убирает переносы строк и копирует результат в буфер обмена, а потом открывает в браузере окно с переводчиком.

# Открываем файл с переносами (если без sep = '\n', то каждое слово отдельно)
txt = scan('./text_from_PDF.txt', what = character(), sep = '\n', encoding = "UTF-8")

# Соединяем все строки в одну
library(ngram)
newText = concatenate(txt)
  
# Сохраняем в файл одну строку без переносов
writeLines(newText, "./one-line_text.txt", useBytes = T)

# Открываем переводчик гугл, а текст передаём в буфер обмена
url = 'https://translate.google.com.ua/#en/uk/'
writeClipboard(newText)
browseURL(url)

Копируем текст из pdf файла в text_from_PDF.txt и запускаем скрипт. Для удобства я рекомендую использовать IDE RStudio.

Остаётся только вставить текст из буфера обмена комбинацией клавиш Ctrl + V.

В случае, если текст из буфера вставляется в неправильной кодировке, то открываем файл one-line_text.txt.

Если процедура разовая, то вручную всё исправить проще.

Выводы

Если Вам кажется, что всё описанное здесь излишне, то, возможно, в Вашем случае так и есть. Но на больших объёмах данный скрипт позволяет сэкономить время и нервы.