mariamyasir commited on
Commit
38a1c3c
·
verified ·
1 Parent(s): 8b0615e

Update RAG_streamlit_app.py

Browse files
Files changed (1) hide show
  1. RAG_streamlit_app.py +60 -59
RAG_streamlit_app.py CHANGED
@@ -1,60 +1,61 @@
1
- import streamlit as st
2
- from transformers import pipeline, AutoTokenizer, AutoModelForSeq2SeqLM, AutoModelForSequenceClassification
3
- from sentence_transformers import SentenceTransformer
4
- import faiss, pickle
5
- import os
6
- from PIL import Image
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
- prompt = f"""
26
- Text to analyze: "{text}"
27
- Predicted sentiment: {predicted_label}
28
-
29
- Retrieved examples:
30
- - {"\n- ".join(retrieved)}
31
-
32
- Task: Write a clear explanation (1–2 sentences) about why the text is {predicted_label}.
33
- Focus on emotional words, tone, and context. Do NOT just repeat the label.
34
- """
35
- inputs = gen_tok(prompt, return_tensors="pt", truncation=True, max_length=512)
36
- outputs = gen_model.generate(**inputs, max_length=80)
37
- explanation = gen_tok.decode(outputs[0], skip_special_tokens=True)
38
- return {"retrieved": retrieved, "explanation": explanation}
39
-
40
- st.title("Sentiment Analyzer")
41
- image = Image.open(r"Social-Sentiment-Tracking.png")
42
- st.image(image, width='stretch')
43
- text = st.text_area("Enter text to analyze:")
44
- if st.button("Predict"):
45
- out = clf(text)[0]
46
- pred = out['label']
47
- score = out['score']
48
- if pred == "LABEL_0":
49
- human_pred = 'Negative'
50
- elif pred == "LABEL_1":
51
- human_pred = 'Neutral'
52
- else:
53
- human_pred = 'Positive'
54
- st.write(f"**Prediction:** {human_pred} (confidence {score*100:.2f}%)")
55
- rag_output = explain_sentiment(text, pred)
56
- st.subheader("Retrieved evidence")
57
- for r in rag_output['retrieved']:
58
- st.write("-", r)
59
- st.subheader("Explanation")
 
60
  st.write(rag_output['explanation'])
 
1
+ import streamlit as st
2
+ from transformers import pipeline, AutoTokenizer, AutoModelForSeq2SeqLM, AutoModelForSequenceClassification
3
+ from sentence_transformers import SentenceTransformer
4
+ import faiss, pickle
5
+ import os
6
+ from PIL import Image
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
+
30
+ Retrieved examples:
31
+ - {retrieved_str}
32
+
33
+ Task: Write a clear explanation (1–2 sentences) about why the text is {predicted_label}.
34
+ Focus on emotional words, tone, and context. Do NOT just repeat the label.
35
+ """
36
+ inputs = gen_tok(prompt, return_tensors="pt", truncation=True, max_length=512)
37
+ outputs = gen_model.generate(**inputs, max_length=80)
38
+ explanation = gen_tok.decode(outputs[0], skip_special_tokens=True)
39
+ return {"retrieved": retrieved, "explanation": explanation}
40
+
41
+ st.title("Sentiment Analyzer")
42
+ image = Image.open(r"Social-Sentiment-Tracking.png")
43
+ st.image(image, width='stretch')
44
+ text = st.text_area("Enter text to analyze:")
45
+ if st.button("Predict"):
46
+ out = clf(text)[0]
47
+ pred = out['label']
48
+ score = out['score']
49
+ if pred == "LABEL_0":
50
+ human_pred = 'Negative'
51
+ elif pred == "LABEL_1":
52
+ human_pred = 'Neutral'
53
+ else:
54
+ human_pred = 'Positive'
55
+ st.write(f"**Prediction:** {human_pred} (confidence {score*100:.2f}%)")
56
+ rag_output = explain_sentiment(text, pred)
57
+ st.subheader("Retrieved evidence")
58
+ for r in rag_output['retrieved']:
59
+ st.write("-", r)
60
+ st.subheader("Explanation")
61
  st.write(rag_output['explanation'])