| import gradio as gr |
| import torch |
| from transformers import AutoTokenizer, AutoModelForSequenceClassification |
| import time |
|
|
| |
| MODEL_NAME = "vijjj1/toxic-comment-phobert" |
| tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) |
| model = AutoModelForSequenceClassification.from_pretrained(MODEL_NAME) |
|
|
| |
| def predict_with_progress(text, progress=gr.Progress(track_tqdm=True)): |
| if not text.strip(): |
| return "❌ Vui lòng nhập bình luận", 0.0 |
|
|
| progress(0.1, desc="Đang xử lý văn bản...") |
| time.sleep(0.3) |
|
|
| inputs = tokenizer(text, return_tensors="pt", truncation=True, padding=True, max_length=128) |
|
|
| progress(0.4, desc="Đang chạy mô hình...") |
| with torch.no_grad(): |
| outputs = model(**inputs) |
| probs = torch.softmax(outputs.logits, dim=1).tolist()[0] |
|
|
| label = "🧨 Toxic" if probs[1] > probs[0] else "✅ Non-toxic" |
| confidence = max(probs) |
|
|
| progress(0.9, desc="Hoàn tất!") |
| time.sleep(0.2) |
|
|
| return f"**Kết quả:** {label}", confidence |
|
|
|
|
| |
| with gr.Blocks(title="🛡️ Toxic Comment Detector") as demo: |
| gr.Markdown("## 🧠 Phân loại bình luận độc hại (Toxic Comment Detector)") |
| gr.Markdown( |
| "Nhập một đoạn bình luận bằng tiếng Việt để kiểm tra mức độ độc hại.\n\n" |
| "Mô hình: **vijjj1/toxic-comment-phobert**" |
| ) |
|
|
| txt_input = gr.Textbox( |
| label="Nhập bình luận cần kiểm tra", |
| placeholder="Ví dụ: 'Mày ngu như bò vậy!'", |
| lines=3 |
| ) |
|
|
| btn = gr.Button("🚀 Phân tích bình luận", variant="primary") |
|
|
| output_label = gr.Markdown(label="Kết quả") |
| conf_bar = gr.Slider( |
| minimum=0, maximum=1, value=0, step=0.01, label="Độ tin cậy (Confidence)", interactive=False |
| ) |
|
|
| btn.click( |
| fn=predict_with_progress, |
| inputs=txt_input, |
| outputs=[output_label, conf_bar] |
| ) |
|
|
| if __name__ == "__main__": |
| demo.launch(server_name="0.0.0.0", server_port=7860) |
|
|