Joblib
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