File size: 4,128 Bytes
9a4b7b9
472f1d2
 
 
 
9a4b7b9
472f1d2
 
 
 
 
 
 
 
 
9a4b7b9
472f1d2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
from inference import SentimentInference
import os
from datasets import load_dataset
import random

# --- Initialize Sentiment Model ---
CONFIG_PATH = os.path.join(os.path.dirname(__file__), "config.yaml")
if not os.path.exists(CONFIG_PATH):
    CONFIG_PATH = "config.yaml"
    if not os.path.exists(CONFIG_PATH):
        raise FileNotFoundError(
            f"Configuration file not found. Tried {os.path.join(os.path.dirname(__file__), 'config.yaml')} and {CONFIG_PATH}. "
            f"Ensure 'config.yaml' exists and is accessible."
        )

print(f"Loading model with config: {CONFIG_PATH}")
try:
    sentiment_inferer = SentimentInference(config_path=CONFIG_PATH)
    print("Sentiment model loaded successfully.")
except Exception as e:
    print(f"Error loading sentiment model: {e}")
    sentiment_inferer = None

# --- Load IMDB Dataset ---
print("Loading IMDB dataset for samples...")
try:
    imdb_dataset = load_dataset("imdb", split="test")
    print("IMDB dataset loaded successfully.")
except Exception as e:
    print(f"Failed to load IMDB dataset: {e}. Sample loading will be disabled.")
    imdb_dataset = None

def load_random_imdb_sample():
    """Loads a random sample text from the IMDB dataset."""
    if imdb_dataset is None:
        return "IMDB dataset not available. Cannot load sample.", None
    random_index = random.randint(0, len(imdb_dataset) - 1)
    sample = imdb_dataset[random_index]
    return sample["text"], sample["label"]

def predict_sentiment(text_input, true_label_state):
    """Predicts sentiment for the given text_input."""
    if sentiment_inferer is None:
        return "Error: Sentiment model could not be loaded. Please check the logs.", true_label_state
    
    if not text_input or not text_input.strip():
        return "Please enter some text for analysis.", true_label_state
    
    try:
        prediction = sentiment_inferer.predict(text_input)
        sentiment = prediction['sentiment']
        
        # Convert numerical label to text if available
        true_sentiment = None
        if true_label_state is not None:
            true_sentiment = "positive" if true_label_state == 1 else "negative"
        
        result = f"Predicted Sentiment: {sentiment.capitalize()}"
        if true_sentiment:
            result += f"\nTrue IMDB Label: {true_sentiment.capitalize()}"
        
        return result, None  # Reset true label state after display
        
    except Exception as e:
        print(f"Error during prediction: {e}")
        return f"Error during prediction: {str(e)}", true_label_state

# --- Gradio Interface ---
with gr.Blocks() as demo:
    true_label = gr.State()
    
    gr.Markdown("## IMDb Sentiment Analyzer")
    gr.Markdown("Enter a movie review to classify its sentiment as Positive or Negative, or load a random sample from the IMDb dataset.")
    
    with gr.Row():
        input_textbox = gr.Textbox(lines=7, placeholder="Enter movie review here...", label="Movie Review", scale=3)
        output_text = gr.Text(label="Analysis Result", scale=1)

    with gr.Row():
        submit_button = gr.Button("Analyze Sentiment")
        load_sample_button = gr.Button("Load Random IMDB Sample")

    gr.Examples(
        examples=[
            ["This movie was absolutely fantastic! The acting was superb and the plot was gripping."],
            ["I was really disappointed with this film. It was boring and the story made no sense."],
            ["An average movie, had some good parts but overall quite forgettable."],
            ["Wow so I don't think I've ever seen a movie quite like that. The plot was... interesting, and the acting was, well, hmm."]
        ],
        inputs=input_textbox
    )

    # Wire actions
    submit_button.click(
        fn=predict_sentiment,
        inputs=[input_textbox, true_label],
        outputs=[output_text, true_label]
    )
    load_sample_button.click(
        fn=load_random_imdb_sample,
        inputs=None,
        outputs=[input_textbox, true_label]
    )

if __name__ == '__main__':
    print("Launching Gradio interface...")
    demo.launch(share=False)