mariamyasir commited on
Commit
e08d1b5
·
verified ·
1 Parent(s): 5f2a4d4

Upload RAG_streamlit_app.py

Browse files
Files changed (1) hide show
  1. RAG_streamlit_app.py +59 -0
RAG_streamlit_app.py ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ from transformers import pipeline, AutoTokenizer, AutoModelForSeq2SeqLM, AutoModelForSequenceClassification
3
+ from sentence_transformers import SentenceTransformer
4
+ import faiss, pickle
5
+ from PIL import Image
6
+ import os
7
+
8
+ tokenizer = AutoTokenizer.from_pretrained("sentiment_model")
9
+ model = AutoModelForSequenceClassification.from_pretrained("sentiment_model")
10
+ clf = pipeline("text-classification", model=model, tokenizer=tokenizer, device=-1)
11
+ embedder = SentenceTransformer("all-MiniLM-L6-v2", device="cpu")
12
+ gen_tok = AutoTokenizer.from_pretrained("google/flan-t5-small")
13
+ gen_model = AutoModelForSeq2SeqLM.from_pretrained("google/flan-t5-base")
14
+ index = faiss.read_index("faiss_index.index")
15
+ with open("passages.pkl", "rb") as f:
16
+ train_texts = pickle.load(f)
17
+
18
+ def retrieve_passages(query, k=5):
19
+ q_emb = embedder.encode([query])
20
+ D, I = index.search(q_emb, k)
21
+ return [train_texts[i] for i in I[0]]
22
+
23
+ def explain_sentiment(text, predicted_label, k=3):
24
+ retrieved = retrieve_passages(text, k=k)
25
+ retrieved_str = "\n- ".join(retrieved)
26
+ prompt = f"""
27
+ Text to analyze: "{text}"
28
+ Predicted sentiment: {predicted_label}
29
+ Retrieved examples:
30
+ - {retrieved_str}
31
+ Task: Write a clear explanation (1–2 sentences) about why the text is {predicted_label}.
32
+ Focus on emotional words, tone, and context. Do NOT just repeat the label.
33
+ """
34
+ inputs = gen_tok(prompt, return_tensors="pt", truncation=True, max_length=512)
35
+ outputs = gen_model.generate(**inputs, max_length=80)
36
+ explanation = gen_tok.decode(outputs[0], skip_special_tokens=True)
37
+ return {"retrieved": retrieved, "explanation": explanation}
38
+
39
+ st.title("Sentiment Analyzer")
40
+ image = Image.open("Social-Sentiment-Tracking.png")
41
+ st.image(image, width='stretch')
42
+ text = st.text_area("Enter text to analyze:")
43
+ if st.button("Predict"):
44
+ out = clf(text)[0]
45
+ pred = out['label']
46
+ score = out['score']
47
+ if pred == "LABEL_0":
48
+ human_pred = 'Negative'
49
+ elif pred == "LABEL_1":
50
+ human_pred = 'Neutral'
51
+ else:
52
+ human_pred = 'Positive'
53
+ st.write(f"**Prediction:** {human_pred} (confidence {score*100:.2f}%)")
54
+ rag_output = explain_sentiment(text, pred)
55
+ st.subheader("Retrieved evidence")
56
+ for r in rag_output['retrieved']:
57
+ st.write("-", r)
58
+ st.subheader("Explanation")
59
+ st.write(rag_output['explanation'])