Untitled
import tensorflow as tf import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from tensorflow.keras.preprocessing.text import Tokenizer from tensorflow.keras.preprocessing.sequence import pad_sequences from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Input, Embedding, LSTM, Dense, Dropout # Ustaw losowe seed-y dla powtarzalności (opcjonalne) np.random.seed(42) tf.random.set_seed(42) # -------------------------------------------------------------------------- # 1. Wczytanie danych z pliku CSV # -------------------------------------------------------------------------- # Upewnij się, że plik "test.csv" znajduje się w tym samym folderze co ten skrypt # i że zawiera kolumnę "text" oraz "label". df = pd.read_csv("test.csv") # Możesz dodać argument 'encoding' jeśli potrzebne print("Pierwsze wiersze pliku:") print(df.head()) # Jeśli w pliku jest zbędna kolumna indeksowa (np. "Unnamed: 0"), można ją usunąć: df = df.drop(columns=["Unnamed: 0"], errors='ignore') # Zakładamy, że mamy kolumnę 'text' i 'label' required_columns = ["text", "label"] for col in required_columns: if col not in df.columns: raise ValueError(f"Brak wymaganej kolumny: {col} w pliku CSV.") # Wyciągamy dane wejściowe (X) i etykiety (y) X_raw = df["text"].astype(str).values # tekst w formie string y_raw = df["label"].values # etykiety numeryczne (np. 0..5) # Sprawdźmy, ile jest unikalnych etykiet: num_classes = len(np.unique(y_raw)) print("Liczba unikalnych klas:", num_classes) # -------------------------------------------------------------------------- # 2. Tokenizacja i wektoryzacja tekstu # -------------------------------------------------------------------------- VOCAB_SIZE = 10000 tokenizer = Tokenizer(num_words=VOCAB_SIZE, oov_token="<OOV>") tokenizer.fit_on_texts(X_raw) sequences = tokenizer.texts_to_sequences(X_raw) MAX_LEN = 50 X = pad_sequences(sequences, maxlen=MAX_LEN, padding='post', truncating='post') y = np.array(y_raw, dtype=np.int32) print("Przykładowy tekst:", X_raw[0]) print("Przykładowa sekwencja:", sequences[0][:10], "...") print("Przykładowa etykieta:", y[0]) # -------------------------------------------------------------------------- # 3. Podział na zbiór treningowy i testowy # -------------------------------------------------------------------------- X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42 ) print("Rozmiar zbioru treningowego:", X_train.shape[0]) print("Rozmiar zbioru testowego:", X_test.shape[0]) # -------------------------------------------------------------------------- # 4. Budowa modelu (multi-class single-label) # -------------------------------------------------------------------------- model = Sequential([ Input(shape=(MAX_LEN,)), # Użycie warstwy Input usuwa ostrzeżenie Embedding(input_dim=VOCAB_SIZE, output_dim=64), LSTM(128), Dropout(0.3), Dense(num_classes, activation='softmax') # Aktywacja softmax dla multi-class ]) # Używamy 'sparse_categorical_crossentropy' dla etykiet jako liczb całkowitych model.compile( loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'] ) model.summary() # -------------------------------------------------------------------------- # 5. Trenowanie # -------------------------------------------------------------------------- EPOCHS = 5 # Możesz zwiększyć do 10 lub więcej BATCH_SIZE = 32 history = model.fit( X_train, y_train, validation_data=(X_test, y_test), epochs=EPOCHS, batch_size=BATCH_SIZE ) # -------------------------------------------------------------------------- # 6. Predykcja + podgląd wyników # -------------------------------------------------------------------------- SAMPLES_TO_PREDICT = 5 predictions = model.predict(X_test[:SAMPLES_TO_PREDICT]) predicted_classes = np.argmax(predictions, axis=1) for i in range(SAMPLES_TO_PREDICT): decoded_text = tokenizer.sequences_to_texts([X_test[i]])[0] true_class = y_test[i] pred_class = predicted_classes[i] probability = predictions[i][pred_class] print("\n===== Przykład #%d =====" % (i+1)) print(f"Tekst: {decoded_text}") print(f"Prawdziwa etykieta: {true_class}") print(f"Przewidywana etykieta: {pred_class} (prawdopodobieństwo: {probability:.4f})") print("=========================")
Leave a Comment