TruthLens-Backend / services /analysis /emotion_detector.py
Gargi Monga
Deploy backend
c8b1fd7
Raw
History Blame Contribute Delete
2.04 kB
import json
from typing import Dict, Any
from transformers import pipeline
from ai.sarvam_client import generate_response, extract_json
emotion_classifier = pipeline(
"text-classification",
model="j-hartmann/emotion-english-distilroberta-base",
top_k=None
)
def get_emotion_scores(text: str):
predictions = emotion_classifier(text)[0]
scores = {}
for item in predictions:
scores[item["label"]] = round(item["score"], 4)
return scores
def create_emotion_prompt(text: str):
scores = get_emotion_scores(text)
return f"""
Analyze this news article for emotional manipulation.
Emotion scores:
{scores}
Article:
{text}
Return ONLY this JSON.
{{
"fear_detected":false,
"urgency_detected":false,
"outrage_detected":false,
"sensationalism_detected":false,
"emotion_intensity":0.0,
"explanation":""
}}
Output ONLY JSON.
Do NOT explain.
Do NOT use markdown.
"""
def get_emotion_from_model(text):
return generate_response(
create_emotion_prompt(text)
)
def parse_model_response(response):
default = {
"fear_detected": False,
"urgency_detected": False,
"outrage_detected": False,
"sensationalism_detected": False,
"emotion_intensity": 0.0,
"explanation": "No response received from Sarvam AI."
}
if response is None:
return default
parsed = extract_json(response)
if parsed is None:
return {
**default,
"explanation": "Could not parse model response.",
}
for key in default:
parsed.setdefault(key, default[key])
return parsed
def analyze_emotion(text):
if not text.strip():
return {
"fear_detected": False,
"urgency_detected": False,
"outrage_detected": False,
"sensationalism_detected": False,
"emotion_intensity": 0.0,
"explanation": "Empty input."
}
raw = get_emotion_from_model(text)
return parse_model_response(raw)