kuzbaev / app.py
m1d8nk's picture
Update app.py
2e4a48d verified
import time
import gradio as gr
from transformers import pipeline
# настройки
MAX_TEXT_LENGTH = 2000
HISTORY_SIZE = 5
# модели для анализа
MODELS = {
"Основная модель (rubert-base)": "blanchefort/rubert-base-cased-sentiment",
"Быстрая модель (rubert-tiny)": "seara/rubert-tiny2-russian-sentiment"
}
# глобальные переменные
current_model = None
model_name = None
history = []
# загрузка модели
def load_model(selected_model_name):
global current_model, model_name
if model_name != selected_model_name:
model_name = selected_model_name
model_path = MODELS[selected_model_name]
current_model = pipeline("sentiment-analysis", model=model_path)
return current_model
# основная функция анализа
def analyze_sentiment(text, selected_model):
global history
# проверка ввода
if not text or not text.strip():
return "ошибка: введите текст для анализа", "", ""
# ограничение длины
text = text.strip()
if len(text) > MAX_TEXT_LENGTH:
text = text[:MAX_TEXT_LENGTH]
warning = f"текст обрезан до {MAX_TEXT_LENGTH} символов"
else:
warning = ""
# загрузка модели
start_time = time.time()
try:
model = load_model(selected_model)
result = model(text)[0]
elapsed_time = round((time.time() - start_time) * 1000, 1)
# перевод меток на русский
label_ru = {
"positive": "позитивный",
"negative": "негативный",
"neutral": "нейтральный",
"LABEL_0": "негативный",
"LABEL_1": "нейтральный",
"LABEL_2": "позитивный"
}.get(result['label'], result['label'])
score_percent = round(result['score'] * 100, 1)
result_text = f"результат: {label_ru}\n"
result_text += f"уверенность: {score_percent}%\n"
result_text += f"время анализа: {elapsed_time} мс\n"
result_text += f"модель: {selected_model}"
# добавление в историю
history_entry = {
"text": text[:100] + ("..." if len(text) > 100 else ""),
"sentiment": label_ru,
"confidence": f"{score_percent}%",
"time": elapsed_time,
"model": selected_model
}
history.insert(0, history_entry)
if len(history) > HISTORY_SIZE:
history.pop()
# форматирование истории
history_text = "история запросов:\n"
for i, entry in enumerate(history, 1):
history_text += f"{i}. текст: {entry['text']}\n"
history_text += f" тональность: {entry['sentiment']} ({entry['confidence']})\n"
history_text += f" время: {entry['time']} мс | модель: {entry['model']}\n\n"
return warning, result_text, history_text
except Exception as e:
return f"ошибка: {str(e)}", "", ""
# создание интерфейса
with gr.Blocks(title="анализатор тональности", theme=gr.themes.Soft()) as demo:
# заголовок
gr.Markdown("""
# анализатор тональности текста
определение тональности: позитивный, негативный, нейтральный
""")
# основная часть
with gr.Row():
with gr.Column(scale=2):
# выбор модели
model_selector = gr.Dropdown(
choices=list(MODELS.keys()),
value=list(MODELS.keys())[0],
label="выберите модель"
)
# поле ввода
text_input = gr.Textbox(
label="введите текст на русском",
placeholder="введите текст здесь...",
lines=5,
max_lines=10
)
# кнопка
analyze_btn = gr.Button("анализировать", variant="primary")
# примеры
gr.Examples(
examples=[
["это просто прекрасный день, я так счастлив!"],
["ужасное обслуживание, никогда больше не приду."],
["ну, обычный день, ничего особенного."],
["товар соответствует описанию, доставка быстрая."],
["ожидал большего, качество оставляет желать лучшего."]
],
inputs=text_input,
label="примеры для теста"
)
with gr.Column(scale=3):
# вывод
warning_output = gr.Markdown(label="уведомления")
result_output = gr.Markdown(label="результат анализа")
history_output = gr.Markdown(label="история запросов", value="история запросов:\nздесь будет история ваших запросов")
# обработка нажатия
analyze_btn.click(
fn=analyze_sentiment,
inputs=[text_input, model_selector],
outputs=[warning_output, result_output, history_output]
)
# информация
gr.Markdown("---")
gr.Markdown("""
### информация о проекте
- максимальная длина текста: 2000 символов
- история запросов: последние 5 запросов
- доступные модели:
1. основная модель (rubert-base) - более точная
2. быстрая модель (rubert-tiny) - более быстрая
""")
# запуск
if __name__ == "__main__":
demo.launch()