File size: 3,931 Bytes
3c8bf54
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# -*- coding: utf-8 -*-
"""app.ipynb

Automatically generated by Colab.

Original file is located at
    https://colab.research.google.com/drive/1EyjV73NmmvRi7U_r_GxUjz4X-5-6yMgE
"""

# load_and_run_pkl_model.py
# This script ONLY loads a pre-saved PKL file and runs a Gradio interface for it.

import gradio as gr
import pickle
import os

# --- Dependencies required ONLY for the class definition used by pickle ---
# We are NOT calling pipeline() here to load models from Hugging Face.
# Pickle just needs to know the *structure* of the saved object.
from transformers import pipeline
import torch

# --- Define the Class Structure ---
# IMPORTANT: This MUST exactly match the class definition used when
# the .pkl file was SAVED. Pickle needs this to reconstruct the object.

# --- Configuration: Path to your saved PKL file ---
PICKLE_FILENAME = "combined_analyzer.pkl"
MODEL_DIR = "saved_model" # Directory where the PKL file is located
PICKLE_FILEPATH = os.path.join(MODEL_DIR, PICKLE_FILENAME)

# --- Global Variable to hold the loaded analyzer ---
LOADED_ANALYZER = None
LOAD_ERROR_MESSAGE = None

# --- Load the Saved Model from PKL File ---
print("-" * 40)
print(f"Attempting to load analyzer object from: {PICKLE_FILEPATH}")
try:
    # Security Note: Only unpickle files you trust.
    if not os.path.exists(PICKLE_FILEPATH):
         raise FileNotFoundError(f"Cannot find the model file at '{PICKLE_FILEPATH}'. Make sure it exists.")

    with open(PICKLE_FILEPATH, 'rb') as f:
        # The actual loading happens here
        LOADED_ANALYZER = pickle.load(f)

    # Validate the loaded object (basic check)
    if not isinstance(LOADED_ANALYZER, CombinedAnalyzer) or not callable(getattr(LOADED_ANALYZER, 'analyze', None)):
        LOADED_ANALYZER = None # Invalidate if it's not the right type or lacks the method
        raise TypeError("The loaded object from the PKL file is not a valid 'CombinedAnalyzer' instance or is corrupted.")
    else:
        print(">>> Successfully loaded analyzer object from PKL file.")

except Exception as e:
    LOAD_ERROR_MESSAGE = f"ERROR: Failed to load model from '{PICKLE_FILEPATH}'.\nDetails: {e}"
    print(LOAD_ERROR_MESSAGE)
    LOADED_ANALYZER = None # Ensure it's None if any error occurred

print("-" * 40)

# --- Gradio Function (Uses the globally loaded object) ---
def perform_analysis(input_text):
    """This function is called by the Gradio interface."""
    if LOADED_ANALYZER is None:
        # If loading failed earlier, return the error message
        return LOAD_ERROR_MESSAGE or "Error: Analyzer model is not loaded."

    if not input_text or not input_text.strip():
        return "Please enter some text to analyze."

    # Use the 'analyze' method of the object loaded from the PKL file
    try:
        results = LOADED_ANALYZER.analyze(input_text)
        return results
    except Exception as e:
        # Catch errors during the analysis itself
        print(f"Error during analysis execution: {e}")
        return f"An error occurred during analysis:\n{e}"

# --- Create the Gradio Interface ---
gradio_app_description = f"Enter text to analyze using the model loaded from `{PICKLE_FILEPATH}`."
if LOADED_ANALYZER is None:
    gradio_app_description += "\n\n**WARNING: Model failed to load. Analysis will not function.**"

interface = gr.Interface(
    fn=perform_analysis, # The function that runs the analysis
    inputs=gr.Textbox(lines=8, placeholder="Enter text here...", label="Input Text"),
    outputs=gr.Textbox(lines=8, label="Analysis Results", interactive=False),
    title="Analyze Text with Saved Model",
    description=gradio_app_description,
    allow_flagging='never'
)

# --- Launch the Gradio App ---
if __name__ == "__main__":
    print("Launching Gradio interface...")
    if LOADED_ANALYZER is None:
        print("!!! Warning: Launching interface, but model loading failed. Check errors above. !!!")
    interface.launch()