Date Редакция Категория comp Теги R / API

01-DataMiningCloud.png

Подобную картинку вы наверняка видели уже не раз. Это — «облако слов». Оно позволяет наглядно представить ключевые слова, содержащиеся в документе, и широко используется в интеллектуальном анализе текстов (text mining). Мы научимся строить такие облака самостоятельно, а кроме того подключаться к Twitter, получать из него данные и анализировать их с помощью пакета R.

Облако слов (word cloud) или, как его еще называют, облако тегов (tag cloud) — это визуальное представление списка ключевых слов какого-либо текста. Важность каждого ключевого слова (частота его упоминания) обозначается в облаке размером шрифта и цветом.

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

Облако, которое вы видели в заголовке, построено по данным Twitter с помощью R — открытого пакета для статистической обработки и анализа данных. В последние годы R стал в этой области стандартом де-факто. О его популярности можно судить по числу имеющихся расширений пакета: их уже почти 6000 — буквально на все случаи жизни практикующего статистика.

Замечу, что если ограничиться построением облака слов, то для этого есть более простые способы. Зато мы решаем сразу три задачи: строим облако, знакомимся с R и учимся использовать Twitter. Кроме того, наш подход можно развивать, ведь возможности R в области анализа текстов далеко не ограничиваются построением облака слов, а подключение к Twitter — лишь пример использования API социальной сети для сбора данных.

1. Установка R

Сам R, а также официальная документация к нему и дополнительные пакеты распространяются через сеть ftp- и web-серверов, называемую CRAN (Comprehensive R Archive Network). В настоящее время в мире доступны более 60 зеркал CRAN. Поэтому, в первую очередь, идем сюда, выбираем подходящее зеркало, тип операционной системы и скачиваем R.

Запустив инсталляционный файл, следуем указаниям программы-установщика. Здесь можно соглашаться со всем. Единственный момент, который потребует вашего внимания — выбор разрядности операционной системы

Выбор компонентов в ходе установки R под Windows

2. Получение доступа к Twitter API

Чтобы получить ключи доступа к Twitter API у вас должен быть зарегистрирован аккаунт на Twitter и в этом аккаунте указан ваш мобильный телефон. Создать такой аккаунт — дело нескольких минут.

Теперь нужно создать приложение (app) для Twitter-а.

Входим в свой аккаунт и идем в раздел Developers, а оттуда — в Documentation, раздел Manage My Apps.

03-TwitterManageMyApps.png

Жмем кнопку “Create New App” и заполняем следующую форму:

04-TwitterCreateAnApplication.png

Имя вашего приложения (Name) должно быть уникальным, иначе система не позволит его создать. Адрес веб-сайта (Website) должен быть оформлен по правилам оформления веб-адресов, но не обязательно должен быть реальным — можно ввести «заглушку», например, http://tests.by/ — больше этот адрес нам не понадобится.

После того как система подтвердит создание приложения, во вкладке Keys and Access Tokens мы найдем нужные ключи.

Теперь нам нужно установить пакет расширения R — twitteR, отвечающий за поиск данных в Twitter-е.

Rемарка 1. Установка и запуск пакета. Для установки дополнительных пакетов наберем в командном окне R команду:

> install.packages("имяПакета")

Выбираем зеркало CRAN из списка, и пакет будет установлен.

Загрузка функций пакета осуществляется командой:

> library(имяПакета)

В нашем случае имяПакета — это twitteR.

Командное окно R

Rемарка 2. Имена и присваивание. Язык R обладает некоторыми особенностями или, если угодно, странностями. Так, в именах переменных и функций допустимо использовать точку. Ее нередко применяют для разделения смысловых частей имени, подобно тому как в других языках используют символ подчеркивания. Именно это мы наблюдаем в функции install.packages(). Оператор присваивания в R выглядит как ’<-’. Присваивать можно и привычным ’=’, но его применение имеет некоторые нюансы, и главное — оно не поддерживается старыми версиями R.

Подключение к Twitter из R. Для этого вам понадобятся данные с вкладки Keys and Access Tokens (API Key, API Secret, Access Token и Access Token Secret) вашего Twitter-приложения. Их мы передадим функции setup_twitter_oauth() из пакета twitteR, которая непосредственно выполняет аутентификацию.

Введем в командном окне R:

> library(twitteR)
> api_key <- "ВАШ API KEY"
> api_secret <- "ВАШ API SECRET"
> access_token <- "ВАШ ACCESS TOKEN"
> access_token_secret <- "ВАШ ACCESS TOKEN SECRET"
> setup_twitter_oauth(api_key,api_secret,access_token,access_token_secret)

После того как R доложит от успешном подключении, можно приступать к поиску. Например, следующая команда позволяет загрузить 500 твитов, содержащих строку "data mining":

searchTwitter("data mining", n=500)

Какие пакеты нам нужны. Помимо twitteR, нам понадобятся пакеты: tm — для анализа текста (text mining) и wordcloud — для создания облака слов.

3. Построение облака слов

Чтобы построить облако слов нужно:

  1. Получить данные для анализа, в нашем случае — твиты. Но это может быть и обычный текстовый файл.
  2. Выделить текст из твитов.
  3. Создать лексический корпус и терм-документную матрицу (с помощью функций пакета tm).
  4. Получить ключевые слова и частоту их упоминания.
  5. Нарисовать облако слов.

Шаг 1. Получим твиты и сохраним их в переменной tweets:

tweets <- searchTwitter("data mining", n=500, lang="en")

Ограничимся пока твитами на английском языке.

Rемарка 3. Типы данных. Основным типом данных в R является вектор — последовательность данных одного типа. Векторы бывают числовые и символьные. Пример создания символьного вектора: c("first", "second", "third"). Функция c() выполняет конкатенацию. Скаляров как таковых нет, скаляром считается вектор, состоящий из одного элемента. Есть еще списки — они похожи на векторы, но могут хранить элементы любого типа.

Для хранения двумерных данных существуют матрицы и таблицы (data frame). Матрицы быстрее, но могут хранить только один тип данных. Таблицы могут хранить в разных колонках данные разных типов и, кроме того, к колонкам можно обращаться по имени, а не по индексу.

Шаг 2. К каждому твиту применим функцию выделения текста:

text = sapply(tweets, function(x) x$getText())

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

Терм-документная матрица описывает частоту терминов, которые встречаются в документах корпуса: строки матрицы соответствуют документам, столбцы — терминам. Значение элемента матрицы равно частоте употребления термина в документе. Для построения лексического корпуса и терм-документной матрицы используются функции Corpus() и TermDocumentMatrix():

corpus <- Corpus(VectorSource(text))
tdm <- TermDocumentMatrix(corpus,
         control = list(removePunctuation = TRUE,
         stopwords = c("data", "mining", stopwords("english")),
         removeNumbers = TRUE,
         tolower = TRUE))

С помощью параметра control мы выполняем очистку текста от символов пунктуации, стоп-слов (например, артиклей английского языка), чисел и переводим все буквы в строчные.

Шаг 4. Сохраним терм-документную матрицу как обычную матрицу, отсортируем частоты в порядке убывания и сохраним результат в виде таблицы:

m <- as.matrix(tdm)
word_freqs <- sort(rowSums(m), decreasing=TRUE)
dm <- data.frame(word=names(word_freqs), freq=word_freqs)

Напомню, что ‘.’ в data.frame — это часть имени, а не оператор доступа к полям структуры.

Шаг 5. Осталось лишь нарисовать облако. Это делается функцией wordcloud() одноименного пакета:

wordcloud(dm$word, dm$freq, random.order=FALSE, colors=brewer.pal(8, "Dark2"))

dm$word, dm$freq обращаются к полям word и freq таблицы dm. brewer.pal() — функция, создающая цветовую палитру. В нашем случае она берет 8 цветов из готовой палитры Dark2. Посмотреть все доступные палитры можно здесь.

Можно сохранить историю команд c помощью меню «Файл», исправить ее, если нужно, а затем загрузить с помощью все того же меню полученный скрипт (текстовый файл с расширением .r или .R). В нем всего 16 строк:

library(twitteR)
library(tm)
library(wordcloud)

api_key <- "..."
api_secret <- "..."
access_token <- "..."
access_token_secret <- "..."
setup_twitter_oauth(api_key,api_secret,access_token,access_token_secret)

tweets <- searchTwitter("data mining", n=500, lang="en")
text <- sapply(tweets, function(x) x$getText())

corpus <- Corpus(VectorSource(text))
tdm <- TermDocumentMatrix(corpus, control = list(removePunctuation = TRUE, stopwords = c("data", "mining", stopwords("english")), removeNumbers = TRUE, tolower = TRUE))

m <- as.matrix(tdm)
word_freqs <- sort(rowSums(m), decreasing=TRUE)
dm <- data.frame(word=names(word_freqs), freq=word_freqs)

wordcloud(dm$word, dm$freq, random.order=FALSE, colors=brewer.pal(8, "Dark2"))

Значения ключей Twitter API у вас будут свои. Вставьте их вместо многоточий.

Не факт, что результат у вас совпадет с моим — ведь появятся новые твиты. А параметров у них много, например, географические координаты. Так что теперь мы можем с помощью R построить карту пристрастий пользователей Twitter. Можем смотреть, как эти пристрастия изменяются со временем. Можем… Но все это — темы для других статей.

Несколько полезных книжек по R

  1. Шипунов А. Б. и др. Наглядная статистика. Используем R!. — 2014. — 296 с.
  2. Статистический анализ данных в системе R. Учебное пособие / А. Г. Буховец, П. В. Москалев, В. П. Богатова, Т. Я. Бирючинская; Под ред. проф. Буховца А. Г. — Воронеж: ВГАУ, 2010. — 124 с. Есть на Library Genesis.
  3. Мастицкий С. Э., Шитиков В. К. Статистический анализ и визуализация данных с помощью R. — 2014. — 401 с. Электронная книга, адрес доступа


Комментарии

comments powered by Disqus