- •Федеральное агентство связи
- •Введение
- •Язык программирования r
- •Инсталляция r и rStudio
- •Интерфейс среды разработки
- •Упражнения
- •Импортирование данных
- •Функция read.Table()
- •Функция read.Csv()
- •Доступ к столбцам фрейма
- •Доступ к строкам фрейма
- •Анализ xml документов
- •Пример функции visitNode()
- •Функция xmlSApply()
- •Анализ html контента
- •Загрузка контента
- •Примеры анализа
- •Интерактивный JavaScript
- •Создание консоли
- •Пример использования
- •Построение wordcloud
- •Подготовка корпуса
- •Построение облака
- •Кластерный анализ
- •Алгоритмы Кластерного Анализа
- •Алгоритм k-средних
- •Иерархическая кластеризация
- •Алгоритмы основанные на теории графов
- •Статистические алгоритмы
- •Пример использования функции kmeans()
- •Пример использования функции hclust()
- •Отдыхай с функцией getXksd()
- •Контрольные задания
Построение wordcloud
Для первого знакомства с wordcloud в качестве исходного текста для анализа может быть выбран произвольный текстовый файл на английском языке. Далее нам нужен будет пакет tm (от text mining), имеющий широкие возможности для анализа текстовой информации (как обычно, его можно установить при помощи команды install.packages("tm")).
Подготовка корпуса
Обработка текста из файла story.txt потребует нескольких функций из этого пакета. Первым шагом должно стать создание т.н. "корпуса", т.е. сведение всех имеющихся небольших текстов (сообщений) в один объект:
txt.corpus <- Corpus(VectorSource(tweets))
tw.corpus
A corpus with 542 text documents
С корпусом текстов можно выполнять разнообразные операции, что осуществляется через интерфейс функции tm_map() из пакета tm. Для начала стоит удалить из анализируемых сообщений все знаки пунктуации, которые не несут никакой смысловой нагрузки (функция removePunctuation()):
tw.corpus <- tm_map(tw.corpus, removePunctuation)
Теперь сделаем так, чтобы все слова в анализируемых сообщениях были представлены прописными буквами:
tw.corpus <- tm_map(tw.corpus, tolower)
Следующий шаг - очень важный. Он состоит в том, чтобы удалить из сообщений как можно больше т.н. "стоп-слов", или "шумовых слов", т.е. слов, не несущих смысловой нагрузки (например, "это", "я", "мы", "тут", "возможно" "один", "два", и т.п.). Если бы мы работали с англоязычными текстами, можно было бы воспользоваться хорошо работающим готовым решением из пакета tm: tw.corpus <- tm_map(tw.corpus, removeWords, stopwords("english")). Теоретически, в приведенной команде можно было бы заменить "english" на "russian", но практика показывает, что это дает неудовлетворительные результаты. Однако имеется возможность применить и пользовательский список стоп-слов. Один из таких списков можно скачать в виде текстового файла здесь. После загрузки этого списка в R и сохранения его под именем my.stopwords (в виде текстового вектора), выполняем следующую команду:
tw.corpus <- tm_map(tw.corpus, removeWords, my.stopwords)
Все приведенные команды, использующие функцию tm_map(), можно объединить в одну более крупную функцию, которую будет удобно использовать при выполнении аналогичных анализов в будущем. Например:
generateCorpus <- function(df, my.stopwords = c()) {
tw.corpus <- Corpus(VectorSource(df))
tw.corpus <- tm_map(tw.corpus, removePunctuation)
tw.corpus <- tm_map(tw.corpus, tolower)
tw.corpus <- tm_map(tw.corpus, removeWords, my.stopwords)
tw.corpus
}
Эта новая функция позволяет быстро подготовить корпус сообщений для дальнейшего анализа, например, так:
my.corpus <- generateCorpus(tweets, my.stopwords)
Построение облака
Далее будем работать именно с объектом my.corpus. Для создания облака слов воспользуемся возможностями пакета wordcloud (установите при помощи команды install.packages("wordcloud"); потребуется также пакет RColorBrewer для создания палитры цветов - установите и его). Подобно функции generateCorpus(), создадим для удобства работы функцию generateWordcloud():
generateWordcloud <- function(corpus, min.freq = 3, ...) {
require(wordcloud)
# Преобразовываем "корпус" в матрицу индексируемых слов
# подробнее о структуре и назначении этой матрицы см. здесь
doc.m <- TermDocumentMatrix(corpus,
control = list(minWordLength = 1))
dm <- as.matrix(doc.m)
# Подсчитываем частоту слов:
v <- sort(rowSums(dm), decreasing = TRUE)
d <- data.frame(word = names(v), freq = v)
require(RColorBrewer)
pal <- brewer.pal(8, "Accent")
# Генерируем облако слов:
wc <- wordcloud(d$word, d$freq, min.freq = min.freq, colors = pal)
wc
}
Теперь у нас все готово для создания облака слов. Но перед тем как его нарисовать, следует еще раз вернуться к стоп-словам. Дело в том, что помимо упомянутых выше шумовых слов, в анализируемых нами сообщениях следует ожидать и ряда специфичных "шумов". Предварительный анализ показал, что стоит удалить как минимум следующие слова:
stops <- c("belarus", "minsk", "twiby", "8pua","минск", "беларусь", "беларуси")
Эти дополнительные стоп-слова мы можем лекго добавить к стандартным при вызове функции generateCorpus():
my.corpus <- generateCorpus(tweets, с(my.stopwords, stops))
Создаем облако слов (число 15 в приведенной ниже команде соответствует минимальной частоте встречаемости, ниже которой то или иное слово в облако включено не будет; очевидно, что варьируя этот порог, можно получать несколько различающиеся варианты облаков):
print(generateWordcloud(my.corpus), 15)
Как видно из рисунка, одним из ключевых слов в сообщениях, опубликованных пользователями Twitter'a.
