Co mówiono o miastach gospodarzach Euro 2012

Na publikowanych kilka tygodni temu wpisach pisałem o tym, jak wyciągnąć z Twittera informacje o meczach piłki nożnej, czy to z Premier League, czy z Euro 2012. W tym wpisie krótko omówię wyniki przedstawione na blogu warszawskiego oddziału Netezza IBM, dotyczące analizy danych z Twittera pod kątem tego co mówiono o miastach gospodarzach na Twitterze podczas Euro. Wszystkie prezentowane poniżej wykresy pochodzą ze wspomnianego bloga.

Podczas Euro ww. oddział zebrał kilkanaście milionów wiadomości z Twittera. Zdecydowana większość dotyczyła przebiegu rozgrywek piłkarskich, ale turyści zza granicy pisali też o miastach, które odwiedzili, komunikacji publicznej, drogach, zabytkach itp. Spójrzmy co też ci turyści pisali. Podsumowanie przeprowadzonych analiz przedstawia poniższy zbiór wykresów. Pierwszy wykres można zobaczyć w dużej rozdzielczości tutaj (w powiększeniu widać przykładowe, wybrane zdania z Twittera tworzące ramkę rysunku).

 

Przyjrzyjmy się dwóm ciekawym elementom tej grafiki. Jeden prezentuje skumulowaną widoczność i nastawienie wiadomości dotyczących miast gospodarzy. Wyniki dotyczą okresu trzech tygodni, czarne punkty oznaczają wyniki po pierwszym, drugim i trzecim tygodniu.

 

 

Najwięcej wiadomości dotyczy Warszawy, średnio dwukrotnie więcej niż innych miast gospodarzy. Bilans wiadomości pozytywnych minus negatywnych jest podobny dla wszystkich gospodarzy. Wrocław charakteryzuje się najmniejszą liczbą wiadomości (poniżej 20k) ale za to największym procentem wiadomości pozytywnych (procent odpowiada nachyleniu krzywej).

Drugi ciekawy element dotyczy analizy nastawienia dla różnych języków. Nastawienie wiadomości często ocenia się na podstawie listy słów o zabarwieniu pozytywnym i negatywnym. Trudno jednak skalibrować takie listy dla różnych języków by podobnie mierzyć natężenie emocji. Poniżej zastosowano więc inną prostą sztuczkę. Język wiadomości rozpoznano automatycznie, a nastawienie wiadomości w tym języku określono częstością buziek uśmiechniętych / smutnych. Szerokość prostokąta odpowiada liczbie wiadomości w tym języku o danym mieście (od lewej Wrocław, Poznań, Gdańsk) wysokość odpowiada frakcji wiadomości z określonym typem buziek (buźki ławo rozpoznać prostym wyrażeniem regularnym).
I tak np. o Wrocławiu publikowanych było wiele pozytywnych wpisów w językach angielskim, hiszpańskim, czeskim, rosyjskim itp.

 

 

Wyniki te dotyczą użytkowników Twittera i nie można ich przenosić na całe nacje. W różnych krajach popularność Twittera jest rożna. Niemniej myślę, że są to ciekawe wykresy. A może macie pomysł co jeszcze na temat miast gospodarzy można wydobyć z danych z Twittera?

Piątek, chmura słów, TextMining, morfologik i oczywiście R

Dzisiaj jest piątek, więc zamiast zaprzątać sobie głowę liczbami pooglądamy obrazki.

Dwa dni temu, w tym wpisie opisałem jak ściągnąć dane z Twittera i jako przykład ściągnąłem dane z kanału #debataACTA. Pokazałem też kilka podsumowań odkładając na później bardziej złożone analizy. Analizę nastawienia odłożę jeszcze na później, a dzisiaj pokażę jak danych tekstowych zrobić chmurę słów (ang. word cloud) używając R.

Samą chmurę słów można wykonać używając funkcji wordcloud() z pakietu wordcloud. Jako argumenty należy podać listę słów oraz współczynnik skalujący, odpowiadający wielkości danego słowa (najczęściej odpowiadający liczbie wystąpień danego słowa w tekście). Listę słów oraz częstości ich wystąpień można wygenerować używając funkcji str_split() i table(), ale aby było ciekawiej użyję w tym celu pakietu tm, który ma wiele przydatnych narzędzi do analizy tekstu (najwięcej przydatnych narzędzi ma do analizy tekstu angielskiego, ale z polskim też coś można zrobić).

Poniższy fragment kodu wczytuje dane, liczy tablicę częstości a następnie przedstawia ją graficznie z użyciem funkcji wordcloud(),

 

# Odczytaj dane
tweets = read.table(file="debataACTA4_13_luty.csv", sep=";", head=T)
 
# funkcje z pakietu tm i wordcloud
# do tworzenia korpusu wyrazów i ich wizualizacji
actaSlownik = Corpus(DataframeSource(data.frame(tweets[,2])))
actaSlownik = tm_map(actaSlownik, removePunctuation)
actaSlownik = tm_map(actaSlownik, tolower)
tdm = TermDocumentMatrix(actaSlownik)
m = as.matrix(tdm)
v = sort(rowSums(m),decreasing=TRUE)
 
# mając policzone częstości występowania możemy je zwizualizować
wordcloud(names(v), v^0.3, scale=c(5,0.5),random.order=F, colors="black")

 

Wykres otrzymany w ten sposób nie wygląda zbyt dobrze, ponieważ słowa występują w najróżniejszych odmianach a liczenie częstości osobno dla ,premierze’, 'premier’, 'premiera’, 'premierem’ nie wiele daje. Aby wykres wyglądał lepiej chcielibyśmy dla każdego ze słów znaleźć jego rdzeń i zliczać liczbę wystąpień rdzeni a nie różnych form. Jak to zrobić? Potrzebny będzie lematyzator, a dokładniej tzw. stemmer, czyli narzędzie, które dla każdego słowa wyodrębni tzw. 'stem’ (nie znam niestety polskiej terminologii a nie chcę tworzy kwiecistych tłumaczeń) czyli część słowa nie ulegającą odmianie.

Wykorzystam bezpłatny morfologik-stemmer dostępny na blogu http://morfologik.blogspot.com/ rozwijany przez Dawida Weissa i współpracowników. Narzędzie z którego skorzystałem to duży plik tekstowy mający w jednej kolumnie różne formy słów, w drugiej rdzenie a w trzeciej informacje o formie gramatycznej danego słowa. Oczywiście nie wszystkie słowa z twittera można znaleźć w tym zbiorze, nie ma tam np. wszystkich nazwisk. W każdym razie pierwsza transformacja polegała na przemapowaniu słowa na jego rdzeń, jeżeli słowo występuje w słowniku, lub pozostawienie słowa bez zmiany jeżeli w słowniku nie występuje. Dzięki temu z 13334 różnych słów zostaliśmy z 8597 słowami, z czego zdecydowana większość występuje tyko raz i nie znajdzie się na mapie tagów.

Zobaczmy jak wygląda rzeczona mapa.

[Rysunek 1. Chmura słów występujących przynajmniej dwa razy w zapisach z kanału debataACTA. Gdy było to możliwe słowa zostały przekształcone do swoich rdzeni. Wersja wektorowa tego rysunku (uwaga 7MB) znajduje się tutaj]

Dużo tych słów, mało widać, zróbmy więc jeszcze jedną iterację. Usuńmy wszystko co nie jest rzeczownikiem. Szczęśliwie słownik z pakietu morfologik ma informacje o tym czy dane słowo jest czy nie rzeczownikiem, więc zostawiamy tylko słowa, które znajdują się w słowniku i mają 'subst’ w trzeciej kolumnie.

[Rysunek 2. Chmura rzeczowników występujących przynajmniej dwa razy w zapisach z kanału debataACTA. Wersja wektorowa tego rysunku (uwaga 8MB) znajduje się tutaj]

Zróbmy jeszcze jeden eksperyment, mianowicie sprawdźmy jakie inne kanały występowały w wiadomościach z kanału #debataACTA. Zostawiamy więc tylko słowa zaczynające się od znaku #.

 

[Rysunek 3. Chmura nazw kanałów w wiadomościach na kanale debataACTA. Wersja wektorowa tego rysunku (uwaga 7MB) znajduje się tutaj]