marry1908 commited on
Commit
14f53bd
·
verified ·
1 Parent(s): d3ff9df

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +191 -0
app.py ADDED
@@ -0,0 +1,191 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ from transformers import pipeline
3
+ import time
4
+ import pandas as pd
5
+ from datetime import datetime
6
+
7
+ # Загружаем модель для классификации тем
8
+ model_name = "cointegrated/rubert-tiny2-cedr-emotion-detection"
9
+ classifier = pipeline("text-classification", model=model_name)
10
+
11
+ # Словарь для перевода меток на русский
12
+ TOPIC_LABELS_RU = {
13
+ 'neutral': '🗿 Нейтральная',
14
+ 'sadness': '😔 Грусть/печаль',
15
+ 'fear': '😨 Страх/опасение',
16
+ 'anger': '😡 Злость/гнев',
17
+ 'joy': '😊 Радость',
18
+ 'love': '❤️ Любовь/симпатия',
19
+ 'surprise': '😯 Удивление'
20
+ }
21
+
22
+ # История запросов
23
+ history = []
24
+ MAX_HISTORY = 10
25
+
26
+ def classify_topic(text, show_top_n=3):
27
+ """Классифицирует текст по темам"""
28
+
29
+ # Проверка ошибок
30
+ if not text or text.strip() == "":
31
+ return "⚠️ Пожалуйста, введите текст для анализа", "", []
32
+
33
+ if len(text) > 2000:
34
+ return "⚠️ Текст слишком длинный (максимум 2000 символов)", "", []
35
+
36
+ try:
37
+ # Измеряем время выполнения
38
+ start_time = time.time()
39
+
40
+ # Классификация
41
+ results = classifier(text, top_k=show_top_n)
42
+ elapsed_time = time.time() - start_time
43
+
44
+ # Форматируем результаты
45
+ output_text = f"📊 **Результаты классификации:**\n\n"
46
+
47
+ for i, result in enumerate(results, 1):
48
+ label_en = result['label']
49
+ label_ru = TOPIC_LABELS_RU.get(label_en, label_en)
50
+ score = result['score'] * 100
51
+
52
+ # Прогресс-бар
53
+ bar_length = 20
54
+ filled = int(score * bar_length / 100)
55
+ progress_bar = "█" * filled + "░" * (bar_length - filled)
56
+
57
+ output_text += f"{i}. **{label_ru}** - {score:.1f}%\n"
58
+ output_text += f" {progress_bar}\n\n"
59
+
60
+ output_text += f"\n⏱️ **Время обработки:** {elapsed_time:.2f} секунд"
61
+
62
+ # Сохраняем в историю
63
+ timestamp = datetime.now().strftime("%H:%M:%S")
64
+ top_result = results[0]['label']
65
+ history.insert(0, {
66
+ 'time': timestamp,
67
+ 'text': text[:50] + ("..." if len(text) > 50 else ""),
68
+ 'topic': TOPIC_LABELS_RU.get(top_result, top_result),
69
+ 'confidence': f"{results[0]['score']*100:.1f}%"
70
+ })
71
+
72
+ # Ограничиваем историю
73
+ if len(history) > MAX_HISTORY:
74
+ history.pop()
75
+
76
+ # Создаём DataFrame для таблицы
77
+ df = pd.DataFrame(history)
78
+
79
+ return output_text, f"✅ Текст успешно обработан за {elapsed_time:.2f} сек", df
80
+
81
+ except Exception as e:
82
+ return f"❌ **Ошибка:** {str(e)}", "", []
83
+
84
+ def clear_history():
85
+ """Очищает историю запросов"""
86
+ global history
87
+ history = []
88
+ return pd.DataFrame()
89
+
90
+ # Создаём интерфейс
91
+ with gr.Blocks(title="Классификатор тем текста", theme=gr.themes.Soft()) as demo:
92
+ gr.Markdown("# 🏷️ Классификатор тем текста")
93
+ gr.Markdown("Определяет эмоциональную окраску и тему текста")
94
+
95
+ with gr.Row():
96
+ with gr.Column(scale=2):
97
+ # Входные элементы
98
+ text_input = gr.Textbox(
99
+ label="📝 Введите текст для анализа",
100
+ placeholder="Например: 'Я очень рад, что получил отличную оценку на экзамене!'",
101
+ lines=5,
102
+ max_lines=10
103
+ )
104
+
105
+ with gr.Row():
106
+ top_n_slider = gr.Slider(
107
+ minimum=1,
108
+ maximum=7,
109
+ value=3,
110
+ step=1,
111
+ label="🔢 Количество топ-тем для показа"
112
+ )
113
+
114
+ analyze_btn = gr.Button("🚀 Анализировать текст", variant="primary", size="lg")
115
+ clear_btn = gr.Button("🧹 Очистить историю", variant="secondary")
116
+
117
+ # Примеры
118
+ gr.Markdown("### 📌 Готовые примеры")
119
+ examples = gr.Examples(
120
+ examples=[
121
+ ["Я в восторге от этого фильма, актёры сыграли просто потрясающе!"],
122
+ ["Очень боюсь завтрашнего экзамена, не уверен, ч��о готов к нему."],
123
+ ["Меня бесит, что автобус снова опоздал на 30 минут."],
124
+ ["Сегодня обычный день, ничего особенного не произошло."],
125
+ ["Я обожаю свою девушку, она самая лучшая на свете!"],
126
+ ["Неожиданно получил повышение на работе, не могу поверить!"],
127
+ ["Мне так грустно, что каникулы уже закончились."]
128
+ ],
129
+ inputs=text_input,
130
+ label="Кликните на любой пример"
131
+ )
132
+
133
+ with gr.Column(scale=3):
134
+ # Результаты
135
+ output_md = gr.Markdown(label="📊 Результаты классификации")
136
+ status_text = gr.Textbox(label="✅ Статус", interactive=False)
137
+
138
+ gr.Markdown("### 📋 История запросов")
139
+ history_table = gr.Dataframe(
140
+ headers=["Время", "Текст", "Тема", "Уверенность"],
141
+ datatype=["str", "str", "str", "str"],
142
+ interactive=False,
143
+ height=300
144
+ )
145
+
146
+ # Обработчики событий
147
+ analyze_btn.click(
148
+ fn=classify_topic,
149
+ inputs=[text_input, top_n_slider],
150
+ outputs=[output_md, status_text, history_table]
151
+ )
152
+
153
+ clear_btn.click(
154
+ fn=clear_history,
155
+ inputs=[],
156
+ outputs=[history_table]
157
+ )
158
+
159
+ # Информационный блок
160
+ gr.Markdown("---")
161
+ with gr.Accordion("📚 Подробная информация о модели", open=False):
162
+ gr.Markdown("""
163
+ **Используемая модель:** `cointegrated/rubert-tiny2-cedr-emotion-detection`
164
+
165
+ **Возможные темы/эмоции:**
166
+ - 😊 **joy** - Радость, счастье, удовольствие
167
+ - ❤️ **love** - Любовь, симпатия, нежность
168
+ - 😡 **anger** - Злость, гнев, раздражение
169
+ - 😨 **fear** - Страх, опасение, тревога
170
+ - 😔 **sadness** - Грусть, печаль, тоска
171
+ - 😯 **surprise** - Удивление, изумление
172
+ - 🗿 **neutral** - Нейтральный текст без эмоций
173
+
174
+ **Технические детали:**
175
+ - Модель на основе RuBERT Tiny
176
+ - Обучена на русскоязычных текстах
177
+ - Работает на CPU за 1-3 секунды
178
+ - Поддерживает тексты до 2000 символов
179
+ """)
180
+
181
+ gr.Markdown("---")
182
+ gr.Markdown("""
183
+ ### ⚠️ Ограничения и примечания
184
+ 1. Максимальная длина текста: **2000 символов**
185
+ 2. Язык: **русский** (для английского точность ниже)
186
+ 3. Модель определяет **эмоциональную окраску**, а не предметную тему
187
+ 4. Не распознаёт иронию, сарказм и сложные метафоры
188
+ """)
189
+
190
+ if __name__ == "__main__":
191
+ demo.launch(debug=False)