Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| from transformers import pipeline | |
| import time | |
| import pandas as pd | |
| from datetime import datetime | |
| # Загружаем модель для классификации тем | |
| model_name = "cointegrated/rubert-tiny2-cedr-emotion-detection" | |
| classifier = pipeline("text-classification", model=model_name) | |
| # Словарь для перевода меток на русский | |
| TOPIC_LABELS_RU = { | |
| 'neutral': '🗿 Нейтральная', | |
| 'sadness': '😔 Грусть/печаль', | |
| 'fear': '😨 Страх/опасение', | |
| 'anger': '😡 Злость/гнев', | |
| 'joy': '😊 Радость', | |
| 'love': '❤️ Любовь/симпатия', | |
| 'surprise': '😯 Удивление' | |
| } | |
| # История запросов | |
| history = [] | |
| MAX_HISTORY = 10 | |
| def classify_topic(text, show_top_n=3): | |
| """Классифицирует текст по темам""" | |
| # Проверка ошибок | |
| if not text or text.strip() == "": | |
| return "⚠️ Пожалуйста, введите текст для анализа", "", [] | |
| if len(text) > 2000: | |
| return "⚠️ Текст слишком длинный (максимум 2000 символов)", "", [] | |
| try: | |
| # Измеряем время выполнения | |
| start_time = time.time() | |
| # Классификация | |
| results = classifier(text, top_k=show_top_n) | |
| elapsed_time = time.time() - start_time | |
| # Форматируем результаты | |
| output_text = f"📊 **Результаты классификации:**\n\n" | |
| for i, result in enumerate(results, 1): | |
| label_en = result['label'] | |
| label_ru = TOPIC_LABELS_RU.get(label_en, label_en) | |
| score = result['score'] * 100 | |
| # Прогресс-бар | |
| bar_length = 20 | |
| filled = int(score * bar_length / 100) | |
| progress_bar = "█" * filled + "░" * (bar_length - filled) | |
| output_text += f"{i}. **{label_ru}** - {score:.1f}%\n" | |
| output_text += f" {progress_bar}\n\n" | |
| output_text += f"\n⏱️ **Время обработки:** {elapsed_time:.2f} секунд" | |
| # Сохраняем в историю | |
| timestamp = datetime.now().strftime("%H:%M:%S") | |
| top_result = results[0]['label'] | |
| history.insert(0, { | |
| 'time': timestamp, | |
| 'text': text[:50] + ("..." if len(text) > 50 else ""), | |
| 'topic': TOPIC_LABELS_RU.get(top_result, top_result), | |
| 'confidence': f"{results[0]['score']*100:.1f}%" | |
| }) | |
| # Ограничиваем историю | |
| if len(history) > MAX_HISTORY: | |
| history.pop() | |
| # Создаём DataFrame для таблицы | |
| df = pd.DataFrame(history) | |
| return output_text, f"✅ Текст успешно обработан за {elapsed_time:.2f} сек", df | |
| except Exception as e: | |
| return f"❌ **Ошибка:** {str(e)}", "", [] | |
| def clear_history(): | |
| """Очищает историю запросов""" | |
| global history | |
| history = [] | |
| return pd.DataFrame() | |
| # Создаём интерфейс | |
| with gr.Blocks(title="Классификатор тем текста", theme=gr.themes.Soft()) as demo: | |
| gr.Markdown("# 🏷️ Классификатор тем текста") | |
| gr.Markdown("Определяет эмоциональную окраску и тему текста") | |
| with gr.Row(): | |
| with gr.Column(scale=2): | |
| # Входные элементы | |
| text_input = gr.Textbox( | |
| label="📝 Введите текст для анализа", | |
| placeholder="Например: 'Я очень рад, что получил отличную оценку на экзамене!'", | |
| lines=5, | |
| max_lines=10 | |
| ) | |
| with gr.Row(): | |
| top_n_slider = gr.Slider( | |
| minimum=1, | |
| maximum=7, | |
| value=3, | |
| step=1, | |
| label="🔢 Количество топ-тем для показа" | |
| ) | |
| analyze_btn = gr.Button("🚀 Анализировать текст", variant="primary", size="lg") | |
| clear_btn = gr.Button("🧹 Очистить историю", variant="secondary") | |
| # Примеры | |
| gr.Markdown("### 📌 Готовые примеры") | |
| examples = gr.Examples( | |
| examples=[ | |
| ["Я в восторге от этого фильма, актёры сыграли просто потрясающе!"], | |
| ["Очень боюсь завтрашнего экзамена, не уверен, что готов к нему."], | |
| ["Меня бесит, что автобус снова опоздал на 30 минут."], | |
| ["Сегодня обычный день, ничего особенного не произошло."], | |
| ["Я обожаю свою девушку, она самая лучшая на свете!"], | |
| ["Неожиданно получил повышение на работе, не могу поверить!"], | |
| ["Мне так грустно, что каникулы уже закончились."] | |
| ], | |
| inputs=text_input, | |
| label="Кликните на любой пример" | |
| ) | |
| with gr.Column(scale=3): | |
| # Результаты | |
| output_md = gr.Markdown(label="📊 Результаты классификации") | |
| status_text = gr.Textbox(label="✅ Статус", interactive=False) | |
| gr.Markdown("### 📋 История запросов") | |
| history_table = gr.Dataframe( | |
| headers=["Время", "Текст", "Тема", "Уверенность"], | |
| datatype=["str", "str", "str", "str"], | |
| interactive=False, | |
| # Убрал height=300, так как этот параметр не поддерживается в текущей версии | |
| ) | |
| # Обработчики событий | |
| analyze_btn.click( | |
| fn=classify_topic, | |
| inputs=[text_input, top_n_slider], | |
| outputs=[output_md, status_text, history_table] | |
| ) | |
| clear_btn.click( | |
| fn=clear_history, | |
| inputs=[], | |
| outputs=[history_table] | |
| ) | |
| # Информационный блок | |
| gr.Markdown("---") | |
| with gr.Accordion("📚 Подробная информация о модели", open=False): | |
| gr.Markdown(""" | |
| **Используемая модель:** `cointegrated/rubert-tiny2-cedr-emotion-detection` | |
| **Возможные темы/эмоции:** | |
| - 😊 **joy** - Радость, счастье, удовольствие | |
| - ❤️ **love** - Любовь, симпатия, нежность | |
| - 😡 **anger** - Злость, гнев, раздражение | |
| - 😨 **fear** - Страх, опасение, тревога | |
| - 😔 **sadness** - Грусть, печаль, тоска | |
| - 😯 **surprise** - Удивление, изумление | |
| - 🗿 **neutral** - Нейтральный текст без эмоций | |
| **Технические детали:** | |
| - Модель на основе RuBERT Tiny | |
| - Обучена на русскоязычных текстах | |
| - Работает на CPU за 1-3 секунды | |
| - Поддерживает тексты до 2000 символов | |
| """) | |
| gr.Markdown("---") | |
| gr.Markdown(""" | |
| ### ⚠️ Ограничения и примечания | |
| 1. Максимальная длина текста: **2000 символов** | |
| 2. Язык: **русский** (для английского точность ниже) | |
| 3. Модель определяет **эмоциональную окраску**, а не предметную тему | |
| 4. Не распознаёт иронию, сарказм и сложные метафоры | |
| """) | |
| if __name__ == "__main__": | |
| demo.launch(debug=False) |