Pomysł na ten projekt zrodził się w ramach przedmiotu "Inteligencja Obliczeniowa". Szukałem tematu, który byłby zarówno ciekawy, jak i możliwy do zrealizowania w ramach moich obecnych umiejętności, a jednocześnie pozwoliłby mi zastosować w praktyce wiedzę zdobytą na laboratoriach. Zainspirował mnie temat nr 9 z listy projektów - "Analiza tekstu z mediów społecznościowych".
Reddit jest pełen ludzkich opinii na właściwie każdy temat oraz nietrudno jest pozyskać (""zescrapować") z niego posty. Pomyślałem, że analiza sentymentu w społecznościach technologicznych i inwestycyjnych mogłaby być fascynująca. Czy nowa technologia jest przyjmowana z entuzjazmem? Czy nastroje na forach inwestycyjnych odzwierciedlają wahania na giełdzie? To pytania, na które chciałem spróbować odpowiedzieć, tworząc ten projekt.
Zależało mi na tym, żeby kod był maksymalnie prosty i czytelny - tak, żeby ktoś z mojego roku mógł bez problemu przejrzeć i zrozumieć każdy etap. Nie kopiowałem gotowców - świadomie realizowałem projekt, ucząc się po drodze i testując różne podejścia.
scraper.py)Pierwszym wyzwaniem było zdobycie danych. Zdecydowałem się na scraping Reddita, a konkretnie trzech subredditów: r/technology, r/investing oraz r/wallstreetbets. Wybór był celowy - chciałem mieć mieszankę tematów technologicznych i finansowych, w tym jedno forum (wallstreetbets) znane z bardzo emocjonalnego języka i zdolności do wpływania na rzeczywiste rynki finansowe (np. głośna sprawa akcji GameStop i AMC). To pozwalało sprawdzić, jak sentyment użytkowników może mieć przełożenie na decyzje inwestycyjne.
Napisałem skrypt scraper.py, który za pomocą biblioteki PRAW łączy się z API Reddita i pobiera najgorętsze posty z wybranych subredditów. Skrypt zapisuje kluczowe informacje o postach (tytuł, treść, autor, data, liczba komentarzy) do pliku reddit_posts.csv. Musiałem oczywiście założyć własną ""aplikację" na moim koncie Reddit, żeby uzyskać klucze API.
preprocess.py)Surowe dane tekstowe są pełne ""śmieci", które mogą zakłócić analizę. Dlatego kolejnym krokiem było ich oczyszczenie. Skrypt preprocess.py jest tzw. potokiem przetwarzania, który dla każdego posta wykonuje następujące operacje:
Najpierw wszystko sprowadzałem do małych liter, żeby nie mieć problemów z wielkością znaków. Potem usuwałem śmieci typu linki, cyfry i znaki specjalne, bo tylko zaśmiecają analizę. Następnie dzieliłem teksty na pojedyncze słowa (tokeny), żeby dało się na nich pracować. Z tych słów pozbywałem się tzw. stopwordów, czyli takich ""the", ""a", ""is" - słów, które nic nie wnoszą. Na końcu robiłem lematyzację, czyli sprowadzałem słowa do ich podstawowej formy - dzięki temu ""runs", ""running" i ""ran" były traktowane jako jedno i to samo.
Cały proces był inspirowany zadaniami z laboratorium. Po przetworzeniu, czyste dane są zapisywane do nowego pliku reddit_posts_processed.csv, gotowe do dalszej analizy.
sentiment_analysis.py)To serce całego projektu. Do analizy sentymentu użyłem narzędzia VADER (Valence Aware Dictionary and sEntiment Reasoner), które jest częścią biblioteki NLTK. Wybrałem VADERa, ponieważ jest on specjalnie dostosowany do analizy tekstów z mediów społecznościowych - dobrze radzi sobie ze slangiem, emotikonami i wielkimi literami. Jest to model oparty na regułach i słowniku, co czyni go prostym w użyciu i interpretacji, idealnym na potrzeby tego projektu.
Skrypt sentiment_analysis.py wczytuje przetworzone dane, a następnie dla każdego posta oblicza cztery wskaźniki VADER:
positive, negative, neutral: udział słów pozytywnych, negatywnych i neutralnych.compound: zagregowany wynik od -1 (skrajnie negatywny) do +1 (skrajnie pozytywny).Na podstawie wyniku compound stworzyłem prostą klasyfikację, oznaczając każdy post jako ""pozytywny", ""neutralny" lub ""negatywny". Wyniki wraz z etykietami zapisałem do pliku reddit_posts_with_sentiment.csv.
Dodatkowo, w tym skrypcie zaimplementowałem generowanie dwóch kluczowych wizualizacji: wykresu słupkowego pokazującego ogólny rozkład sentymentu oraz chmury słów, która w graficzny sposób pokazuje najczęściej występujące terminy.
app.py)Samo przetworzenie danych to nie wszystko - trzeba je jeszcze w przystępny sposób zaprezentować. Do tego celu stworzyłem prostą aplikację webową za pomocą biblioteki Streamlit.
Aplikacja app.py pozwala na:
Starałem się, aby interfejs był czysty, prosty i zawierał moje ""studenckie" komentarze, tłumaczące co widać w danej sekcji.
Cały kod projektu jest dostępny na GitHub. Znajdziesz tam implementację scrapera, analizę sentymentu, aplikację Streamlit oraz wszystkie skrypty pomocnicze.
Podobał Ci się projekt? Zostaw gwiazdkę na GitHub, żeby pomóc innym go znaleźć! Każda gwiazdka motywuje do dalszego rozwoju i dzielenia się wiedzą.
Realizacja tego projektu była niezwykle pouczającym doświadczeniem. Udało mi się z powodzeniem przejść przez wszystkie etapy projektu analitycznego - od surowych danych po interaktywną wizualizację. Zrozumiałem, jak ważne jest staranne przygotowanie danych i jak duży wpływ ma ono na końcowe wyniki. Dowiedziałem się też, że nawet proste modele, takie jak VADER, mogą dać ciekawe i wartościowe wyniki, jeśli zostaną poprawnie zastosowane.
Największym wyzwaniem było dla mnie samo zebranie i oczyszczenie danych - to faktycznie, jak mówią specjaliści, zajmuje najwięcej czasu. Ciekawym doświadczeniem było też ""ubranie" moich analiz w aplikację Streamlit, co sprawiło, że projekt stał się znacznie bardziej namacalny - taką miałem wizję ;-).
Analiza danych pokazała ciekawe różnice między subredditami. r/investing to najbardziej optymistyczna przestrzeń - aż 82% postów miało pozytywny wydźwięk. Można wnioskować, że społeczność ta skupia się na długoterminowych strategiach i dzieleniu się sukcesami, a nie na emocjonalnym reagowaniu na krótkoterminowe wydarzenia.
W r/technology natomiast proporcje są mocno zbalansowane - dużo treści neutralnych, sporo pozytywnych i negatywnych. To raczej forum zorientowane na wymianę informacji i nowinki techniczne niż emocjonalne komentarze.
r/wallstreetbets zgodnie z oczekiwaniami prezentuje wyraźną przewagę postów pozytywnych, ale też zauważalną obecność negatywnych - co pasuje do jego reputacji jako miejsca, gdzie dominuje hype, ale też dramaty i frustracje po dużych stratach. Ogólny obraz sentymentu pokrywa się więc dobrze z charakterem tych społeczności i potwierdza, że VADER całkiem trafnie je rozróżnia.
Oczywiście, ten projekt to dopiero początek. Gdybym miał więcej czasu, mogłbym go rozwinąć o:
Jestem bardzo zadowolony z tego projektu. Dał mi on ogromną satysfakcję i poczucie, że potrafię wykorzystać wiedzę z zajęć do stworzenia czegoś od zera. To zupełnie inne uczucie niż tylko rozwiązywanie pojedynczych zadań na laboratoriach. Widę teraz znacznie lepiej, jak poszczególne elementy - programowanie, statystyka, przetwarzanie języka - łączą się w jedną, spójną całość. Myślę, że to doświadczenie będzie solidnym fundamentem pod dalszą naukę i przyszłe, bardziej zaawansowane projekty.