felixchiuman's picture
created for hugging face space
9884551
import gradio as gr
import torch
from transformers import (
AutoTokenizer,
AutoModelForSeq2SeqLM,
pipeline,
AutoModelForSequenceClassification,
AutoModelForCausalLM
)
# Hugging Face login token (only needed for private models or DeepSeek)
import os
from huggingface_hub import login
hf_token = os.getenv("HF_TOKEN")
login(hf_token)
# Load PTSD summarization model
model_name = "machinelearningzuu/ptsd-summarization"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSeq2SeqLM.from_pretrained(model_name)
summarizer = pipeline("summarization", model=model, tokenizer=tokenizer)
# Sentiment analysis
sentiment_analyzer = pipeline("sentiment-analysis")
# Emotion classification
clf_model = AutoModelForSequenceClassification.from_pretrained("nateraw/bert-base-uncased-emotion")
clf_tokenizer = AutoTokenizer.from_pretrained("nateraw/bert-base-uncased-emotion")
labels = ['sadness', 'joy', 'love', 'anger', 'fear', 'surprise']
def classify_mental_state(text):
inputs = clf_tokenizer(text, return_tensors="pt", truncation=True, padding=True)
with torch.no_grad():
outputs = clf_model(**inputs)
logits = outputs.logits
probs = torch.nn.functional.softmax(logits, dim=1)
top_idx = torch.argmax(probs).item()
label = labels[top_idx]
confidence = probs[0][top_idx].item()
return f"{label.capitalize()} ({confidence:.2f})"
# DeepSeek suggestion generator
deepseek_model_id = "deepseek-ai/deepseek-llm-7b-chat"
deepseek_tokenizer = AutoTokenizer.from_pretrained(deepseek_model_id)
deepseek_model = AutoModelForCausalLM.from_pretrained(
deepseek_model_id,
torch_dtype=torch.float16,
device_map="auto",
token=True
)
deepseek_tokenizer.pad_token = deepseek_tokenizer.eos_token
def generate_suggestion(summary_text):
prompt = (
f"Patient summary: {summary_text}\n"
f"Based on this, provide 3 specific coping suggestions for PTSD symptoms:\n"
f"1."
)
inputs = deepseek_tokenizer([prompt], return_tensors="pt", padding=True, truncation=True).to(deepseek_model.device)
outputs = deepseek_model.generate(
input_ids=inputs["input_ids"],
attention_mask=inputs["attention_mask"],
max_new_tokens=200,
do_sample=True,
temperature=0.7,
eos_token_id=deepseek_tokenizer.eos_token_id,
pad_token_id=deepseek_tokenizer.pad_token_id
)
generated = deepseek_tokenizer.decode(outputs[0], skip_special_tokens=True)
suggestion = generated.split("1.", 1)[-1].strip()
return "1. " + suggestion
# Main logic for Gradio
def analyze_input(text):
try:
summary = summarizer(text, max_length=100, min_length=10, do_sample=False)[0]['summary_text']
sentiment = sentiment_analyzer(text)[0]
sentiment_result = f"{sentiment['label']} ({sentiment['score']:.2f})"
classification_result = classify_mental_state(text)
suggestion = generate_suggestion(summary)
return summary, sentiment_result, classification_result, suggestion
except Exception as e:
return "Error: " + str(e), "Error", "Error", "Error"
# Gradio UI
demo = gr.Interface(
fn=analyze_input,
inputs=[gr.Textbox(lines=10, placeholder="Enter patient report...", label="Patient Report")],
outputs=[
gr.Textbox(label="Summary"),
gr.Textbox(label="Sentiment Analysis"),
gr.Textbox(label="Mental Health Indicator"),
gr.Textbox(label="Suggested Advice")
],
title="Mental Health Assistant",
description="Summarizes PTSD-related text, detects emotional tone, classifies mental state, and generates non-clinical coping suggestions."
)
demo.launch()