środa, 31 stycznia 2024

Analiza sentymentów danych giełdowych - wstęp

Ta praca odzwierciedla zainteresowanie autora analizą finansową i wykorzystaniem narzędzi informatycznych w jej realizacji. Niniejszy blog nie ma na celu dostarczania porad finansowych, lecz stanowi konstruktywne podejście autora do dzielenia się wiedzą. Autor widzi w tym sposobność do rozwijania swoich umiejętności i zachęcania do wzajemnej dyskusji. Należy pamiętać, że wnioski wynikające z analiz prezentowanych na tym blogu nie powinny być bezpośrednio stosowane do podejmowania decyzji finansowych. Nawet jeśli analizy są dokładne, stanowią one tylko fragment potrzebnych informacji do podjęcia w pełni świadomej decyzji. Brak szerszego kontekstu, w którym znajduje się potencjalny inwestor lub decydent, może prowadzić do niepełnych wniosków.

Z tym wpisem zaczynam nowy projekt. Uznałem, że moim kolejnym krokiem będzie projekt dotyczący analizy sentymentów. Czym jest analiza sentymentów w kontekście analizy finansowej i Machine Learning'u?

Sentyment, w tym omawianym przez nas kontekście, to manifestowanie określonego nastawienia względem danej rzeczy, zdarzenia, zjawiska lub osoby; sentymentowi jasno możemy przypisać kategorie, np. pozytywny, neutralny, negatywny. Gdzie te wcześniej wyrażane sentymenty i następnie kwalifikowane, to po prostu teksty w języku naturalnym, na przykład komentarze na Facebook'u. 

Analiza sentymentów, to algorytmiczna kwalifikacja, bardzo często wsparta przez sztuczną inteligencję, polegająca na zakwalifikowaniu danej wypowiedzi do danej kategorii odzwierciedlającej jeden z sentymentów.

Ta powyższa definicja nie jest oczywiście ekspercką definicją, są to moje własne słowa i uważam, że w prosty sposób przekazują to co najważniejsze. Gdy ktoś jest zainteresowany tematem, to zawsze wskazane jest samodzielne szukanie i porównywanie ze sobą definicji i wyjaśnień różnych zagadnień, w tym jak i w każdym innym przypadku poruszanych przeze mnie tematów.

Tak jak to było w poprzedniej pracy na tym blogu i tak jak to zwykle wygląda w programowaniu, aby wykonać odpowiednią pracę, należy przywołać odpowiednie moduły, do których zasobów będziemy sięgać. 

Przed pokazaniem pierwszego kodu. Wspomnę tylko, że pracuję w Jupyterze używając Pythona.

import gensim
from gensim.parsing.preprocessing import STOPWORDS
from gensim.utils import simple_preprocess
import matplotlib.pyplot as plt
import nltk
from nltk.corpus import stopwords
from nltk.stem import PorterStemmer, WordNetLemmatizer
from nltk.tokenize import word_tokenize, sent_tokenize
import numpy as np
import pandas as pd
import plotly.express as px
import re
import seaborn as sns
from wordcloud import WordCloud, STOPWORDS

Niektóre linijki w powyższym kodzie pominę, zrobię to w sytuacji, gdy już omawiałem jakąś bibliotekę/funkcję lub jest ona popularna i nie mam zamiaru jej opisywać w tej chwili.

"gensim" - dzięki temu popracujemy bezpośrednio na tekście...

"STOPWORDS" importowany z "gensim" - będzie filtrował niepotrzebne słowa. "Niepotrzebne", w kontekście tego co robimy, to słowa bez znaczenia semantycznego jak np. spójniki albo zaimki. Jak się domyślacie, przy badaniu sentymentów istotne będą słowa nacechowane emocjonalnie, albo specyficznie zwroty, które mają pozytywny lub negatywny przekaz.

"simple_preprocess" - jak sama nazwa wskazuje, dokonuje prostego i wstępnego przetworzenia tekstu. Wchodzi w to normalizacja i tokenizacja. Domyślnie ta funkcja jest dedykowana do pracy z językiem angielskim, natomiast żeby nie komplikować w tej chwili nie będę podawał sposobu na ominięcie problemu braku wrażliwości na polskie znaki diakrytyczne i podam już przetworzony tekst: ['simple_preprocess', 'jak', 'sama', 'nazwa', 'wskazuje', 'dokonuje', 'prostego', 'wstepnego', 'przetworzenia', 'tekstu', 'wchodzi', 'to', 'normalizacja', 'tokenizacja'].

"nltk" - rozwinięciem tego skrótu będzie Natural Language Toolkit; myślę, że to jest dość sugestywne i tak to zostawię :-)

"PorterStemmer" - pozwala na redukcję słów, aby ułatwiać analizę tekstu. Przykładu w języku angielskim: słowo "jumping" zostanie zredukowane do "jump", "easily" do "easili", "wolves" do "wolv." Jak widzimy te redukcje zmieniają te słowa, nie jest to perfekcyjne narzędzie, istnieją bardziej wyrafinowane narzędzia. Również trzeba wziąć pod uwagę, że jeśli będziecie kiedyś analizować polski tekst, to odpowiednią biblioteką będzie wykorzystanie klasy "PolishStemmer" (część modułu NLTK: "nltk.stem.snowball.PolishStemmer"). Ja w tym projekcie użyję jakichś dostępnych w internecie anglojęzycznych danych, do których łatwiej będzie mi się dostać.

"WordNetLemmatizer" - narzędzie służące do lematyzacji słów, czyli do sprowadzania ich do podstawowych form. Korzyść jaka z tego płynie to redukcja "szumu" wynikającego z różnych odmian danych słów i pozostawienie tylko ich podstawowego znaczenie. Przykłady: lematem słowa "byłoby" jest "być", a "biegliśmy" jest "bieg." W zwykłej międzyludzkiej komunikacji oczywiście rozszerzenie o właściwe formy jest bardziej estetyczne i zrozumiałe i przede wszystkim poprawne gramatycznie, natomiast w kontekście machine learningu, ta redukcja i uściślanie jest korzyścią, a nie ujmą.

"WordCloud" - dla odmiany, zamiast słów, przekażę obrazek z moich własnych zasobów prezentujący word cloud :-) To akurat artystyczny przykład, który interpretuję jako metaforyczne przedstawienie złożoności dziedziny jaką jest analiza danych. Najczęściej word cloud, to zestaw słów kluczowych (lub zwrotów) tworzących jedną przyjemną dla oka mozaikę. W analizie danych, to jeden ze sposobów na z wizualizowanie danych.

Na sam koniec tego wpisu dodam, że jeśli nie posiadacie któregoś z modułów, to z łatwością możecie go zainstalować w Jupyter przy użyciu np. "!pip install nltk". Istotne jest, to aby dodać "!" (wykrzyknik) na samym początku. Ta sama zasada obowiązuje dla innych pip install. Z tą różnicą, że jeśli używałbym tych komend, na przykład w PowerShell'u to robiłbym to bez wykrzyknika ("!"), a chcąc zrobić to samo w Jupyter muszę dodać "!" na początku.

Brak komentarzy:

Prześlij komentarz

Analiza sentymentów - wpisy na mediach społecznościowych (podział danych)

Ten wpis zaczniemy od stworzenia DataFrame z danymi treningowymi train_df = pd.read_csv('train.csv', encoding='ISO-8859-1')....