Ciekawostka, Python

Analiza źródeł internetowych i interesująca wizualizacja wyników cz. I

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:

  1. Aktywne konto na portalu Reddit.
  2. Ś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.
  3. 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.

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/

[2] https://www.reddit.com/

[3] https://pl.wikipedia.org/wiki/Reddit

[4] https://www.redditinc.com/

[5] https://www.anaconda.com/

[6] https://www.reddit.com/prefs/apps

[7] https://amueller.github.io/word_cloud/

Komentarze z Facebooka

Mogą Ci się również spodobać...

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *