File size: 2,586 Bytes
d13f651
 
 
 
 
 
ec3da25
d13f651
 
 
 
ec3da25
 
d13f651
ec3da25
d13f651
 
ec3da25
d13f651
 
ec3da25
 
d13f651
ec3da25
 
 
d13f651
 
 
762c0d3
d13f651
 
 
ec3da25
 
d13f651
ec3da25
 
d13f651
ec3da25
 
d13f651
ec3da25
d13f651
ec3da25
 
 
 
d13f651
ec3da25
d13f651
 
 
 
 
 
 
 
 
 
 
 
ec3da25
 
 
d13f651
 
 
 
 
 
 
ec3da25
 
d13f651
 
 
 
 
 
 
ec3da25
 
 
 
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
"""Predict sentiment from the command line with the shared inference service."""

import argparse
import sys
from pathlib import Path

PROJECT_ROOT = Path(__file__).resolve().parent.parent
sys.path.insert(0, str(PROJECT_ROOT))

from src.inference import SentimentAnalyzer
from src.utils import clean_text


def print_prediction(text: str, prediction: dict, verbose: bool = False) -> None:
    if verbose:
        debug = prediction["debug"]
        tokens = debug["tokens"]
        print(f"  Tokens ({len(tokens)}) : {tokens[:15]}{'...' if len(tokens) > 15 else ''}")
        print(f"  Logits bruts : {debug['logits']}")
        print(f"  Probabilites : {prediction['probabilities']}")

    print(f"\n  Avis      : {text[:100]}{'...' if len(text) > 100 else ''}")
    print(f"  Sentiment : {prediction['label'].upper()}")
    print(f"  Confiance : {prediction['confidence']:.2%}")


def predict_and_print(analyzer: SentimentAnalyzer, text: str, verbose: bool) -> None:
    prediction = analyzer.predict(text, include_debug=verbose)
    print_prediction(text, prediction, verbose)


def interactive_mode(analyzer: SentimentAnalyzer) -> None:
    print("\nMode interactif - tapez un avis puis Entree ('q' pour quitter)\n")
    while True:
        try:
            text = clean_text(input("Votre avis > "))
        except (EOFError, KeyboardInterrupt):
            break
        if text.lower() in {"q", "quit", "exit"}:
            break
        if not text:
            print("  (texte vide, reessayez)")
            continue
        predict_and_print(analyzer, text, verbose=True)
        print()
    print("Au revoir !")


def main() -> None:
    parser = argparse.ArgumentParser(
        description="Analyse de sentiment d'un avis en francais"
    )
    parser.add_argument(
        "text",
        nargs="?",
        default=None,
        help="Avis a analyser. Sans argument : mode interactif.",
    )
    parser.add_argument(
        "--verbose",
        action="store_true",
        help="Affiche les tokens, logits et probabilites",
    )
    args = parser.parse_args()

    try:
        analyzer = SentimentAnalyzer().load()
    except OSError as error:
        sys.exit(
            f"Erreur : modele introuvable ou inaccessible ({error}).\n"
            "Lancez d'abord : python scripts/train.py"
        )

    if args.text is None:
        interactive_mode(analyzer)
        return

    text = clean_text(args.text)
    if not text:
        sys.exit("Erreur : le texte est vide.")
    predict_and_print(analyzer, text, args.verbose)


if __name__ == "__main__":
    main()