Yermek68 commited on
Commit
50ad747
·
verified ·
1 Parent(s): 9e85362

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +47 -27
app.py CHANGED
@@ -3,8 +3,9 @@ from transformers import pipeline
3
  import pdfplumber
4
  import docx2txt
5
  from docx import Document
 
6
 
7
- # Загружаем модель один раз при старте
8
  summarizer = pipeline("summarization", model="facebook/bart-large-cnn")
9
 
10
  def read_file(file):
@@ -12,8 +13,8 @@ def read_file(file):
12
  if file is None:
13
  return ""
14
 
15
- text = ""
16
  filename = file.name.lower()
 
17
 
18
  try:
19
  if filename.endswith(".pdf"):
@@ -32,52 +33,70 @@ def read_file(file):
32
  return text.strip()
33
 
34
  def summarize_text(text):
35
- """Безопасная суммаризация с разбиением текста"""
36
  if not text or len(text) < 50:
37
  return "⚠️ Недостаточно текста для суммаризации."
38
 
39
- # Разделим текст на куски (до 2000 символов)
40
- chunk_size = 2000
41
- chunks = [text[i:i + chunk_size] for i in range(0, len(text), chunk_size)]
42
-
43
  summaries = []
44
- for i, chunk in enumerate(chunks):
 
 
45
  try:
46
  result = summarizer(chunk, max_length=180, min_length=40, do_sample=False)
47
  summaries.append(result[0]['summary_text'])
48
  except Exception as e:
49
- summaries.append(f"[Ошибка в части {i + 1}: {str(e)}]")
50
 
51
- return "\n\n".join(summaries)
 
52
 
53
  def save_summary_as_docx(summary_text):
54
- """Сохраняем результат в DOCX"""
55
  doc = Document()
56
  doc.add_heading("Резюме документа", level=1)
57
  doc.add_paragraph(summary_text)
58
- output_path = "summary.docx"
59
- doc.save(output_path)
60
- return output_path
61
 
62
  def save_summary_as_txt(summary_text):
63
- """Сохраняем результат в TXT"""
64
- output_path = "summary.txt"
65
- with open(output_path, "w", encoding="utf-8") as f:
66
  f.write(summary_text)
67
- return output_path
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
68
 
69
  def summarize_file(file):
 
70
  text = read_file(file)
71
  if text.startswith("Ошибка"):
72
- return text, None, None
73
 
74
  summary = summarize_text(text)
 
 
 
75
 
76
- # Сохраняем результат в два формата
77
- txt_file = save_summary_as_txt(summary)
78
- docx_file = save_summary_as_docx(summary)
79
-
80
- return summary, txt_file, docx_file
81
 
82
  # Интерфейс Gradio
83
  demo = gr.Interface(
@@ -85,11 +104,12 @@ demo = gr.Interface(
85
  inputs=gr.File(label="Загрузите документ (.pdf, .docx или .txt)"),
86
  outputs=[
87
  gr.Textbox(label="Краткое резюме"),
88
- gr.File(label="Скачать TXT"),
89
- gr.File(label="Скачать DOCX")
 
90
  ],
91
  title="🧠 Eroha Summarizer",
92
- description="Загрузите PDF, Word или TXT документ. Модель создаст краткое резюме и позволит скачать его.",
93
  )
94
 
95
  demo.launch(server_name="0.0.0.0", server_port=7860)
 
3
  import pdfplumber
4
  import docx2txt
5
  from docx import Document
6
+ from fpdf import FPDF
7
 
8
+ # Загружаем модель
9
  summarizer = pipeline("summarization", model="facebook/bart-large-cnn")
10
 
11
  def read_file(file):
 
13
  if file is None:
14
  return ""
15
 
 
16
  filename = file.name.lower()
17
+ text = ""
18
 
19
  try:
20
  if filename.endswith(".pdf"):
 
33
  return text.strip()
34
 
35
  def summarize_text(text):
36
+ """Суммаризация с безопасным делением на части"""
37
  if not text or len(text) < 50:
38
  return "⚠️ Недостаточно текста для суммаризации."
39
 
40
+ chunk_size = 2500 # безопасная длина
41
+ overlap = 200 # перекрытие между кусками
 
 
42
  summaries = []
43
+
44
+ for i in range(0, len(text), chunk_size - overlap):
45
+ chunk = text[i:i + chunk_size]
46
  try:
47
  result = summarizer(chunk, max_length=180, min_length=40, do_sample=False)
48
  summaries.append(result[0]['summary_text'])
49
  except Exception as e:
50
+ summaries.append(f"[Ошибка в части {len(summaries) + 1}: {str(e)}]")
51
 
52
+ final_summary = "\n\n".join(summaries)
53
+ return final_summary.strip()
54
 
55
  def save_summary_as_docx(summary_text):
56
+ """Сохранение в DOCX"""
57
  doc = Document()
58
  doc.add_heading("Резюме документа", level=1)
59
  doc.add_paragraph(summary_text)
60
+ path = "summary.docx"
61
+ doc.save(path)
62
+ return path
63
 
64
  def save_summary_as_txt(summary_text):
65
+ """Сохранение в TXT"""
66
+ path = "summary.txt"
67
+ with open(path, "w", encoding="utf-8") as f:
68
  f.write(summary_text)
69
+ return path
70
+
71
+ def save_summary_as_pdf(summary_text):
72
+ """Сохранение в PDF с русским шрифтом"""
73
+ path = "summary.pdf"
74
+ pdf = FPDF()
75
+ pdf.add_page()
76
+
77
+ # Используем встроенный шрифт DejaVuSans.ttf, который нужно будет добавить в проект
78
+ try:
79
+ pdf.add_font('DejaVu', '', 'DejaVuSans.ttf', uni=True)
80
+ pdf.set_font('DejaVu', '', 12)
81
+ except:
82
+ pdf.set_font("Arial", size=12)
83
+
84
+ pdf.multi_cell(0, 10, summary_text)
85
+ pdf.output(path)
86
+ return path
87
 
88
  def summarize_file(file):
89
+ """Главная функция"""
90
  text = read_file(file)
91
  if text.startswith("Ошибка"):
92
+ return text, None, None, None
93
 
94
  summary = summarize_text(text)
95
+ txt_path = save_summary_as_txt(summary)
96
+ docx_path = save_summary_as_docx(summary)
97
+ pdf_path = save_summary_as_pdf(summary)
98
 
99
+ return summary, txt_path, docx_path, pdf_path
 
 
 
 
100
 
101
  # Интерфейс Gradio
102
  demo = gr.Interface(
 
104
  inputs=gr.File(label="Загрузите документ (.pdf, .docx или .txt)"),
105
  outputs=[
106
  gr.Textbox(label="Краткое резюме"),
107
+ gr.File(label="📄 Скачать TXT"),
108
+ gr.File(label="📘 Скачать DOCX"),
109
+ gr.File(label="📕 Скачать PDF")
110
  ],
111
  title="🧠 Eroha Summarizer",
112
+ description="Загрузите PDF, DOCX или TXT файл. Модель создаст краткое резюме и позволит скачать результат в любом формате.",
113
  )
114
 
115
  demo.launch(server_name="0.0.0.0", server_port=7860)