Batuka0901 commited on
Commit
f9aebc6
·
verified ·
1 Parent(s): e10eda8

Upload 2 files

Browse files
Files changed (2) hide show
  1. app.py +98 -0
  2. requirements.txt +3 -0
app.py ADDED
@@ -0,0 +1,98 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import torch
3
+ from transformers import AutoModelForSequenceClassification, AutoTokenizer
4
+
5
+ # Хуулсан загварынхаа нэрийг зааж өгнө (Hugging Face-ээс шууд татна)
6
+ MODEL_ID = "Batuka0901/mongolian_news_classifier"
7
+ MAX_LENGTH = 128
8
+
9
+ CATEGORY_DESC = {
10
+ "байгал орчин": "Байгаль орчин, экологи, цаг уур, ногоон хөгжил",
11
+ "боловсрол": "Сургуули, их дээд сургууль, багш, сурагч, хичээл",
12
+ "спорт": "Тэмцээн, уралдаан, шигшээ баг, медаль, аварга",
13
+ "технологи": "Шинэ технологи, программ хангамж, интернет, инновац",
14
+ "улс төр": "Засгийн газар, сонгууль, хууль тогтоомж, бодлого",
15
+ "урлаг соёл": "Урлаг, дуу хөгжим, кино, уран зохиол, соёлын арга хэмжээ",
16
+ "хууль": "Шүүх, хэрэг, дүрэм журам, хуулийн байгууллага",
17
+ "эдийн засаг": "Санхүү, худалдаа, үйлдвэрлэл, инфляц, ДНБ",
18
+ "эрүүл мэнд": "Эмнэлэг, эм, өвчин, эмч, эрүүл мэндийн бодлого",
19
+ }
20
+
21
+ # 1. Загвараа Cloud руу (Hugging Face) шууд татаж ажиллана
22
+ device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
23
+ tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)
24
+ model = AutoModelForSequenceClassification.from_pretrained(MODEL_ID).to(device).eval()
25
+
26
+ # ID болон Label хөрвүүлэлтийг Model-ийн config-оос татаж авна
27
+ id2label = {int(k): v for k, v in model.config.id2label.items()}
28
+
29
+ def classify(text: str):
30
+ text = text.strip()
31
+ if not text:
32
+ return "", {}, ""
33
+
34
+ inputs = tokenizer(
35
+ text,
36
+ return_tensors="pt",
37
+ truncation=True,
38
+ max_length=MAX_LENGTH,
39
+ padding=True,
40
+ )
41
+ inputs = {k: v.to(device) for k, v in inputs.items()}
42
+
43
+ with torch.no_grad():
44
+ probs = torch.nn.functional.softmax(model(**inputs).logits, dim=-1)[0]
45
+
46
+ pred_id = probs.argmax().item()
47
+ pred_label = id2label[pred_id]
48
+ confidence = probs[pred_id].item()
49
+
50
+ scores = {id2label[i]: float(probs[i]) for i in range(len(id2label))}
51
+ desc = CATEGORY_DESC.get(pred_label, "")
52
+ detail = f"Ангилал: {pred_label} | Итгэлцэл: {confidence:.1%}\n{desc}"
53
+
54
+ return pred_label, scores, detail
55
+
56
+ EXAMPLES = [
57
+ ["Өнөөдөр хөлбөмбөгийн тэмцээнд Монголын шигшээ баг хожлоо."],
58
+ ["Эдийн засгийн сайд өнөөдөр мэдээлэл хийлээ."],
59
+ ["Шинэ технологийн компани байгуулагдлаа."],
60
+ ["Эмнэлэгт шинэ тоног төхөөрөмж суурилуулжээ."],
61
+ ["Багш нарын цалин нэмэгдэнэ."],
62
+ ["Нийслэлийн агаарын бохирдол буурлаа."],
63
+ ]
64
+
65
+ CSS = """
66
+ #title { text-align: center; margin-bottom: 4px; }
67
+ #result_label { font-size: 1.3em; font-weight: bold; }
68
+ footer { display: none !important; }
69
+ """
70
+
71
+ with gr.Blocks(css=CSS, title="Монгол мэдээний ангилагч") as demo:
72
+
73
+ gr.Markdown("## Монгол мэдээний гарчиг ангилагч", elem_id="title")
74
+
75
+ with gr.Row():
76
+ with gr.Column(scale=3):
77
+ txt_input = gr.Textbox(
78
+ label="Мэдээний гарчиг",
79
+ placeholder="Мэдээний гарчгийг энд бичнэ үү...",
80
+ lines=3,
81
+ )
82
+ with gr.Row():
83
+ btn_clear = gr.Button("Арилгах")
84
+ btn_submit = gr.Button("Ангилах", variant="primary")
85
+
86
+ gr.Examples(examples=EXAMPLES, inputs=txt_input)
87
+
88
+ with gr.Column(scale=2):
89
+ out_label = gr.Textbox(label="Ангилал", elem_id="result_label")
90
+ out_scores = gr.Label(label="Ангилал бүрийн магадлал", num_top_classes=9)
91
+ out_detail = gr.Textbox(label="Дэлгэрэнгүй", lines=2)
92
+
93
+ btn_submit.click(fn=classify, inputs=txt_input, outputs=[out_label, out_scores, out_detail])
94
+ btn_clear.click(fn=lambda: ("", {}, ""), outputs=[out_label, out_scores, out_detail])
95
+ txt_input.submit(fn=classify, inputs=txt_input, outputs=[out_label, out_scores, out_detail])
96
+
97
+ if __name__ == "__main__":
98
+ demo.launch()
requirements.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ transformers
2
+ torch
3
+ gradio