from transformers import AutoTokenizer, AutoModelForSeq2SeqLM from transformers import pipeline import gradio as gr import pandas as pd from datetime import datetime # --- 1. ПІДГОТОВКА МОДЕЛЕЙ --- print("Завантаження моделей... зачекайте") # Модель для аналізу тональності sentiment_pipe = pipeline("sentiment-analysis", model="distilbert-base-uncased-finetuned-sst-2-english") # Модель для резюмування model_name = "sshleifer/distilbart-cnn-12-6" tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForSeq2SeqLM.from_pretrained(model_name) print("Моделі готові до роботи!") # --- 2. ЛОГІКА ТА ВІЗУАЛІЗАЦІЯ --- def format_sentiment_result(label, score): """Генерація HTML-картки з анімацією та логікою впевненості (Завдання 1)""" if score > 0.9: confidence_text = "💎 Дуже впевнено" elif score >= 0.7: confidence_text = "✅ Впевнено" else: confidence_text = "🤔 Непевно" primary_color = "#6366f1" if label == "POSITIVE" else "#f43f5e" bg_gradient = "linear-gradient(135deg, #eef2ff 0%, #e0e7ff 100%)" if label == "POSITIVE" else "linear-gradient(135deg, #fff1f2 0%, #ffe4e6 100%)" bar_width = int(score * 100) return f"""
Будь ласка, введіть текст для аналізу
", history, pd.DataFrame(history) if history else pd.DataFrame(), get_stats(history) res = sentiment_pipe(text)[0] label, score = res["label"], res["score"] entry = { "Час": datetime.now().strftime("%H:%M:%S"), "Текст": text[:45] + "..." if len(text) > 45 else text, "Результат": label, "Впевн.": f"{score:.1%}", "raw_score": score, "word_count": len(text.split()) } updated_history = history + [entry] df = pd.DataFrame(updated_history)[["Час", "Текст", "Результат", "Впевн."]] return format_sentiment_result(label, score), updated_history, df, get_stats(updated_history) def summarize_process(text, max_len): """Функція резюмування тексту""" if not text.strip(): return "Введіть довгий текст для скорочення..." inputs = tokenizer(text, return_tensors="pt", truncation=True, max_length=1024) outputs = model.generate(**inputs, max_length=max_len, min_length=20, do_sample=False) return tokenizer.decode(outputs[0], skip_special_tokens=True) def push_to_wishlist(history, current_wishlist): """Додавання останнього аналізу до Wishlist State (Завдання 3)""" if not history: return current_wishlist, "⚠ Немає результатів для збереження!" last = history[-1] new_item = f"⭐ [{last['Результат']}] {last['Текст']} (Точність: {last['Впевн.']})" updated_wishlist = current_wishlist + [new_item] return updated_wishlist, "\n".join(updated_wishlist) # --- 3. ІНТЕРФЕЙС GRADIO (Завдання 4) --- with gr.Blocks(title="NLP Analytics Pro", theme=gr.themes.Glass()) as demo: # Заголовки gr.HTML("Інтелектуальний аналіз тональності та резюмування
") # Реєстрація States history_state = gr.State([]) wishlist_state = gr.State([]) with gr.Row(): # Секція 1: Аналіз Тональності with gr.Column(scale=1): gr.Markdown("### 💬 Sentiment Analysis") txt_input = gr.Textbox(label="Ваш текст для аналізу", placeholder="Наприклад: I love this project...", lines=3) with gr.Row(): btn_run = gr.Button("Аналізувати ▶", variant="primary") btn_save = gr.Button("Зберегти в Обране ⭐", variant="secondary") out_html = gr.HTML("