ErzhanAb commited on
Commit
0f016d8
·
verified ·
1 Parent(s): 0249c73

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +53 -43
app.py CHANGED
@@ -5,13 +5,12 @@ import gradio as gr
5
  import numpy as np
6
 
7
  # ==============================
8
- # 1) КОНФИГ
9
  # ==============================
10
- MODEL_DIR = "rubert_tiny2_toxic_minprep" # <-- папка с checkpoint'ом
11
  MAX_LEN = 256
12
- DEFAULT_THRESHOLD = 0.65 # дефолт, если нет файла с рекомендацией
13
 
14
- # подхватываем рекомендованный порог, сохранённый при обучении
15
  cfg_path = os.path.join(MODEL_DIR, "inference_config.json")
16
  try:
17
  if os.path.exists(cfg_path):
@@ -21,7 +20,7 @@ except Exception:
21
  pass
22
 
23
  # ==============================
24
- # 2) ЗАГРУЗКА МОДЕЛИ
25
  # ==============================
26
  TRANSFORMER = {"model": None, "tokenizer": None, "device": "cpu", "loaded": False}
27
  try:
@@ -44,13 +43,12 @@ except Exception as e:
44
  print(f"[WARN] Не удалось загрузить модель из '{MODEL_DIR}': {e}")
45
 
46
  # ==============================
47
- # 3) ИНФЕРЕНС
48
  # ==============================
49
  def infer(comment: str, threshold: float):
50
  """
51
- Возвращает (вердикт, распределение вероятностей).
52
- Текст подаём в токенизатор как есть (без стемминга/очистки),
53
- потому что так модель обучалась (minprep).
54
  """
55
  text = (comment or "").strip()
56
  if not text:
@@ -70,65 +68,77 @@ def infer(comment: str, threshold: float):
70
  dist = {"Токсичный": p_toxic, "Не токсичный": 1.0 - p_toxic}
71
  return verdict, dist
72
 
 
 
 
 
 
 
 
 
 
 
 
73
 
74
  def clear_all():
75
- """Сброс полей UI к дефолту."""
76
- return "", DEFAULT_THRESHOLD, "—", {"Токсичный": 0.0, "Не токсичный": 1.0}
77
 
78
  # ==============================
79
- # 4) UI
80
  # ==============================
81
- TITLE = "Анализатор токсичности (ruBERT-tiny2, minprep)"
82
- DESCRIPTION = "Введите комментарий и при необходимости настройте порог классификации."
83
 
 
84
  CUSTOM_CSS = """
85
  @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap');
86
  :root { --font: 'Inter', system-ui, -apple-system, Segoe UI, Roboto, sans-serif; }
87
- .gradio-container { max-width: 960px !important; margin: auto !important; }
88
- #verdict-output span { font-size: 1.8rem !important; font-weight: 700 !important; }
89
  """
90
 
91
- with gr.Blocks(theme=gr.themes.Soft(primary_hue="blue", secondary_hue="sky"), css=CUSTOM_CSS) as demo:
92
- gr.Markdown(f"# {TITLE}")
93
- gr.Markdown(DESCRIPTION)
94
 
95
- with gr.Row(variant="panel"):
96
- with gr.Column(scale=2):
97
  comment_input = gr.Textbox(
98
- label="Текст комментария",
99
- lines=6,
100
- placeholder="Напишите что-нибудь…"
101
  )
102
  thr = gr.Slider(
103
  label="Порог классификации",
 
104
  minimum=0.0, maximum=1.0,
105
  value=DEFAULT_THRESHOLD, step=0.01
106
  )
107
  with gr.Row():
108
- analyze_btn = gr.Button("Анализ", variant="primary", scale=2)
109
- clear_btn = gr.Button("Очистить", variant="secondary", scale=1)
110
 
111
- with gr.Column(scale=1):
112
- verdict_output = gr.Text(label="Вердикт", elem_id="verdict-output", value="—")
113
  result_label = gr.Label(
114
- label="Распределение вероятностей",
115
  value={"Токсичный": 0.0, "Не токсичный": 1.0},
116
  num_top_classes=2
117
  )
118
-
119
- with gr.Accordion("О модели", open=False):
120
- gr.Markdown(
121
- """
122
- **База:** `cointegrated/rubert-tiny2` (облегчённый BERT для русского), дообучен на задаче токсичности.
123
- **Предобработка:** минимальная (сырой текст; без стемминга и удаления пунктуации).
124
- **Макс. длина:** 256 токенов.
125
- **Рекомендованный порог:** ~**0.65** (по валидации для лучшего F1). Для более строгой фильтрации используйте 0.70+.
126
- """
127
- )
128
-
129
- analyze_btn.click(infer, [comment_input, thr], [verdict_output, result_label])
130
- comment_input.submit(infer, [comment_input, thr], [verdict_output, result_label])
131
- clear_btn.click(clear_all, [], [comment_input, thr, verdict_output, result_label])
 
 
132
 
133
  if __name__ == "__main__":
134
  demo.launch()
 
5
  import numpy as np
6
 
7
  # ==============================
8
+ # 1) КОНФИГ (без изменений)
9
  # ==============================
10
+ MODEL_DIR = "rubert_tiny2_toxic_minprep"
11
  MAX_LEN = 256
12
+ DEFAULT_THRESHOLD = 0.65
13
 
 
14
  cfg_path = os.path.join(MODEL_DIR, "inference_config.json")
15
  try:
16
  if os.path.exists(cfg_path):
 
20
  pass
21
 
22
  # ==============================
23
+ # 2) ЗАГРУЗКА МОДЕЛИ (без изменений)
24
  # ==============================
25
  TRANSFORMER = {"model": None, "tokenizer": None, "device": "cpu", "loaded": False}
26
  try:
 
43
  print(f"[WARN] Не удалось загрузить модель из '{MODEL_DIR}': {e}")
44
 
45
  # ==============================
46
+ # 3) ИНФЕРЕНС (без изменений)
47
  # ==============================
48
  def infer(comment: str, threshold: float):
49
  """
50
+ Основная логика, возвращает (вердикт, распределение).
51
+ Функционал не меняется.
 
52
  """
53
  text = (comment or "").strip()
54
  if not text:
 
68
  dist = {"Токсичный": p_toxic, "Не токсичный": 1.0 - p_toxic}
69
  return verdict, dist
70
 
71
+ # ==============================
72
+ # 4) ФУНКЦИИ-ОБЁРТКИ ДЛЯ UI (ИЗМЕНЕНО)
73
+ # ==============================
74
+
75
+ def predict_for_ui(comment: str, threshold: float):
76
+ """
77
+ Вызывает infer, но возвращает только распределение,
78
+ так как блок "Вердикт" убран.
79
+ """
80
+ verdict, dist = infer(comment, threshold)
81
+ return dist
82
 
83
  def clear_all():
84
+ """Сброс полей UI к дефолту (без поля 'вердикт')."""
85
+ return "", DEFAULT_THRESHOLD, {"Токсичный": 0.0, "Не токсичный": 1.0}
86
 
87
  # ==============================
88
+ # 5) UI (ПОЛНОСТЬЮ ПЕРЕРАБОТАНО)
89
  # ==============================
90
+ TITLE = "Анализатор токсичности комментариев"
91
+ DESCRIPTION = "Модель на базе `ruBERT-tiny2` для определения токсичности в русскоязычном тексте."
92
 
93
+ # Убрали лишний CSS, так как тема Default справляется сама
94
  CUSTOM_CSS = """
95
  @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap');
96
  :root { --font: 'Inter', system-ui, -apple-system, Segoe UI, Roboto, sans-serif; }
 
 
97
  """
98
 
99
+ # Используем gr.themes.Default для идеальной адаптации к светлой/тёмной теме
100
+ with gr.Blocks(theme=gr.themes.Default(), css=CUSTOM_CSS) as demo:
101
+ gr.Markdown(f"<div style='text-align: center;'><h1>{TITLE}</h1><p>{DESCRIPTION}</p></div>")
102
 
103
+ with gr.Row():
104
+ with gr.Column(scale=3):
105
  comment_input = gr.Textbox(
106
+ label="Текст для анализа",
107
+ lines=8,
108
+ placeholder="Напишите что-нибудь..."
109
  )
110
  thr = gr.Slider(
111
  label="Порог классификации",
112
+ info="Визуально не меняет результат, но влияет на вердикт 'Токсичный'/'Не токсичный' в вашей интерпретации.",
113
  minimum=0.0, maximum=1.0,
114
  value=DEFAULT_THRESHOLD, step=0.01
115
  )
116
  with gr.Row():
117
+ clear_btn = gr.Button("Очистить", variant="secondary")
118
+ analyze_btn = gr.Button("Анализировать", variant="primary")
119
 
120
+ with gr.Column(scale=2):
 
121
  result_label = gr.Label(
122
+ label="Результат",
123
  value={"Токсичный": 0.0, "Не токсичный": 1.0},
124
  num_top_classes=2
125
  )
126
+ # Блок "О модели" теперь всегда видим и оформлен в gr.Box
127
+ with gr.Box():
128
+ gr.Markdown(
129
+ """
130
+ ### О модели
131
+ - **База:** `cointegrated/rubert-tiny2` (облегчённый BERT для русского), дообучен на задаче классификации токсичности.
132
+ - **Предобработка:** Минимальная (модель принимает сырой текст).
133
+ - **Макс. длина:** 256 токенов.
134
+ - **Рекомендованный порог:** `~0.65`. Повышение порога (до 0.70+) делает модель более строгой, снижая количество ложных срабатываний.
135
+ """
136
+ )
137
+
138
+ # Привязываем UI к функциям-обёрткам
139
+ analyze_btn.click(predict_for_ui, [comment_input, thr], [result_label])
140
+ comment_input.submit(predict_for_ui, [comment_input, thr], [result_label])
141
+ clear_btn.click(clear_all, [], [comment_input, thr, result_label])
142
 
143
  if __name__ == "__main__":
144
  demo.launch()