File size: 2,460 Bytes
ad5f036
71b5660
 
fc561bf
71b5660
a3b5165
7e47a32
 
0dfa820
7e47a32
 
 
 
 
 
 
71b5660
0dfa820
 
 
 
 
 
 
 
 
 
 
 
fc561bf
0dfa820
 
 
 
 
71b5660
0dfa820
 
fc561bf
0dfa820
 
 
 
 
fc561bf
a3b5165
0dfa820
 
 
 
71b5660
a3b5165
0dfa820
 
 
 
7e47a32
0dfa820
71b5660
0dfa820
 
 
 
 
 
 
 
 
 
 
 
 
71b5660
0dfa820
ad5f036
71b5660
0dfa820
71b5660
 
0dfa820
ad5f036
 
7e47a32
fc561bf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import gradio as gr
from transformers import pipeline
import pdfplumber
import os

# --- Ленивая загрузка модели ---
summarizer = None

def load_model():
    global summarizer
    if summarizer is None:
        summarizer = pipeline(
            "summarization",
            model="sshleifer/distilbart-cnn-12-6"
        )
    return summarizer

# --- Безопасное чтение PDF ---
def extract_pdf_text(path):
    text = ""
    try:
        with pdfplumber.open(path) as pdf:
            for page in pdf.pages:
                chunk = page.extract_text()
                if chunk:
                    text += chunk + "\n"
    except Exception as e:
        return "", f"Ошибка при чтении PDF: {e}"
    return text, None

# --- Универсальное чтение файла ---
def read_file(path):
    if not path:
        return "", "Файл не передан."
    path = str(path).strip()

    if path.lower().endswith(".pdf"):
        return extract_pdf_text(path)

    try:
        with open(path, "r", encoding="utf-8", errors="ignore") as f:
            return f.read(), None
    except Exception as e:
        return "", f"Ошибка при чтении TXT: {e}"

# --- Основная функция ---
def summarize_file(path):
    text, err = read_file(path)
    if err:
        return f"⚠️ {err}"

    if not text.strip():
        return "⚠️ Не удалось извлечь текст."

    if len(text) < 80:
        return "⚠️ Слишком мало текста для суммаризации."

    model = load_model()

    # Ограничиваем текст для избежания OOM
    text = text[:4000]

    try:
        summary = model(
            text,
            max_length=180,
            min_length=60,
            do_sample=False
        )
        return summary[0]["summary_text"]
    except Exception as e:
        return f"⚠️ Ошибка суммаризации: {e}"

# --- Интерфейс Gradio ---
demo = gr.Interface(
    fn=summarize_file,
    inputs=gr.File(type="filepath", label="Загрузите файл (.pdf или .txt)"),
    outputs=gr.Textbox(label="Результат суммаризации"),
    title="Eroha Summarizer 🧠",
    description="Загрузите документ (PDF или TXT), и модель создаст краткое резюме."
)

if __name__ == "__main__":
    demo.launch()