ErzhanAb commited on
Commit
084b355
·
verified ·
1 Parent(s): a61060c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +59 -27
app.py CHANGED
@@ -33,10 +33,7 @@ try:
33
  model.to(device).eval()
34
 
35
  TRANSFORMER.update({
36
- "model": model,
37
- "tokenizer": tokenizer,
38
- "device": device,
39
- "loaded": True
40
  })
41
  print(f"[INFO] Модель загружена из: {MODEL_DIR} | device={device}")
42
  except Exception as e:
@@ -65,17 +62,32 @@ def infer(comment: str, threshold: float):
65
  return verdict, dist
66
 
67
  # ==============================
68
- # 4) ФУНКЦИИ-ОБЁРТКИ ДЛЯ UI (без изменений)
69
  # ==============================
70
  def predict_for_ui(comment: str, threshold: float):
 
 
 
71
  verdict, dist = infer(comment, threshold)
72
- return dist
 
 
 
 
 
 
 
 
 
 
73
 
74
  def clear_all():
75
- return "", DEFAULT_THRESHOLD, {"Токсичный": 0.0, "Не токсичный": 1.0}
 
 
76
 
77
  # ==============================
78
- # 5) UI (ИСПРАВЛЕНО)
79
  # ==============================
80
  TITLE = "Анализатор токсичности комментариев"
81
  DESCRIPTION = "Модель на базе `ruBERT-tiny2` для определения токсичности в русскоязычном тексте."
@@ -83,35 +95,48 @@ DESCRIPTION = "Модель на базе `ruBERT-tiny2` для определе
83
  CUSTOM_CSS = """
84
  @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap');
85
  :root { --font: 'Inter', system-ui, -apple-system, Segoe UI, Roboto, sans-serif; }
 
 
 
 
 
86
  """
87
 
88
  with gr.Blocks(theme=gr.themes.Default(), css=CUSTOM_CSS) as demo:
89
  gr.Markdown(f"<div style='text-align: center;'><h1>{TITLE}</h1><p>{DESCRIPTION}</p></div>")
90
 
91
  with gr.Row():
92
- with gr.Column(scale=3):
93
- comment_input = gr.Textbox(
94
- label="Текст для анализа",
95
- lines=8,
96
- placeholder="Напишите что-нибудь..."
97
- )
98
- thr = gr.Slider(
99
- label="Порог классификации",
100
- info="Визуально не меняет результат, но влияет на вердикт 'Токсичный'/'Не токсичный' в вашей интерпретации.",
101
- minimum=0.0, maximum=1.0,
102
- value=DEFAULT_THRESHOLD, step=0.01
103
- )
 
 
104
  with gr.Row():
105
  clear_btn = gr.Button("Очистить", variant="secondary")
106
  analyze_btn = gr.Button("Анализировать", variant="primary")
107
-
108
- with gr.Column(scale=2):
 
 
 
 
 
109
  result_label = gr.Label(
110
- label="Результат",
111
  value={"Токсичный": 0.0, "Не токсичный": 1.0},
112
  num_top_classes=2
113
  )
114
- # ИЗМЕНЕНИЕ: gr.Box() заменен на gr.Column(variant="panel") для совместимости
 
115
  with gr.Column(variant="panel"):
116
  gr.Markdown(
117
  """
@@ -123,9 +148,16 @@ with gr.Blocks(theme=gr.themes.Default(), css=CUSTOM_CSS) as demo:
123
  """
124
  )
125
 
126
- analyze_btn.click(predict_for_ui, [comment_input, thr], [result_label])
127
- comment_input.submit(predict_for_ui, [comment_input, thr], [result_label])
128
- clear_btn.click(clear_all, [], [comment_input, thr, result_label])
 
 
 
 
 
 
 
129
 
130
  if __name__ == "__main__":
131
  demo.launch()
 
33
  model.to(device).eval()
34
 
35
  TRANSFORMER.update({
36
+ "model": model, "tokenizer": tokenizer, "device": device, "loaded": True
 
 
 
37
  })
38
  print(f"[INFO] Модель загружена из: {MODEL_DIR} | device={device}")
39
  except Exception as e:
 
62
  return verdict, dist
63
 
64
  # ==============================
65
+ # 4) ФУНКЦИИ-ОБЁРТКИ ДЛЯ UI (ИЗМЕНЕНО)
66
  # ==============================
67
  def predict_for_ui(comment: str, threshold: float):
68
+ """
69
+ Вызывает infer и форматирует вердикт в красивый HTML-блок для вывода.
70
+ """
71
  verdict, dist = infer(comment, threshold)
72
+
73
+ # Создаем стилизованный HTML в зависимости от вердикта
74
+ if verdict == "Токсичный":
75
+ verdict_html = "<div class='verdict toxic'><h2>Токсичный</h2></div>"
76
+ elif verdict == "Не токсичный":
77
+ verdict_html = "<div class='verdict neutral'><h2>Не токсичный</h2></div>"
78
+ else:
79
+ # Для ошибок или пустого состояния
80
+ verdict_html = f"<div class='verdict default'><h2>{verdict}</h2></div>"
81
+
82
+ return verdict_html, dist
83
 
84
  def clear_all():
85
+ """Сбрасывает поля UI к дефолтным значениям."""
86
+ default_verdict = "<div class='verdict default'><h2>—</h2></div>"
87
+ return "", DEFAULT_THRESHOLD, default_verdict, {"Токсичный": 0.0, "Не токсичный": 1.0}
88
 
89
  # ==============================
90
+ # 5) UI (ПОЛНОСТЬЮ ПЕРЕРАБОТАНО)
91
  # ==============================
92
  TITLE = "Анализатор токсичности комментариев"
93
  DESCRIPTION = "Модель на базе `ruBERT-tiny2` для определения токсичности в русскоязычном тексте."
 
95
  CUSTOM_CSS = """
96
  @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap');
97
  :root { --font: 'Inter', system-ui, -apple-system, Segoe UI, Roboto, sans-serif; }
98
+ .verdict { padding: 1rem; border-radius: 0.5rem; text-align: center; }
99
+ .verdict h2 { margin: 0; }
100
+ .verdict.toxic { background-color: #ffebee; color: #c62828; }
101
+ .verdict.neutral { background-color: #e8f5e9; color: #2e7d32; }
102
+ .verdict.default { background-color: var(--neutral-100); color: var(--neutral-800); }
103
  """
104
 
105
  with gr.Blocks(theme=gr.themes.Default(), css=CUSTOM_CSS) as demo:
106
  gr.Markdown(f"<div style='text-align: center;'><h1>{TITLE}</h1><p>{DESCRIPTION}</p></div>")
107
 
108
  with gr.Row():
109
+ # Основная колонка для всего интерфейса
110
+ with gr.Column():
111
+ # Группа для ввода данных
112
+ with gr.Group():
113
+ comment_input = gr.Textbox(
114
+ label="Текст для анализа", lines=6, placeholder="Напишите что-нибудь..."
115
+ )
116
+ thr = gr.Slider(
117
+ label="Порог классификации",
118
+ info="Определяет, при какой вероятности комментарий считается токсичным.",
119
+ minimum=0.0, maximum=1.0, value=DEFAULT_THRESHOLD, step=0.01
120
+ )
121
+
122
+ # Кнопки действий
123
  with gr.Row():
124
  clear_btn = gr.Button("Очистить", variant="secondary")
125
  analyze_btn = gr.Button("Анализировать", variant="primary")
126
+
127
+ # Блок для вывода результатов
128
+ gr.Markdown("---")
129
+ verdict_output = gr.Markdown(
130
+ value="<div class='verdict default'><h2>—</h2></div>",
131
+ label="Вердикт (с учетом порога)"
132
+ )
133
  result_label = gr.Label(
134
+ label="Распределение вероятностей (raw output модели)",
135
  value={"Токсичный": 0.0, "Не токсичный": 1.0},
136
  num_top_classes=2
137
  )
138
+
139
+ # Информация о модели (видимая по умолчанию)
140
  with gr.Column(variant="panel"):
141
  gr.Markdown(
142
  """
 
148
  """
149
  )
150
 
151
+ # Привязываем UI к функциям (список вывода теперь содержит verdict_output)
152
+ outputs_list = [verdict_output, result_label]
153
+ inputs_list = [comment_input, thr]
154
+
155
+ analyze_btn.click(predict_for_ui, inputs_list, outputs_list)
156
+ comment_input.submit(predict_for_ui, inputs_list, outputs_list)
157
+
158
+ clear_outputs_list = [comment_input, thr, verdict_output, result_label]
159
+ clear_btn.click(clear_all, [], clear_outputs_list)
160
+
161
 
162
  if __name__ == "__main__":
163
  demo.launch()