import json import torch import gradio as gr from huggingface_hub import hf_hub_download from transformers import AutoTokenizer, AutoModelForSequenceClassification import torch.nn.functional as F MODEL_ID = "th-nuernberg/xlm-roberta-base-online-counseling-oncoco" tokenizer = AutoTokenizer.from_pretrained(MODEL_ID) model = AutoModelForSequenceClassification.from_pretrained(MODEL_ID) model.eval() path = hf_hub_download("th-nuernberg/OnCoCoV1", "code_to_category.json", repo_type="dataset") code2cat = json.load(open(path)) id2label = model.config.id2label examples = [ "Counselor: It sounds like you're feeling overwhelmed. Can you tell me more?", "Counselor: You mentioned feeling very alone in this. What kind of support do you have around you?", "Counselor: I notice you've been using substances more frequently lately. Can you tell me what's been going on around that time?", "Counselor: It sounds like the financial pressure has become really overwhelming. What does your current situation look like?", "Client: I have been struggling with anxiety and don't know what to do.", "Client: I've been drinking every night to cope with stress and I'm starting to think it's becoming a real problem.", "Client: I lost my job two months ago and can't pay my rent anymore. I don't know how to tell my family.", "Client: I feel like I have no purpose and just go through the motions every day without feeling anything.", "Berater: Haben Sie schon versucht, mit jemandem darüber zu sprechen?", "Berater: Sie erwähnen, dass Sie sich sehr allein fühlen. Was bedeutet das für Ihren Alltag?", "Berater: Wie lange besteht die finanzielle Situation schon, und haben Sie bereits versucht, Unterstützung zu bekommen?", "Berater: Es klingt, als wäre der Konsum für Sie eine Art Bewältigungsstrategie geworden. Was glauben Sie, was dahintersteckt?", "Klient: Ich streite mich ständig mit meinem Partner.", "Klient: Ich habe seit Monaten keine Arbeit mehr und weiß nicht, wie ich meine Miete zahlen soll.", "Klient: Ich trinke jeden Abend, um abschalten zu können, aber ich merke, dass es immer mehr wird.", "Klient: Ich fühle mich meiner Familie gegenüber wie eine Last und weiß nicht mehr, wie es weitergehen soll.", ] def load_example(choice): if choice == "Custom": return "" return choice def predict(text, top_k=3): if not text or not text.strip(): return {} inputs = tokenizer(text, return_tensors="pt", truncation=True, max_length=512) with torch.no_grad(): probs = F.softmax(model(**inputs).logits, dim=-1).squeeze() top_indices = probs.argsort(descending=True)[:top_k] result = {} for i in top_indices: code = id2label[i.item()] description = code2cat.get(code, code) display_key = f"{code} | {description}" result[display_key] = probs[i].item()# round(probs[i].item(), 4) return result example_choices = examples + ["Custom"] with gr.Blocks(title="OnCoCo Message Classifier", css="#prediction .output-class { display: none; }") as demo: gr.Markdown( "# OnCoCo Message Classifier\n" "This demo classifies individual messages from psychosocial online counseling conversations " "into fine-grained categories covering counselor and client communication acts, " "such as empathic reflection, problem exploration, emotional support, or requests for information.\n\n" "It is based on the [OnCoCo dataset](https://huggingface.co/datasets/th-nuernberg/OnCoCoV1), " "a bilingual (German/English) corpus of annotated online counseling messages spanning topics like " "mental health, relationships, substance use, and financial problems. " "Messages are classified into 40 counselor and 28 client categories.\n\n" "The underlying model here is [th-nuernberg/xlm-roberta-base-online-counseling-oncoco](https://huggingface.co/th-nuernberg/xlm-roberta-base-online-counseling-oncoco), " "a fine-tuned XLM-RoBERTa model trained on the OnCoCo dataset." ) example_dropdown = gr.Dropdown( choices=example_choices, value=example_choices[0], label="Choose an example or select Custom to enter your own.", ) with gr.Row(): text_input = gr.Textbox( value=examples[0], label="Write your own message. Prefix messages with `Counselor:`, `Client:`, `Berater:`, or `Klient:`.", lines=3, scale=10, ) top_k_dropdown = gr.Dropdown( choices=[1, 2, 3], value=3, label="Top-K", scale=1, min_width=80, ) with gr.Row(): classify_btn = gr.Button("Classify", variant="primary", scale=0, min_width=150) gr.HTML("") label_output = gr.Label(num_top_classes=5, label="Prediction", show_label=False, elem_id="prediction") example_dropdown.change(fn=load_example, inputs=example_dropdown, outputs=text_input) classify_btn.click(fn=predict, inputs=[text_input, top_k_dropdown], outputs=label_output) text_input.submit(fn=predict, inputs=[text_input, top_k_dropdown], outputs=label_output) demo.launch()