W dzisiejszym wpisie przedstawiliśmy użycie języka Python i wrappera API o nazwie PRAW [1] do przejrzenia redditów . Wyniki wyświetliliśmy na wizualizacji o nazwie „chmura wyrazów” (ang. „word cloud”). Reddit[2] jest to portal społecznościowy umożliwiający tworzenie dyskusji oraz pozwalający na publiczne udostępnianie informacji. Więcej na temat portalu i o jego zasadach działania możecie przeczytać na Wikipedii [3] lub w wersji anglojęzycznej na portalu Reddit [4].
Do wykonania podobnych analiz będzie Wam potrzebne:
- Aktywne konto na portalu Reddit.
- Środowisko deweloperskie Python – można zainstalować je na swoim komputerze (polecamy środowisko Anaconda i IDE Jupyter Notebook) lub wykorzystać wersję chmurową na przykład Google Collab lub Microsoft Azure Notebooks.
- Posiadanie podstawowej wiedzy o języku Python.
Przygotowanie środowiska
Po udanej rejestracji na portalu Reddit i zalogowaniu w pierwszej kolejności należy utworzyć aplikację. Możecie to zrobić przechodząc na witrynę Apps. Aplikacja będzie potrzebna do uzyskania Client ID oraz Client Secret, które są wymagane, gdy korzystamy z API Reddita z poziomu skryptu. Poradnik, jak dokładnie utworzyć nową aplikację znajdziecie tutaj.
Kolejnym krokiem jest instalacja PRAW.
pip install praw
Jeżeli używacie Google Collab lub Microsoft Azure Notebooks to musicie dodać przed pip znak ’!’.
!pip install praw
Instalacja wordcloud (instalując w Collabie lub Azure należy postąpić analogicznie, jak dla PRAW dodając ! przed pip)
pip install wordcloud
Po pomyślnej instalacji należy je zaimportować oraz os i matplotlib.pyplot , które zostaną wykorzystany na etapie wizualizacji.
import praw import wordcloud import os import matplotlib.pyplot as plt
Teraz utworzymy red (instancję Reddit) podając Client ID, Client Secret oraz User agent. Dwa pierwsze parametry ustaliliśmy po poprawnym utworzeniu aplikacji, natomiast wyjaśnienia wymaga User agent. W uproszczeniu jest to identyfikator źródła z którego będziemy wysyłać zapytania do portalu. Rekomendowany przez autorów PRAW format podawania tego identyfikatora wygląda następująco: „<platform>:<app ID>:<version string> (by u/<Reddit username>)” i dla przykładu użyty przez nas: „rekomendacje-sportowe.pl:1 (by u/rekomendacje_sportowe)„
red = praw.Reddit(client_id='XXXXXXXXXXXXXXXXXXXXXXXXXXX', client_secret='XXXXXXXXXXXXXXXXXXXXX', user_agent='rekomendacje-sportowe.pl (by u/rekomendacje_sportowe)' )
Pobranie danych
Z uwagi na tematykę tego portalu będziemy przeszukiwać reddit’y/submission’y tylko z kategorii „sports„.
Przy czym mamy możliwość wyboru filtru/sposobu tworzenia wynikowej listy przeszukiwanych reddit’ów.
- hot : https://www.reddit.com/r/sports/hot/
- top : https://www.reddit.com/r/sports/top/?sort=top&t=all
- rising: https://www.reddit.com/r/sports/rising/
- new: https://www.reddit.com/r/sports/new/
- gilded: https://www.reddit.com/r/sports/gilded/
- controversial: https://www.reddit.com/r/sports/controversial/
Za pomocą pętli zapiszemy 300 tytułów redditów z filtrem „hot” w zmiennej tekstHot.
subreddit = red.subreddit('sports') tekstHot = ' ' for submission in subreddit.hot(limit=300): tekstHot += submission.title
oraz w kolejnej pętli 300 tytułów redditów z filtrem „top” w zmiennej tekstTop.
subreddit = red.subreddit('sports') tekstTop = ' ' for submission in subreddit.top(limit=300): tekstTop += submission.title
Wizualizacja
W wyniku wykonania powyższych czynności, pobrane dane zapisaliśmy w łańcuchach znaków, które przedstawimy graficznie. Chmura wyrazów pozwala na wyświetlenie słów kluczowych występujących w analizowanym tekście. Na wizualizacji tej, na wielkość czcionki wyrazów ma wpływ ich częstotliwość występowania w tekście. Ponadto wizualizacje można na różne sposoby uatrakcyjniać przez zastosowanie kolorystki i zmiany kształtu. My do zmiany kształtu grafiki wykorzystaliśmy maskę w postaci ikony kickboksera.
Pusta maska wygląda następująco:
Przykładową chmurę wyrazów można utworzyć za pomocą poniższego kodu. Jeżeli chcecie lepiej poznać WordCloud to odsyłamy do źródłowej dokumentacji [7].
kb_mask = np.array(Image.open(path.join(os.getcwd(), "kickbokser.png"))) wc = WordCloud(background_color="white", max_words=500, max_font_size=60, mask=kb_mask, contour_width=3, contour_color='steelblue') wc.generate(tekstHot) plt.imshow(wc, interpolation='bilinear') plt.axis("off") plt.figure()
Na koniec dla porównania pokażemy wyniki dla filtru Top (z lewej strony) oraz Hot.
Źródła
[1] https://praw.readthedocs.io/
[3] https://pl.wikipedia.org/wiki/Reddit
[4] https://www.redditinc.com/