Yermek68 commited on
Commit
cbb7d22
·
verified ·
1 Parent(s): d93b7e1

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +32 -16
app.py CHANGED
@@ -7,17 +7,21 @@ from docx import Document
7
  from fpdf import FPDF
8
  from langdetect import detect
9
  import urllib.request
 
10
 
11
- # === Папки и шрифт ===
12
  os.makedirs("/app/models", exist_ok=True)
13
  FONT_PATH = "DejaVuSans.ttf"
 
 
14
  if not os.path.exists(FONT_PATH):
 
15
  urllib.request.urlretrieve(
16
  "https://github.com/dejavu-fonts/dejavu-fonts/raw/master/ttf/DejaVuSans.ttf",
17
  FONT_PATH
18
  )
19
 
20
- # === Загрузка моделей ===
21
  def load_model(task, model_name):
22
  print(f"🔹 Загружается модель: {model_name}")
23
  return pipeline(task, model=model_name, cache_dir="/app/models")
@@ -28,12 +32,13 @@ summarizers = {
28
  "kz": load_model("summarization", "csebuetnlp/mT5_multilingual_XLSum")
29
  }
30
 
31
- # === Чтение файлов ===
32
  def read_file(file):
33
  if not file:
34
  return ""
35
  filename = file.name.lower()
36
  text = ""
 
37
  try:
38
  if filename.endswith(".pdf"):
39
  with pdfplumber.open(file.name) as pdf:
@@ -47,9 +52,10 @@ def read_file(file):
47
  text = file.read().decode("utf-8", errors="ignore")
48
  except Exception as e:
49
  return f"⚠️ Ошибка при чтении файла: {e}"
 
50
  return text.strip()
51
 
52
- # === Определение языка ===
53
  def detect_language(text):
54
  try:
55
  lang = detect(text)
@@ -62,17 +68,18 @@ def detect_language(text):
62
  except:
63
  return "en"
64
 
65
- # === Суммаризация ===
66
  def summarize_text(text):
67
  if not text or len(text) < 50:
68
  return "⚠️ Недостаточно текста для анализа.", "❌", "❌", 0, 0, "❌"
69
 
70
  lang = detect_language(text)
71
  model = summarizers.get(lang, summarizers["en"])
 
72
  flags = {"ru": "🇷🇺 Русский", "kz": "🇰🇿 Қазақ тілі", "en": "🇬🇧 English"}
73
  lang_label = flags.get(lang, "🌍 Unknown")
74
- model_label = model.model.name_or_path if hasattr(model.model, "name_or_path") else "Custom"
75
 
 
76
  chunk_size = 2500
77
  overlap = 200
78
  summaries = []
@@ -92,7 +99,7 @@ def summarize_text(text):
92
 
93
  return summary, lang_label, model_label, src_len, sum_len, f"{compression}%"
94
 
95
- # === Сохранение результатов ===
96
  def save_summary_as_txt(summary_text):
97
  path = "summary.txt"
98
  with open(path, "w", encoding="utf-8") as f:
@@ -117,7 +124,7 @@ def save_summary_as_pdf(summary_text):
117
  pdf.output(path)
118
  return path
119
 
120
- # === Главная функция ===
121
  def summarize_file(file):
122
  text = read_file(file)
123
  if text.startswith("⚠️"):
@@ -134,7 +141,16 @@ def summarize_file(file):
134
 
135
  return summary, lang_label, model_label, src_len, sum_len, compression, txt_path, docx_path, pdf_path
136
 
137
- # === Интерфейс ===
 
 
 
 
 
 
 
 
 
138
  demo = gr.Interface(
139
  fn=summarize_file,
140
  inputs=gr.File(label="📂 Загрузите документ (.pdf, .docx, .txt)"),
@@ -144,14 +160,14 @@ demo = gr.Interface(
144
  gr.Textbox(label="🧠 Используемая модель"),
145
  gr.Number(label="📄 Длина исходного текста"),
146
  gr.Number(label="📝 Длина резюме"),
147
- gr.Textbox(label="📉 Сжатие"),
148
- gr.File(label="📄 TXT"),
149
- gr.File(label="📘 DOCX"),
150
- gr.File(label="📕 PDF"),
151
  ],
152
- title="🧠 Eroha Summarizer PRO (автономная версия)",
153
- description="🚀 Определяет язык (🇷🇺 / 🇰🇿 / 🇬🇧), создаёт краткое резюме и сохраняет в TXT, DOCX, PDF.",
154
- theme="soft",
155
  allow_flagging="never"
156
  )
157
 
 
7
  from fpdf import FPDF
8
  from langdetect import detect
9
  import urllib.request
10
+ import gradio.themes as gt
11
 
12
+ # === 🗂️ Создание папок и установка шрифта ===
13
  os.makedirs("/app/models", exist_ok=True)
14
  FONT_PATH = "DejaVuSans.ttf"
15
+
16
+ # Если шрифт отсутствует — скачиваем
17
  if not os.path.exists(FONT_PATH):
18
+ print("⬇️ Загружаю шрифт DejaVuSans.ttf ...")
19
  urllib.request.urlretrieve(
20
  "https://github.com/dejavu-fonts/dejavu-fonts/raw/master/ttf/DejaVuSans.ttf",
21
  FONT_PATH
22
  )
23
 
24
+ # === ⚙️ Загрузка моделей один раз при запуске ===
25
  def load_model(task, model_name):
26
  print(f"🔹 Загружается модель: {model_name}")
27
  return pipeline(task, model=model_name, cache_dir="/app/models")
 
32
  "kz": load_model("summarization", "csebuetnlp/mT5_multilingual_XLSum")
33
  }
34
 
35
+ # === 📄 Функция чтения текстов из файлов ===
36
  def read_file(file):
37
  if not file:
38
  return ""
39
  filename = file.name.lower()
40
  text = ""
41
+
42
  try:
43
  if filename.endswith(".pdf"):
44
  with pdfplumber.open(file.name) as pdf:
 
52
  text = file.read().decode("utf-8", errors="ignore")
53
  except Exception as e:
54
  return f"⚠️ Ошибка при чтении файла: {e}"
55
+
56
  return text.strip()
57
 
58
+ # === 🌐 Определение языка ===
59
  def detect_language(text):
60
  try:
61
  lang = detect(text)
 
68
  except:
69
  return "en"
70
 
71
+ # === 🧠 Суммаризация текста ===
72
  def summarize_text(text):
73
  if not text or len(text) < 50:
74
  return "⚠️ Недостаточно текста для анализа.", "❌", "❌", 0, 0, "❌"
75
 
76
  lang = detect_language(text)
77
  model = summarizers.get(lang, summarizers["en"])
78
+
79
  flags = {"ru": "🇷🇺 Русский", "kz": "🇰🇿 Қазақ тілі", "en": "🇬🇧 English"}
80
  lang_label = flags.get(lang, "🌍 Unknown")
 
81
 
82
+ model_label = model.model.name_or_path if hasattr(model.model, "name_or_path") else "Custom"
83
  chunk_size = 2500
84
  overlap = 200
85
  summaries = []
 
99
 
100
  return summary, lang_label, model_label, src_len, sum_len, f"{compression}%"
101
 
102
+ # === 💾 Сохранение файлов ===
103
  def save_summary_as_txt(summary_text):
104
  path = "summary.txt"
105
  with open(path, "w", encoding="utf-8") as f:
 
124
  pdf.output(path)
125
  return path
126
 
127
+ # === 🚀 Главная функция обработки ===
128
  def summarize_file(file):
129
  text = read_file(file)
130
  if text.startswith("⚠️"):
 
141
 
142
  return summary, lang_label, model_label, src_len, sum_len, compression, txt_path, docx_path, pdf_path
143
 
144
+ # === 🎨 Интерфейс Gradio ===
145
+ custom_theme = gt.Default(
146
+ primary_hue="purple",
147
+ secondary_hue="violet",
148
+ ).set(
149
+ body_background_fill="#f8f6ff",
150
+ button_primary_background_fill="linear-gradient(90deg, #7e3ff2, #c084fc)",
151
+ button_primary_background_fill_hover="linear-gradient(90deg, #6b21a8, #9333ea)",
152
+ )
153
+
154
  demo = gr.Interface(
155
  fn=summarize_file,
156
  inputs=gr.File(label="📂 Загрузите документ (.pdf, .docx, .txt)"),
 
160
  gr.Textbox(label="🧠 Используемая модель"),
161
  gr.Number(label="📄 Длина исходного текста"),
162
  gr.Number(label="📝 Длина резюме"),
163
+ gr.Textbox(label="📉 Степень сокращения"),
164
+ gr.File(label="📄 Скачать TXT"),
165
+ gr.File(label="📘 Скачать DOCX"),
166
+ gr.File(label="📕 Скачать PDF"),
167
  ],
168
+ title="🧠 Eroha Summarizer PRO (Автономная версия)",
169
+ description="🚀 Определяет язык (🇷🇺 / 🇰🇿 / 🇬🇧), создаёт краткое резюме и сохраняет в TXT, DOCX, PDF с поддержкой кириллицы.",
170
+ theme=custom_theme,
171
  allow_flagging="never"
172
  )
173