Ling / ui /topic_ui.py
Nam Fam
update files
ea99abb
import gradio as gr
from utils.ner_helpers import is_llm_model
from typing import Dict, List, Any
from tasks.topic_classification import topic_classification
def topic_ui():
"""Topic classification UI component"""
# Define models and default labels
TOPIC_MODELS = [
"gemini-2.0-flash" # Only allow gemini-2.0-flash for now
# "gpt-4",
# "claude-2",
# "facebook/bart-large-mnli",
# "joeddav/xlm-roberta-large-xnli"
]
DEFAULT_MODEL = "gemini-2.0-flash"
DEFAULT_LABELS = [
"Sports", "Economy", "Politics", "Entertainment", "Technology", "Education", "Law"
]
def classify(text, model, use_custom, labels, custom_instructions):
"""Process text for topic classification"""
if not text.strip():
return "No text provided"
use_llm = is_llm_model(model)
label_list = [l.strip() for l in labels.split('\n') if l.strip()] if use_custom else None
if use_custom and (not label_list or len(label_list) == 0):
return "Please provide at least one category"
result = topic_classification(
text=text,
model=model,
candidate_labels=label_list,
custom_instructions=custom_instructions,
use_llm=use_llm
)
return result.strip()
# UI Components
with gr.Row():
with gr.Column():
input_text = gr.Textbox(
label="Input Text",
lines=6,
placeholder="Enter text to classify...",
elem_id="topic-input-text"
)
gr.Examples(
examples=[
["Apple has announced the release of a new iPhone model this fall."],
["The United Nations held a climate summit to discuss global warming solutions."]
],
inputs=[input_text],
label="Examples"
)
use_custom_topics = gr.Checkbox(
label="Use custom topics",
value=True,
elem_id="topic-use-custom-topics"
)
topics_area = gr.TextArea(
label="Candidate Topics (one per line)",
value='\n'.join(DEFAULT_LABELS),
lines=5,
visible=True,
elem_id="topic-candidate-topics"
)
def toggle_topics_area(use_custom):
return gr.update(visible=use_custom)
use_custom_topics.change(toggle_topics_area, inputs=use_custom_topics, outputs=topics_area)
model = gr.Dropdown(
TOPIC_MODELS,
value=DEFAULT_MODEL,
label="Model",
interactive=True,
elem_id="topic-model-dropdown"
)
custom_instructions = gr.Textbox(
label="Custom Instructions (optional)",
lines=2,
placeholder="Add any custom instructions for the model...",
elem_id="topic-custom-instructions"
)
classify_btn = gr.Button("Classify Topic", variant="primary", elem_id="topic-classify-btn")
with gr.Column():
output_box = gr.Textbox(
label="Classification Result",
lines=2,
elem_id="topic-output"
)
def run_topic_classification(text, model, use_custom, topics, custom_instructions):
return classify(text, model, use_custom, topics, custom_instructions)
classify_btn.click(
run_topic_classification,
inputs=[input_text, model, use_custom_topics, topics_area, custom_instructions],
outputs=output_box
)
# 4. Click "Classify" to analyze
# ### Model Types
# - **LLM Models** (Gemini, GPT, Claude): Provide sophisticated classification with better understanding of context and nuance
# - **Traditional Models**: Specialized models trained specifically for zero-shot classification tasks
# Use the advanced options to customize how the model classifies your text.
# """)
return None