ˆºàâà 17. ¨æïîºüçîâàíŁå twitter api äºÿ æÆîðà...
TRANSCRIPT
Глава 17. Использование Twitter API длясбора данных
Дмитрий Храмов
14.03.2016
СодержаниеПолучение доступа к Twitter API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1Подключение к Twitter из R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3Поиск и сохранение его результатов в базе данных . . . . . . . . . . . . . . . . . . 3Фильтрация результатов поиска . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4Построение облака слов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Данные для анализа . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6Лексический корпус и терм-документная матрица . . . . . . . . . . . . . . . . 6Ключевые слова и их частоты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7Облако слов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Ограничения Search API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8Streaming API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8Ссылки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10Создадим приложение в Twitter и решим три простые задачи:
• выполним поиск по ключевым словам и сохраним его результаты в базе данных;• отфильтруем часть данных, оставив только геокодированные данные;• построим облако слов;
Получение доступа к Twitter APIЧтобы получить ключи доступа к Twitter Search API у вас должен быть зарегистрированаккаунт на Twitter и в этом аккаунте указан ваш мобильный телефон. Создать такойаккаунт — дело нескольких минут.Теперь нужно создать приложение (app) для Twitter-а.Входим в свой аккаунт и идем в раздел Developers, а оттуда — в Documentation, разделManage My Apps (рис. 1).Жмем кнопку “Create New App” и заполняем форму (рис. 2).Имя вашего приложения (Name) должно быть уникальным, иначе система не позволитего создать. Адрес веб-сайта (Website) должен быть оформлен по правилам оформлениявеб-адресов, но не обязательно должен быть реальным — можно ввести «заглушку»,например, http://tests.org/ — больше этот адрес нам не понадобится.После того как система подтвердит создание приложения, во вкладке Keys and AccessTokens мы найдем нужные ключи.
1
Рис. 1: Ссылка на раздел “Manage My Apps”
Рис. 2: Окно создания приложения Twitter
2
Подключение к Twitter из RТеперь нужно установить пакет расширения R — twitteR, отвечающий за поиск данных вTwitter.Для этого вам понадобятся данные с вкладки 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 доложит от успешном подключении, можно приступать к поиску.По окончании аутентификации может появится вопрос, сохранить ли коды доступаOAuth в локальном файле для последующего использования:
[1] "Using direct authentication"Use a local file to cache OAuth access credentials between R sessions?1: Yes2: No
Любой вариант будет приемлем.
Поиск и сохранение его результатов в базе данныхПоиск в Twitter выполняется функцией searchTwitter() с единственным обязатель-ным аргументом – строкой ключевых слов.Следующий код говорит сам за себя:
# Создадим базу в текущем каталоге.register_sqlite_backend("data_mining.sqlite")# Получим твиты по заданным ключевым словам.tweets = searchTwitter("data mining")# Сохраним твиты в базе.
3
store_tweets_db(tweets)# Загрузим твиты из базы в таблицу R.from_db = load_tweets_db(as.data.frame = TRUE)
Функция searchTwitter() позволяет задать количество возвращаемых твитов (n), ихязык (lang), временной интервал (since – “от” и until – “до”), расположение авторатвита (geocode) и другие параметры. Кроме того, аргумент retryOnRateLimit блокиру-ет запуски на заданное время по достижении лимита, установленного разработчикамиAPI. Это несколько удлинняет время сбора информации, но избавляет от необходимостиписать собственные “тормоза”.Заметим, что количество возвращаемых твитов может быть меньше заданного n значе-ния также из-за ограничений API. Об этих ограничениях мы поговорим позднее.
Фильтрация результатов поискаСоставим строку поиска из запросов, разделённых знаками “+”:
search_string <- paste0(c("новый год","#новыйгод"),collapse = "+")
Если поиск ведётся на русском языке, это желательно указывать в параметре lang
tweets <- searchTwitter(search_string, n=15000, lang="ru")
иначе есть риск получить в результатах постороннюю “нелатиницу”.Объект tweets относится к классу status и имеет множество методов get*(), возвра-щающих ту или иную часть твита. Например, функция getText() возвращает текст
text <- sapply(tweets, function(x) x$getText())
Отфильтруем из полученных твитов те, что содержат данные о расположении их ав-торов (непустые значения долготы или широты) и сохраним тексты твитов, имена ирасположение авторов, а также время создания твита в таблице df:
nonzero_geocode <- sapply(tweets,function(x) as.logical(length(x$getLatitude())) )
data <- sapply( tweets[nonzero_geocode],function(x) list(ScreenName=x$getScreenName(),
Text=x$getText(),Lat=x$getLatitude(),Lon=x$getLongitude(),Date=x$getCreated())
)
4
col_names <- row.names(data)num_cols <- length(col_names)num_rows <- round(length(data)/num_cols)
df <- data.frame( matrix(data, ncol=num_cols, nrow=num_rows, byrow=TRUE),stringsAsFactors = FALSE )
names(df) <- col_names
Подробнее о функциях пакета TwitteR можно прочитать в документации и небольшойвводной статье от разработчика пакета – Джеффа Джентри.
Построение облака слов
Рис. 3:Вы наверняка встречали картинки, похожие на ту, что приведена на рис. 3. Это — «облакослов». Оно позволяет наглядно представить ключевые слова, содержащиеся в документе,и широко используется в интеллектуальном анализе текстов (text mining). Сейчас мынаучимся строить такие облака самостоятельно.Облако слов (word cloud) или, как его еще называют, облако тегов (tag cloud) — этовизуальное представление списка ключевых слов какого-либо текста. Важность каждогоключевого слова (частота его упоминания) обозначается в облаке размером шрифта ицветом.Чаще всего в виде облака изображается список категорий веб-сайта. Собственно, дляэтого облака слов и были придуманы — впервые они появились на сервисе храненияцифровых фотографий Flickr и уже затем приобрели популярность как инструментанализа текстов. Фактически, облако слов выполняет ту же функцию, что и оглавление
5
в книге — даёт читателю возможность составить общее представление о содержаниитекста прежде, чем углубиться в чтение.Для построения облака слов, помимо twitteR, нам понадобятся пакеты: tm — для ана-лиза текста (text mining) и wordcloud — для создания облака слов.Чтобы построить облако слов нужно:
1. Получить данные для анализа. В нашем случае это будут твиты, из которых выде-лен текст, но источником может служить и обычный текстовый файл.
2. Создать лексический корпус и терм-документную матрицу с помощью функцийпакета tm.
3. Получить ключевые слова и частоту их упоминания.4. Нарисовать облако слов.
Данные для анализаПолучим твиты и сохраним их в переменной tweets:
tweets <- searchTwitter("data mining", n=500, lang="en")
Ограничимся пока твитами на английском языке.К каждому твиту применим уже знакомую нам функцию выделения текста:
text = sapply(tweets, function(x) x$getText())
Лексический корпус и терм-документная матрицаВообще говоря, лексический корпус — это коллекция текстов, подлежащих анализу. Внашем случае — это символьный вектор с несколькими дополнительными атрибутами.Терм-документная матрица описывает частоту, с которой тот или иной термин встре-чается в документах корпуса: строки матрицы соответствуют документам, столбцы —терминам. Значение элемента матрицы равно частоте употребления термина в доку-менте.Для построения лексического корпуса и терм-документной матрицы используютсяфункции Corpus() и TermDocumentMatrix():
corpus <- Corpus(VectorSource(text))tdm <- TermDocumentMatrix(corpus,
control = list(removePunctuation = TRUE,stopwords = c("data", "mining", stopwords("english")),removeNumbers = TRUE,tolower = TRUE))
С помощью параметра control мы выполняем очистку текста от символов пунктуации,стоп-слов (например, артиклей английского языка), чисел и переводим все буквы встрочные.
6
Ключевые слова и их частотыИтак, ключевые слова, очищенные от “мусора”, содержатся в терм-документной мат-рице. Сохраним её как обычную матрицу, отсортируем частоты в порядке убывания исохраним результат в виде таблицы:
m <- as.matrix(tdm)word_freqs <- sort(rowSums(m), decreasing=TRUE)dm <- data.frame(word=names(word_freqs), freq=word_freqs)
Подробнее о функциях пакета tm можно узнать из документации к пакету.
Облако словОсталось лишь нарисовать облако слов. Это делается функцией 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. Посмотреть все доступные палитры можно здесь.В готовом скрипте всего 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 =
7
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"))
В результате получим рис. 4. У вас скорее всего получится похожее, но всё же другоеоблако – ведь появились новые твиты.Заметим, что если ограничиться только построением облака слов, то для этого естьболее простые способы, чем использование R.
Ограничения Search APIОграничения по сбору данных Twitter API описаны здесь. В настоящее время приложениеможет выполнять не более 450 запросов в течение 15 минут.
Streaming APIВыше мы описали работу с Search API Twitter. Этот API позволяет собирать данные извыборки твитов, опубликованных за последние 7 дней. Выборка является частью массиватвитов и существуют “свежие” твиты, которые в неё не попадают.Для доступа ко всему массиву твитов используется Twitter Streaming API. В R для работыс ним существует пакет streamR, а в Python – библиотека Tweepy.Кроме того, существует ряд пополняемых архивов данных Twitter, в частности, InternetArchive. Данные в нём представлены в виде архивных файлов размером в несколькодесятков гигабайт.Однако, если только вы не покупаете данные у официального реселлера Twitter, вродеGnip, то вам всё равно будет доступна лишь ограниченная выборка данных. Насколькоограниченная? По некоторым оценкам в Internet Archive представлено примерно 1% отвсех твитов за соответствующий период времени.Поиск в архиве твитов можно выполнять с помощью сервиса BackTweets.Касательно объема этого архива процитируем FAQ
8
Рис. 4: Облако слов по запросу “data mining”
9
BackTweets searches through a tweet index spanning more thanthree years and reaching up to real-time. The index grows daily.
Поиск может выполняться по обычному запросу, @именипользователя, #хештегу илиссылке (как полной, так и сокращённой).Для сбора данных Twitter можно использовать NodeXL. Это плагин к MS Excel, которыйсобирает данные и строит на их основе графы для анализа социальных сетей. Базоваяверсия NodeXL распространяется свободно и использует Search API Twitter. Существуетверсия NodeXL Pro, позволяющая собирать данные из Twitter, Facebook, YouTube, Flickr иряда викисайтов, распространяемая на коммерческой основе.
Ссылки• Social media data collection tools – большая подборка ссылок на инструменты для
сбора данных из социальных сетей, в основном из Twitter и Facebook, и на провай-деров данных.
• Quora. Which tools are available to collect social network data? – опять в основном проTwitter и Facebook.
• MatthewA. Russell. Mining the Social Web, 2nd Edition, O’Reilly Media, 2014, 421 p. – оченьполезная книга, в первую очередь для тех, кто использует Python. Посвящена сборуданных при помощи API Twitter, Facebook, LinkedIn и Google+.
10