НАВИГАЦИЯ
КОНТАКТЫ
  • LinkedIn - White Circle
  • Facebook - White Circle
  • Twitter - White Circle

info@DDM.center

Телефон: +380 67 341 7101

© 2017 DDM.center

О чем говорят в Игре престолов?

 

Посмотрели недавно сериал «Игра престолов». Долго сопротивлялись, но сын все-таки уговорил.

В мире десятки миллионов фанатов смотрели все серии и ждали выхода новых сезонов и новых серий. Решили посмотреть и мы. Благо времени немного появилось.

 

Нравится вам этот сериал или нет, сейчас речь пойдет о другом.

 

Решил немного подтянуть свои знания и навыки в анализе текстов и визуализации результатов. Ну и чтобы не тренироваться «на кошках», выбрал этот сериал в качестве источника текстов. Тексты на русском нашел только по двум сезонам, поэтому решил взять тексты на английском. Нашел почти все серии на сайте https://www.springfieldspringfield.co.uk/episode_scripts.php?tv-show=game-of-thrones

 

Задачи, которые я себе поставил разбил на два блока. Для начала посмотрим, о чем говорят в сериале. А во второй части надо будет выполнить анализ тональности и посмотреть, как менялась ситуации от эпизода к эпизоду.

 

Возможно и удастся разгадать загадку популярности. Ведь не могли все эти десятки миллионов зрителей смотреть сериал только из-за визуальных эффектов.

 

В качестве инструмента выбрал R Studio https://www.rstudio.com/ Удобный инструмент для работы с языком R. Большое количество библиотек для решения разнообразных задач и огромное комьюнити.

 

Для начала извлечем тексты с сайта. Можно было бы автоматизировать этот процесс. Благо в библиотеке TM есть средства для извлечения текстов не только из различных файлов (.txt, .doc, .pdf), но также из структур данных, используемых в интернет – xml, json и т.п. Не стал пока разбираться как из конкретного сайта извлечь только нужные мне тексты, поэтому использовал стандартный способ copy-paste. Хорошо, что в сериале всего 7 сезонов по 10 эпизодов :-)

 

Как же узнать, о чем говорят в сериале? Проведем количественный анализ использования слов. Возьмем все тексты и посчитаем сколько раз встречается то или иное слово. В итоге мы получим длинную таблицу с двумя колонками: слово – частота. Но ведь такую таблицу не очень интересно разглядывать, поэтому используем способ визуализации, известный как «облако слов». Чем чаще встречается слово в тексте, тем больше шрифт. Получим такую картинку.

 

Используем также цвет, чтобы подчеркнуть разницу между словами. И украсим рисунками гербов основных игроков сериала. Мы же хотим, чтобы рисунок был еще и привлекательным. Такая вот «жизнеутверждающая» картинка получилась.

 

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

 

 

 

library(tm) 

Подключим специализированную библиотеку для анализа текстов text mining - tm

 

dirpath <- "C:/My interesting works/Game of throne/Scripts" 

Укажем путь к папке с текстами

 

articles <- Corpus(DirSource(dirpath,recursive=T), readerControl = list(reader = readPlain,

                                        language = "en", load = T))

Создадим текстовый корпус – структуру данных в которой будут храниться наши тексты.

 

Подготовим текст для анализа, убрав из него лишние пробелы, знаки пунктуации, цифры.

 

articles <- tm_map(articles, stripWhitespace)

Убираем пробелы

 

articles <- tm_map(articles, tolower)

Переводим все слова в нижний регистр

 

articles <- tm_map(articles, removeNumbers)

Убираем цифры

 

articles <- tm_map(articles, removeWords, stopwords("SMART"))

Уберем из текста стоп-слова. Такие как: "a";"a's";"able";"about";"above";"according";"accordingly" и т.п. всего почти 600 слов. Полный список можно увидеть по команде stopwords("SMART")

 

articles <- tm_map(articles, removePunctuation)

Избавимся от знаков препинания

 

tm_map(articles, stemDocument)

Проведем стемматизацию текста. Т.е. приведем все словоформы одного и того же слова к одному виду.

 

library(wordcloud2)

Подключим специализированную библиотеку для создания облака слов - wordcloud2

 

tdm <- TermDocumentMatrix(articles)

m <- as.matrix(tdm)

v <- sort(rowSums(m),decreasing=TRUE)

d <- data.frame(word = names(v),freq=v)

Так как функция wordcloud2 требует в качестве источника данных таблицу с колонками слово и частота, то позаботимся о создании такой таблицы.

 

 

figPath = system.file("examples/background.png",package = "wordcloud2")

wordcloud2 позволяет размещать слова не только в прямоугольнике, но и по шаблону. Я заготовил такой шаблон, в котором по центру размещаются пустые окружности, чтобы в них можно было поместить гербы основных игроков.

 

 

wordcloud2(d, figPath = figPath, size = 1,minRotation = -pi/6, maxRotation = -pi/6, rotateRatio = 1,

                   color = brewer.pal(9,"BrBG"))

Вызываем функцию wordcloud2, которая и построит наше желаемое облако слов.

 

Наслаждаемся результатом!

 

Облако слов всего сериала

 

Облако первого сезона

 

 

Облако второго сезона

 

 

Облако третьего сезона

 

 

Облако четвертого сезона

 

Облако пятого сезона

 

Облако шестого сезона

 

 

Облако седьмого сезона

Облако восьмого сезона

 

Добавим года через полтора-два. Надеюсь выйдет :-)

 

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

 

Например, мы легко можем выбрать слова, которые употреблялись более 250 раз.

 

Набираем команду: > findFreqTerms(dtm, 250) и тут же получаем результат:

[1] "back"       "day"        "dead"       "die"        "find"       "girl"     

[7] "good"       "grace"      "jon"        "kill"       "killed"     "lady"     

[13] "lannister"  "life"       "long"       "love"       "make"      "mother"   

[19] "night"      "north"      "people"     "queen"      "stark"      "time"     

[25] "told"       "wall"       "watch"      "winterfell" "world"      "fight"    

[31] "war"

 

Также можем выполнить поиск ассоциаций с заданным уровнем корреляции. Например, какие слова ассоциируются со словом Jon с уровнем корреляции 0,7.

 

Набираем команду: findAssocs(dtm, "jon", 0.7) и получаем результат:

    snow daenerys

    0.77     0.76

 

Итак, с помощью облака слов, первая часть задачи количественного анализа текста решена.

 

Конечно, можно еще придумать множество вопросов, так как данных для анализа много, а инструмент очень хорош. Но мне кажется, что продолжить анализ текста, чтобы узнать еще и тональность разговоров очень интересно. Этим и займусь в ближайшее время.

 

И напоследок - большая гифка со всеми облаками

 

 

 

 

 

 

 

 

Share on Facebook
Share on Twitter
Please reload

Избранные посты

Уйдет или не уйдет?

March 23, 2018

1/4
Please reload

Недавние посты