| 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() |