Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import joblib | |
| from src.preprocess import preprocess, load_stopwords | |
| from src.build_features import transform_features | |
| # ========================= | |
| # Load model & vectorizer | |
| # ========================= | |
| model = joblib.load("models/model.pkl") | |
| vectorizer = joblib.load("models/vectorizer.pkl") | |
| stopwords = load_stopwords("data/vietnamese-stopwords.txt") | |
| # ========================= | |
| # Label mapping | |
| # ========================= | |
| label_map = { | |
| 0: "Negative 😡", | |
| 1: "Positive 😊" | |
| } | |
| # ========================= | |
| # Predict function | |
| # ========================= | |
| def predict(text): | |
| if text is None or text.strip() == "": | |
| return "Please enter a valid text" | |
| # preprocess | |
| tokens = preprocess(text, stopwords) | |
| text_clean = " ".join(tokens) | |
| # vectorize | |
| X = transform_features([text_clean], vectorizer) | |
| # predict | |
| pred = model.predict(X)[0] | |
| # probability (optional) | |
| try: | |
| proba = model.predict_proba(X).max() | |
| return f"{label_map[int(pred)]} ({proba:.2f})" | |
| except: | |
| return label_map[int(pred)] | |
| # ========================= | |
| # Gradio UI | |
| # ========================= | |
| demo = gr.Interface( | |
| fn=predict, | |
| inputs=gr.Textbox( | |
| lines=3, | |
| placeholder="Enter product review here..." | |
| ), | |
| outputs="text", | |
| title="Vietnamese E-commerce Sentiment Analysis", | |
| description="End-to-end ML pipeline (TF-IDF + Logistic Regression) for classifying product reviews as positive or negative.", | |
| ) | |
| # Launch app | |
| demo.launch() |