niedziela, 16 czerwca 2024

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').dropna(subset=['text', 'sentiment'])

Ta linijka kodu pozwala na załadowanie danych z pliku "train.csv" do zbioru danych treningowych train_df. Użyte jest kodowanie znaków "ISO-8859-1", które jest standardem dla języków zachodnioeuropejskich, pozwalającym odczytać i zinterpretować znaki takie jak "é". Dzięki funkcji dropna() pozbywamy się wartości NaN z naszego zbioru danych. Parametr subset określa, które kolumny mają być brane pod uwagę przy usuwaniu braków. Usuwamy braki w kolumnach "text" (zawierającej wpisy na Twitterze) oraz "sentiment" (określającej sentyment). Gdybyśmy nie pozbyli się tych pustych wartości, mogłoby to zaburzyć proces trenowania modelu.

Kolejną linijką kodu jest:

test_df = pd.read_csv('test.csv', encoding='ISO-8859-1').dropna(subset=['text', 'sentiment']) 

Jest to zestawy tych samych operacji tylko, że tym razem odbywają się one na zbiorze testowym "test.csv".

Kolejnym krokiem jest podzielenie zbioru treningowego na dwa zestawy. Jeden z nich będzie zawierał teksty, których sentyment badamy, a drugi wartości wynikowe, które mogą być jedną z trzech możliwości: pozytywny, negatywny lub neutralny.

train_texts = train_df['text'].values
train_labels = train_df['sentiment'].values

To samo zróbmy dla zbioru testowego:

test_texts = test_df['text'].values
test_labels = test_df['sentiment'].values

"text" lub "sentiment" to nazwy kolumn, a właściwość "values" sprawia, że dana kolumna jest konwertowana do tablicy NumPy. Dzięki takiej konwersji dane będą kompatybilne z wymaganiami narzędzi NLP.

Z mapujmy sobie etykiety sentymentów, z określeń w języku naturalnym na liczby.

label_encoder = {'positive':1, 'negative': -1, 'neutral': 0}

"label_encoder" od teraz przechowuje wartości znacznie bardziej przydatne do trenowania modelu. Każde z trzech możliwych oznaczeń sentymentów danej wypowiedzi zostało zakodowane na wartości 1, -1 i 0, to jest istotne z punktu widzenia działania algorytmu.

I tak, mając już etykiety z mapowane można przejść do stworzenia zbioru z danymi wynikowymi (ze zmiennymi zależnymi).

y_train = np.array([label_encoder[label] for label in train_labels])

Metoda "np.array()" tworzy końcową listę etykiet sentymentów, co będzie stanowić zbiór danych do predykcji podczas treningu modelu. Te wartości są tworzone w taki sposób, że "label" sprawdza "train_labels" i jeśli załóżmy pierwszą wartością w train_labels będzie "positive" co będzie etykietą sentymentu, to dzięki słownikowi "label_encoder" do "y_train" zostanie dopisana, w tym przypadku wartość równa 1. "Label_encoder" posiada słownik, w którym "positive" odnosi się do wartości 1. Niech drugim elementem, będzie sentyment opisany jako "neutral", zostanie to odniesione do zawartości "label_encoder" i "y_train" zyska kolejną wartość, w tym wypadku 0, gdyż w zbiorze "label_encoder" jest jasno zapisane, że "neutral" odpowiada wartości 0.

y_test = np.array([label_encoder[label] for label in test_labels])

Analogicznie, robimy to samo co wcześniej, tym razem na danych testowych. W rezultacie tworzymy zbiór danych wynikowych (wartości określających dany sentyment: pozytywny, negatywny lub neutralny dla każdej wartości z "test_labels"), który będzie użyty podczas testowania modelu.

C.d.n... ;-)

Wpis oparty o wiedzę z kursu: Machine Learning Mastery

Analiza sentymentów - wpisy na mediach społecznościowych (ustawianie środowiska)

Ten wpis, podobnie jak cała zawartość bloga, odzwierciedla moje zainteresowania rozwojem w dziedzinie informatyki. Główne cele tego przedsięwzięcia to dzielenie się wiedzą, demonstracja moich umiejętności oraz chęć poznawania nowych zagadnień, co może zainteresować potencjalnych współpracowników zarówno w sferze zawodowej, jak i poza nią. Blog ten jest również okazją do samodzielnego przetwarzania zdobytej wiedzy i tworzenia osobistych notatek. Jako że sam jestem w trakcie nauki, zachęcam do niezależnego myślenia i, jeśli tematyka wpisów wpisuje się w zakres Twoich zainteresowań, do dalszej eksploracji i weryfikacji podanych przeze mnie informacji.

Rozpocznę nową serię wpisów. Projekt ten będzie dotyczył analizy sentymentów treści, które z założenia reprezentują wpisy na mediach społecznościowych, takich jak na przykład Twitter. Model będzie miał na celu ocenę, czy dany tweet ma charakter pozytywny, negatywny czy neutralny.

Użyję do tego zbioru danych, dostępnego na Kaggle: Sentiment Analysis Dataset. Zbiór danych zawiera zbiór treningowy i testowy.

A teraz przejdę do opisu mojego Jupiter Notebook. Najpierw zaczniemy od zaimportowania odpowiednich modułów.

Importując numpy jako np, będziemy mogli dokonywać różnych operacji matematycznych na tablicach danych i macierzach.

Importując pandas jako pd, będziemy mogli manipulować danymi znajdującymi się w Seriach (Series) i w Ramkach Danych (DataFrame).

Importując TfidfVectorizer z modułu sklearn.feature_extraction.text, przekształcimy teksty na macierz cech TF-IDF (Term Frequency-Inverse Document Frequency). Co nam to da? Każde słowo będzie mogło otrzymać wagę, odzwierciedlając jego ważność w całym dokumencie. Znaczenie często używanych słów, takich jak "i" lub "jest", zostanie zredukowane. Teksty zostaną odzwierciedlone w formie wektorowej reprezentacji liczbowej, co umożliwi użycie algorytmów uczenia maszynowego.

Importując train_test_split z modułu sklearn.model_selection, będziemy mogli podzielić dane na zbiór testowy i treningowy. Dzięki temu określimy wydajność naszego modelu, używając danych testowych. Kiedy zauważymy, że model słabo generalizuje na zbiorze testowym, to może znaczyć, że jest przeuczony.

Importując LogisticRegression z modułu sklearn.linear_model, będziemy mogli utworzyć modele regresji logistycznej. Klasyfikuje ona binarnie, ale też wieloklasowo. U nas będzie to pozytywny (positive), negatywny (negative) i neutralny (neutral) sentyment. Przykłady danych są oczywiście dostępne do podejrzenia na stronie Kaggle podanej na samym początku. Regresja logistyczna to przy okazji stosunkowo prosty i wydajny model. Skutecznie radzi sobie z dużymi zbiorami danych w krótkim czasie.

Importując Word2Vec z modułu gensim.models, słowa zostaną zamienione na wektory (embeddingi). Korzyści z użycia: przekształca słowa na wektory, które reprezentują semantyczne znaczenie słów. Słowa o podobnym znaczeniu mają wektory, które są do siebie podobne. Word2Vec jest w stanie uchwycić kontekst, porównując dane teksty z tekstami w ich sąsiedztwie.

Importując accuracy_score z modułu sklearn.metrics, będziemy mogli ocenić skuteczność modelu. Ten sposób oceny modelu jest bardzo prosty i intuicyjny, gdyż pokazuje stosunek poprawnych predykcji do całkowitej liczby predykcji. Nazywamy to dokładnością.

Wpis oparty o wiedzę z kursu: Machine Learning Mastery

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')....