File size: 4,475 Bytes
5c8f9d2 aa2da0e 5c8f9d2 aa2da0e 5c8f9d2 aa2da0e 5c8f9d2 aa2da0e 5c8f9d2 aa2da0e 5c8f9d2 aa2da0e 5c8f9d2 aa2da0e 5c8f9d2 aa2da0e 5c8f9d2 aa2da0e 5c8f9d2 aa2da0e 5c8f9d2 aa2da0e 5c8f9d2 aa2da0e 5c8f9d2 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
"""
Interaktywny skrypt do testowania klasyfikatora jakości tekstu.
Ten moduł dostarcza prosty interfejs wiersza poleceń (CLI) do analizy
pojedynczych tekstów. Po uruchomieniu, skrypt wczytuje te same modele
i komponenty, które są używane w procesie przetwarzania wsadowego
(TextAnalyzer, Scaler, Classifier).
Jest to narzędzie przeznaczone do szybkich testów, debugowania i demonstracji
działania modelu, zapewniając spójność wyników z przetwarzaniem masowym.
Użycie:
python interactive_classifier.py
"""
import pickle
import joblib
import pandas as pd
from text_analyzer.analyzer import TextAnalyzer
from text_analyzer import constants
MODELS_DIR = 'models'
# --- Ładowanie modeli ---
print("Ładowanie modeli i analizatora...")
with open('models/scaler.pkl', 'rb') as f:
scaler = pickle.load(f)
classifier = joblib.load("models/model.joblib")
text_analyzer = TextAnalyzer()
# --- Definicje funkcji ---
def classify_single_text(text_to_classify: str) -> tuple[str | None, float | None]:
"""
Analizuje pojedynczy tekst i dokonuje predykcji jego jakości,
używając tego samego potoku co w przetwarzaniu wsadowym.
Potok inferencyjny:
1. Ekstrakcja cech za pomocą TextAnalyzer.
2. Uporządkowanie cech zgodnie z `constants.COLUMN_ORDER`.
3. Skalowanie cech za pomocą wczytanego skalera.
4. Predykcja prawdopodobieństw klas za pomocą modelu.
5. Wybór najbardziej prawdopodobnej klasy i formatowanie wyniku.
Args:
text_to_classify (str): Ciąg znaków do analizy.
Returns:
tuple[str | None, float | None]: zawiera:
- Przewidywaną kategorię ('LOW', 'MEDIUM', 'HIGH') lub None w przypadku błędu.
- Pewność predykcji (w procentach) lub None w przypadku błędu.
"""
# Krok walidacji wejścia
if not isinstance(text_to_classify, str) or not text_to_classify.strip():
print("Błąd: Wprowadzony tekst jest pusty lub nie jest typu string.")
return None, None
try:
# Krok 1: Ekstrakcja cech. Używamy `analyze_batch` z listą jednoelementową,
# `next()` pobiera pierwszy (i jedyny) wynik z generatora
features_dict = next(text_analyzer.analyze_batch([text_to_classify]))
# Krok 2: Uporządkowanie cech
ordered_features = [features_dict.get(fname, 0.0) for fname in constants.COLUMN_ORDER]
# Krok 3: Przygotowanie danych do predykcji (DataFrame z jedną próbką)
features_df = pd.DataFrame([ordered_features], columns=constants.COLUMN_ORDER)
input_features_scaled = scaler.transform(features_df)
# Krok 4: Wykonanie predykcji.
y_pred_proba = classifier.predict_proba(input_features_scaled)
# Krok 5: Przetworzenie wyników predykcji
labels = ["LOW", "MEDIUM", "HIGH"]
category_probabilities = {
label: prob
for label, prob in zip(labels, y_pred_proba[0])
}
most_probable_category = max(category_probabilities, key=category_probabilities.get)
confidence = round(category_probabilities[most_probable_category] * 100, 2)
return most_probable_category, confidence
except Exception as e:
print(f"\nWystąpił nieoczekiwany błąd podczas przetwarzania tekstu.")
print(f"Szczegóły błędu: {e}")
return None, None
# --- Główny blok wykonawczy ---
if __name__ == '__main__':
print("\n--- Interaktywny Klasyfikator Jakości Tekstu ---")
print("Wpisz tekst i naciśnij Enter, aby uzyskać klasyfikację.")
print("Wpisz 'quit' lub 'exit', aby zakończyć.")
# Główna pętla interaktywna
while True:
try:
# Read: Pobierz dane wejściowe od użytkownika
user_input = input("\n> ")
if user_input.lower() in ['quit', 'exit']:
print("Zamykanie programu...")
break
# Przetwórz dane wejściowe.
category, confidence = classify_single_text(user_input)
# Wyświetl wynik
if category is not None:
print(f" └── Predykcja: {category} (Pewność: {confidence}%)")
except KeyboardInterrupt:
print("\nPrzerwano przez użytkownika. Zamykanie programu...")
break |