“Люди часто восхваляют классические произведения, даже не читая их”, — Марк Твен.

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

Что такое анализ текста?

Анализ текста — это процесс изучения неструктурированных данных, которые представлены в форме текста. Ее задача —  получить представление о паттернах и интересующих темах.

Почему она так важна?

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

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

R является и языком, и средой для статистических вычислений и графики.

Поехали

Мы собираемся установить пакет gutenbergr, чтобы получить доступ в библиотеку общедоступных книг и публикаций. 

Пакет gutenbergr поможет загрузить и обработать по областям открытые работы из коллекции Project Gutenberg. В него входят также инструменты для загрузки книг (и разбора заголовка/информации в нижнем колонтитуле), а ещё полный датасет метаданных Project Gutenberg, который можно использовать для поиска слов, предоставляющих интерес. 

Давайте установим и загрузим библиотеку в R Studio.

install.packages("gutenbergr")library(gutenbergr)

Книги Марка Твена

Сейчас мы собираемся извлечь несколько книг авторства Марка Твена из библиотеки gutenbergr.

В библиотеке gutenbergr каждая книга маркирована идентификационным номером (ID). Нам он понадобится для установления их местонахождения.

mark_twain <- gutenberg_download(c(76, 74, 3176, 245))

При помощи функции gutenberg_download берём книги и сохраняем их в датафрейм mark_twain.

Скриншот датафрейма mark_twain

При помощи R книги помещаются в отдельные строчки и соотносятся со столбцом по релевантному ID-номеру. Очевидно, что данные достаточно беспорядочные и на этом этапе приносят не слишком много пользы анализу.

Идентификация стоп-слов

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

Для начала нам нужно загрузить библиотеку tidytext.

library(tidytext)

Дальше мы просмотрим stop_words во всей базе данных R (не в книгах Марка Твена).

data(stop_words)
Так выглядят первые несколько строк функции stop_words 

Обратите внимание, что у нас получилось 1,139 строк.

Токенизация и удаление стоп-слов

Для удаления стоп-слов и токенизации нашего текста используем метод “трубопровода” из библиотеки dplyr.

Токенизация — это задача по разделению текста на кусочки.

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

Источник: Стэндфордский пример ОЕЯ (обработки естественного языка) — Токенизации

Мы совместим в одну цепочку (piping) несколько шагов, чтобы удалить стоп-слова, пока будет происходить токенизация датафрейма mark_twain.

library(dplyr)

tidy_mark_twain <- mark_twain %>%
  unnest_tokens(word, text) %>% #tokenize 
  anti_join(stop_words) #remove stop words

print(tidy_mark_twain)

Шаги:

  1. Формула unnest tokens и проходы по входным данным нужны, чтобы определить, что именно мы хотим подвергнуть токенизации и где получить доступ к тексту. 
  2. При помощи anti_join мы в значительной степени исключаем все слова, которые находятся в базе данных stop_words.
  3. Сохраняем всю нашу работу в новую переменную tidy_mark_twain.
  4. Посмотрите:
Видно, что слова разделены и ID-номер книги указывает на них

Обратите внимание, что с тех пор, как каждый объект подвергся токенизации, у нас стало 182,706 строчек! Это потому, что каждое слово теперь находится в отдельной строчке.

Частотное распределение слов

Наша задача — найти паттерны в данных. Частотное распределение слов  —  это отличный способ увидеть, какие слова нужно сортировать и искать.

tidy_mark_twain %>%
  count(word, sort=TRUE)
Самое популярное слово — время

Если вы читали любую из книг Марка Твена, то не удивитесь, что Том — это второе по популярности слово. А еще интереснее, что самое популярное слово “время” встречается 1226 раз!

Визуализация данных

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

library(ggplot2)

freq_hist <-tidy_mark_twain %>%
  count(word, sort=TRUE) %>%
  filter(n > 400) %>%
  mutate(word = reorder(word,n )) %>%
  ggplot(aes(word, n))+
  geom_col(fill= 'lightgreen')+
  xlab(NULL)+
  coord_flip()

print(freq_hist)

Некоторые ключевые шаги, которые нужно пройти, чтобы получить точный граф:

  1. filter() нужен, чтобы убедиться, что мы не выведем количество для каждого слова, которое встречается в тексте. Это было бы слишком много. Так мы устанавливаем границу слов, которые встречаются чаще, чем 400 раз.
  2. mutate() нужен, чтобы организовать представление слов в лучшем виде.
  3. coord_flip() нужен, чтобы развернуть граф и сделать его привлекательнее визуально.

Заключение

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

Читайте также:


Перевод статьи Jason Lee: Text Analytics in R

Предыдущая статьяЛучшие практики JavaScript — производительность
Следующая статья9 бесплатных курсов по программированию от Гарварда, MIT, IBM, Google и Microsoft