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)