Irishkaaa commited on
Commit
701a4f8
·
verified ·
1 Parent(s): 1ede67b

Upload 2 files

Browse files
Files changed (2) hide show
  1. requirements.txt +3 -0
  2. ФИНАЛ_РАБОТАЕТ.py +151 -0
requirements.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ gradio
2
+ sumy
3
+ nltk
ФИНАЛ_РАБОТАЕТ.py ADDED
@@ -0,0 +1,151 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ os.environ["NO_PROXY"] = "localhost,127.0.0.1"
3
+ os.environ["HTTP_PROXY"] = ""
4
+ os.environ["HTTPS_PROXY"] = ""
5
+ import gradio as gr
6
+ from sumy.parsers.plaintext import PlaintextParser
7
+ from sumy.nlp.tokenizers import Tokenizer
8
+ from sumy.summarizers.lex_rank import LexRankSummarizer
9
+ from sumy.summarizers.lsa import LsaSummarizer
10
+ from transformers import pipeline
11
+
12
+ # Хранилище для истории (последние 5 запросов)
13
+ history = []
14
+
15
+ # Нейросетевая модель для абстрактивной суммаризации
16
+ model_name = "IlyaGusev/mbart_ru_sum_gazeta" # русскоязычная модель
17
+ try:
18
+ abstractive_summarizer = pipeline("summarization", model=model_name, tokenizer=model_name)
19
+ print("✅ Нейросетевая модель загружена!")
20
+ except Exception as e:
21
+ print(f"⚠️ Не удалось загрузить нейросеть: {e}")
22
+ print("⚠️ Будет работать только extractive методы (LexRank и LSA)")
23
+ abstractive_summarizer = None
24
+
25
+ def summarize(text, num_sentences, method):
26
+ # 1. Проверка на пустой текст
27
+ if not text or text.strip() == "":
28
+ return "❌ Ошибка: введите текст", format_history()
29
+
30
+ # 2. Ограничение слишком длинного текста
31
+ warning = ""
32
+ if len(text) > 15000:
33
+ text = text[:15000]
34
+ warning = "⚠️ Текст обрезан до 15000 символов\n\n"
35
+
36
+ # 3. Проверка на слишком короткий текст
37
+ if len(text) < 50:
38
+ return warning + "❌ Текст слишком короткий. Введите минимум 50 символов.", format_history()
39
+
40
+ # 4. Выбор метода суммаризации
41
+ result = ""
42
+
43
+ if method == "Нейросеть (ML)":
44
+ # Нейросетевая суммаризация
45
+ if abstractive_summarizer is None:
46
+ return warning + "❌ Нейросетевая модель недоступна. Проверьте установку transformers и torch.", format_history()
47
+
48
+ # Для нейросети нужно ограничить длину текста (у моделей есть лимит)
49
+ text_for_nn = text
50
+ if len(text_for_nn) > 1024:
51
+ text_for_nn = text_for_nn[:1024]
52
+ warning += "⚠️ Для нейросети текст обрезан до 1024 символов\n\n"
53
+
54
+ try:
55
+ # Параметры для суммаризации
56
+ max_len = min(150, num_sentences * 30) # примерное преобразование предложений в токены
57
+ min_len = max(30, num_sentences * 10)
58
+
59
+ summary_nn = abstractive_summarizer(
60
+ text_for_nn,
61
+ max_length=max_len,
62
+ min_length=min_len,
63
+ do_sample=False
64
+ )
65
+ result = summary_nn[0]['summary_text']
66
+ except Exception as e:
67
+ return warning + f"❌ Ошибка нейросети: {str(e)[:150]}", format_history()
68
+
69
+ else:
70
+ # Extractive суммаризация (LexRank или LSA)
71
+ parser = PlaintextParser.from_string(text, Tokenizer("russian"))
72
+
73
+ if method == "LexRank":
74
+ summarizer = LexRankSummarizer()
75
+ else: # LSA
76
+ summarizer = LsaSummarizer()
77
+
78
+ summary_sentences = summarizer(parser.document, num_sentences)
79
+ result = " ".join(str(s) for s in summary_sentences)
80
+
81
+ # 5. Сохранение в историю
82
+ history.append({"text": text[:150] + "...", "summary": result})
83
+ if len(history) > 5:
84
+ history.pop(0)
85
+
86
+ return warning + result, format_history()
87
+
88
+ def format_history():
89
+ if not history:
90
+ return "📜 Нет записей"
91
+
92
+ lines = []
93
+ for i, item in enumerate(reversed(history), 1):
94
+ lines.append(f"**{i}. Исходный текст:** {item['text']}\n**✅ Кратко:** {item['summary']}\n")
95
+ return "\n\n---\n\n".join(lines)
96
+
97
+ # Создаём веб-интерфейс
98
+ with gr.Blocks(title="Система суммаризации текста", theme=gr.themes.Soft()) as demo:
99
+ gr.Markdown("# 📄 Система автоматической суммаризации текста")
100
+ gr.Markdown("Вставьте текст на русском языке — программа выделит самые важные предложения.")
101
+
102
+ with gr.Row():
103
+ with gr.Column(scale=2):
104
+ text_input = gr.Textbox(
105
+ label="📝 Исходный текст",
106
+ lines=12,
107
+ placeholder="Вставьте текст сюда (минимум 50 ��имволов)..."
108
+ )
109
+
110
+ # Слайдер для выбора количества предложений
111
+ slider = gr.Slider(
112
+ minimum=1,
113
+ maximum=10,
114
+ value=3,
115
+ step=1,
116
+ label="📊 Количество предложений в саммари"
117
+ )
118
+
119
+ # Radio-кнопки для выбора метода суммаризации (ДОБАВЛЕНА НЕЙРОСЕТЬ)
120
+ method = gr.Radio(
121
+ choices=["LexRank", "LSA", "Нейросеть (ML)"],
122
+ label="🔧 Метод суммаризации",
123
+ value="LexRank",
124
+ info="LexRank/LSA — выдержка из текста | Нейросеть — пересказ своими словами"
125
+ )
126
+
127
+ btn = gr.Button("🔍 Суммаризировать", variant="primary", size="lg")
128
+
129
+ with gr.Column(scale=1):
130
+ text_output = gr.Textbox(
131
+ label="📋 Краткое содержание",
132
+ lines=6,
133
+ interactive=False
134
+ )
135
+
136
+ history_output = gr.Markdown(label="📜 История последних 5 запросов")
137
+
138
+ # Привязываем кнопку к функциям
139
+ btn.click(
140
+ fn=summarize,
141
+ inputs=[text_input, slider, method],
142
+ outputs=[text_output, history_output]
143
+ )
144
+
145
+ gr.Markdown("---")
146
+ gr.Markdown("💡 **Как работает:** LexRank и LSA выбирают готовые предложения из текста. Нейросеть (ML) понимает смысл и пересказывает своими словами.")
147
+ gr.Markdown("📌 **Совет:** Для нейросети лучше использовать тексты от 200 до 1000 символов. Для длинных текстов используйте LexRank или LSA.")
148
+
149
+ # Запуск
150
+ if __name__ == "__main__":
151
+ demo.launch(share=True)