marry1908's picture
Update app.py
2822f03 verified
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)