
TsVV 20.07.2018
Используем R для облегчения анализа научной литературы
Язык программирования R можно использовать не только для сложных вычислений, но и для облегчения рутинных операций при ознакомлении с научной литературой. Основной трудностью в этом плане, на мой взгляд, является уж очень большое количество публикаций практически по любой тематике, которых становится всё больше и больше. В итоге, актуальной задачей является облегчение труда исследователя. Хотя бы при подборе статей для прочтения.
1. Поиск литературы
Для поиска литературы я обычно использую следующие источники:
Для удобства поиска в Google Академии я использую расширение Google Scholar:
Я предпочитаю работать со статьями в формате pdf, поэтому использую сервис Kopernio, который ставится как расширение в браузер и упрощает поиск статей именно в формате pdf в перечисленных выше источниках:
Найденные статьи в формате pdf сохраняем на диске для последующей работы.
2. Поиск статей, содержащих ключевую фразу
Пространство — иллюзия, дисковое пространство — тем более.
Сохраняя файлы на диске, я стараюсь их классифицировать сразу. Но любая научная статья может попадать сразу в несколько категорий. Можно, конечно, делать несколько копий файлов — по одному в каждую категорию, но рано или поздно количество сохранённых файлов превысит разумные для запоминания пределы. Поэтому я пользуюсь следующим алгоритмом:
- Создать список всех статей.
- Найти те из них, что содержат нужную фразу.
- Открыть найденные файлы для просмотра.
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.
Если процедура разовая, то вручную всё исправить проще.
Выводы
Если Вам кажется, что всё описанное здесь излишне, то, возможно, в Вашем случае так и есть. Но на больших объёмах данный скрипт позволяет сэкономить время и нервы.