import streamlit as st from transformers import pipeline, AutoTokenizer, AutoModelForSeq2SeqLM, AutoModelForSequenceClassification from sentence_transformers import SentenceTransformer import faiss, pickle from PIL import Image import os tokenizer = AutoTokenizer.from_pretrained("sentiment_model") model = AutoModelForSequenceClassification.from_pretrained("sentiment_model") clf = pipeline("text-classification", model=model, tokenizer=tokenizer, device=-1) embedder = SentenceTransformer("all-MiniLM-L6-v2", device="cpu") gen_tok = AutoTokenizer.from_pretrained("google/flan-t5-base") gen_model = AutoModelForSeq2SeqLM.from_pretrained("google/flan-t5-base") index = faiss.read_index("faiss_index.index") with open("passages.pkl", "rb") as f: train_texts = pickle.load(f) def retrieve_passages(query, k=5): q_emb = embedder.encode([query]) D, I = index.search(q_emb, k) return [train_texts[i] for i in I[0]] def explain_sentiment(text, predicted_label, k=3): retrieved = retrieve_passages(text, k=k) retrieved_str = "\n- ".join(retrieved) prompt = f""" Text to analyze: "{text}" Predicted sentiment: {predicted_label} Retrieved examples: - {retrieved_str} Task: Write a clear explanation (1–2 sentences) about why the text is {predicted_label}. Focus on emotional words, tone, and context. Do NOT just repeat the label. """ inputs = gen_tok(prompt, return_tensors="pt", truncation=True, max_length=512) outputs = gen_model.generate(**inputs, max_length=80) explanation = gen_tok.decode(outputs[0], skip_special_tokens=True) return {"retrieved": retrieved, "explanation": explanation} st.title("Sentiment Analyzer") image = Image.open("Social-Sentiment-Tracking.png") st.image(image, width='stretch') text = st.text_area("Enter text to analyze:") if st.button("Predict"): out = clf(text)[0] pred = out['label'] score = out['score'] if pred == "LABEL_0": human_pred = 'Negative' elif pred == "LABEL_1": human_pred = 'Neutral' else: human_pred = 'Positive' st.write(f"**Prediction:** {human_pred} (confidence {score*100:.2f}%)") rag_output = explain_sentiment(text, pred) st.subheader("Retrieved evidence") for r in rag_output['retrieved']: st.write("-", r) st.subheader("Explanation") st.write(rag_output['explanation'])