Cain / app.py
Sephfox's picture
Update app.py
dcd9bf1 verified
raw
history blame
6.73 kB
import random
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import nltk
import gradio as gr
from nltk.sentiment import SentimentIntensityAnalyzer
from textblob import TextBlob
import warnings
from transformers import (
AutoTokenizer,
AutoModelForCausalLM,
AutoModelForSequenceClassification,
)
# Suppress warnings and fix Gradio schema bug
warnings.filterwarnings('ignore', category=FutureWarning)
nltk.download('vader_lexicon', quiet=True)
# --- Emotion Analyzer ---
class EmotionalAnalyzer:
def __init__(self):
try:
self.model = AutoModelForSequenceClassification.from_pretrained(
"bhadresh-savani/distilbert-base-uncased-emotion"
)
self.tokenizer = AutoTokenizer.from_pretrained(
"bhadresh-savani/distilbert-base-uncased-emotion"
)
except Exception:
self.model = None
self.tokenizer = None
self.labels = ["sadness", "joy", "love", "anger", "fear", "surprise"]
self.sia = SentimentIntensityAnalyzer()
def predict_emotion(self, text):
try:
if self.model is None or self.tokenizer is None:
raise ValueError("Model or tokenizer not initialized properly.")
inputs = self.tokenizer(text, return_tensors="pt", truncation=True, max_length=512)
with torch.no_grad():
outputs = self.model(**inputs)
probs = torch.nn.functional.softmax(outputs.logits, dim=-1)
return self.labels[torch.argmax(probs).item()]
except Exception:
return "Unknown"
def analyze(self, text):
try:
vader_scores = self.sia.polarity_scores(text)
blob = TextBlob(text)
blob_data = {
"polarity": blob.sentiment.polarity,
"subjectivity": blob.sentiment.subjectivity,
"word_count": len(blob.words),
"sentence_count": len(blob.sentences),
}
return {
"emotion": self.predict_emotion(text),
"vader": vader_scores,
"textblob": blob_data,
}
except Exception:
return {"emotion": "Unknown", "vader": {}, "textblob": {}}
def plot_emotions(self):
try:
simulated_emotions = {
"joy": random.randint(10, 30),
"sadness": random.randint(5, 20),
"anger": random.randint(10, 25),
"fear": random.randint(5, 15),
"love": random.randint(10, 30),
"surprise": random.randint(5, 20),
}
df = pd.DataFrame(list(simulated_emotions.items()), columns=["Emotion", "Percentage"])
plt.figure(figsize=(8, 4))
sns.barplot(x="Emotion", y="Percentage", data=df)
plt.title("Simulated Emotional State")
plt.tight_layout()
path = "emotions.png"
plt.savefig(path)
plt.close()
return path
except Exception:
return None
# --- Text Completion LLM ---
tokenizer = AutoTokenizer.from_pretrained("diabolic6045/ELN-Llama-1B-base")
model = AutoModelForCausalLM.from_pretrained("diabolic6045/ELN-Llama-1B-base")
def generate_completion(message, temperature, max_length):
try:
inputs = tokenizer(message, return_tensors="pt", truncation=True, max_length=512)
input_ids = inputs["input_ids"]
current_text = message
for _ in range(max_length - input_ids.shape[1]):
with torch.no_grad():
outputs = model(input_ids)
logits = outputs.logits[:, -1, :] / temperature
probs = torch.softmax(logits, dim=-1)
next_token = torch.multinomial(probs, num_samples=1)
if next_token.item() == tokenizer.eos_token_id:
break
input_ids = torch.cat([input_ids, next_token], dim=-1)
new_token_text = tokenizer.decode(next_token[0], skip_special_tokens=True)
current_text += new_token_text
return current_text
except Exception:
return "Error generating text."
# --- Emotion-Aware LLM Response ---
def emotion_aware_response(input_text):
try:
analyzer = EmotionalAnalyzer()
results = analyzer.analyze(input_text)
image_path = analyzer.plot_emotions()
prompt = (
f"Input: {input_text}\n"
f"Detected Emotion: {results['emotion']}\n"
f"VADER Scores: {results['vader']}\n"
f"Respond thoughtfully and emotionally aware:"
)
inputs = tokenizer(prompt, return_tensors="pt", truncation=True, max_length=512)
with torch.no_grad():
output_ids = model.generate(
inputs.input_ids,
max_length=512,
do_sample=True,
temperature=0.7,
top_k=50,
top_p=0.95,
pad_token_id=tokenizer.eos_token_id
)
response = tokenizer.decode(output_ids[0], skip_special_tokens=True)
summary = (
f"Emotion: {results['emotion']}\n"
f"VADER: {results['vader']}\n"
f"TextBlob: {results['textblob']}\n\n"
f"LLM Response:\n{response}"
)
return summary, image_path
except Exception:
return "Error processing emotion-aware response", None
# --- Gradio Interface ---
with gr.Blocks(title="ELN LLaMA 1B Enhanced Demo") as app:
gr.Markdown("## 🧠 ELN-LLaMA Emotion-Aware & Completion Interface")
with gr.Tab("💬 Emotion-Aware Response"):
with gr.Row():
input_text = gr.Textbox(label="Input Text", lines=4, placeholder="Type something with emotion or meaning...")
with gr.Row():
text_output = gr.Textbox(label="Response", lines=8)
img_output = gr.Image(label="Emotional Visualization")
emotion_btn = gr.Button("Generate Emotion-Aware Response")
emotion_btn.click(emotion_aware_response, inputs=input_text, outputs=[text_output, img_output])
with gr.Tab("📝 Text Completion"):
comp_text = gr.Textbox(label="Prompt", lines=4)
comp_temp = gr.Slider(minimum=0.1, maximum=1.0, value=0.7, label="Temperature")
comp_len = gr.Slider(minimum=50, maximum=500, value=200, step=50, label="Max Length")
comp_output = gr.Textbox(label="Generated Completion", lines=8)
comp_button = gr.Button("Complete Text")
comp_button.click(generate_completion, inputs=[comp_text, comp_temp, comp_len], outputs=comp_output)
app.launch(share=True)