ˆºàâà 17. ¨æïîºüçîâàíŁå Twitter API äºÿ æÆîðà...

10
17. Twitter API 14.03.2016 Twitter API ............................. 1 Twitter R ................................ 3 .................. 3 ............................. 4 .................................. 5 .................................. 6 - ................ 6 ............................. 7 ....................................... 7 Search API .................................. 8 Streaming 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 Access Tokens . 1

Transcript of ˆºàâà 17. ¨æïîºüçîâàíŁå Twitter API äºÿ æÆîðà...

Page 1: ˆºàâà 17. ¨æïîºüçîâàíŁå Twitter API äºÿ æÆîðà äàííßıdkhramov.dp.ua/images/edu/Stu.WebMining/ch17_twitter.pdf · 2016. 12. 2. · ˆºàâà 17. ¨æïîºüçîâàíŁå

Глава 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

Page 2: ˆºàâà 17. ¨æïîºüçîâàíŁå Twitter API äºÿ æÆîðà äàííßıdkhramov.dp.ua/images/edu/Stu.WebMining/ch17_twitter.pdf · 2016. 12. 2. · ˆºàâà 17. ¨æïîºüçîâàíŁå

Рис. 1: Ссылка на раздел “Manage My Apps”

Рис. 2: Окно создания приложения Twitter

2

Page 3: ˆºàâà 17. ¨æïîºüçîâàíŁå Twitter API äºÿ æÆîðà äàííßıdkhramov.dp.ua/images/edu/Stu.WebMining/ch17_twitter.pdf · 2016. 12. 2. · ˆºàâà 17. ¨æïîºüçîâàíŁå

Подключение к 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

Page 4: ˆºàâà 17. ¨æïîºüçîâàíŁå Twitter API äºÿ æÆîðà äàííßıdkhramov.dp.ua/images/edu/Stu.WebMining/ch17_twitter.pdf · 2016. 12. 2. · ˆºàâà 17. ¨æïîºüçîâàíŁå

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

Page 5: ˆºàâà 17. ¨æïîºüçîâàíŁå Twitter API äºÿ æÆîðà äàííßıdkhramov.dp.ua/images/edu/Stu.WebMining/ch17_twitter.pdf · 2016. 12. 2. · ˆºàâà 17. ¨æïîºüçîâàíŁå

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

Page 6: ˆºàâà 17. ¨æïîºüçîâàíŁå Twitter API äºÿ æÆîðà äàííßıdkhramov.dp.ua/images/edu/Stu.WebMining/ch17_twitter.pdf · 2016. 12. 2. · ˆºàâà 17. ¨æïîºüçîâàíŁå

в книге — даёт читателю возможность составить общее представление о содержаниитекста прежде, чем углубиться в чтение.Для построения облака слов, помимо 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

Page 7: ˆºàâà 17. ¨æïîºüçîâàíŁå Twitter API äºÿ æÆîðà äàííßıdkhramov.dp.ua/images/edu/Stu.WebMining/ch17_twitter.pdf · 2016. 12. 2. · ˆºàâà 17. ¨æïîºüçîâàíŁå

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

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

Page 8: ˆºàâà 17. ¨æïîºüçîâàíŁå Twitter API äºÿ æÆîðà äàííßıdkhramov.dp.ua/images/edu/Stu.WebMining/ch17_twitter.pdf · 2016. 12. 2. · ˆºàâà 17. ¨æïîºüçîâàíŁå

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

Page 9: ˆºàâà 17. ¨æïîºüçîâàíŁå Twitter API äºÿ æÆîðà äàííßıdkhramov.dp.ua/images/edu/Stu.WebMining/ch17_twitter.pdf · 2016. 12. 2. · ˆºàâà 17. ¨æïîºüçîâàíŁå

Рис. 4: Облако слов по запросу “data mining”

9

Page 10: ˆºàâà 17. ¨æïîºüçîâàíŁå Twitter API äºÿ æÆîðà äàííßıdkhramov.dp.ua/images/edu/Stu.WebMining/ch17_twitter.pdf · 2016. 12. 2. · ˆºàâà 17. ¨æïîºüçîâàíŁå

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