Yermek68 commited on
Commit
e75cbcc
·
verified ·
1 Parent(s): 8f7e74b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +52 -70
app.py CHANGED
@@ -2,64 +2,57 @@ import gradio as gr
2
  from transformers import pipeline
3
  from fastapi import FastAPI
4
  from fastapi.middleware.cors import CORSMiddleware
5
- import time
6
- from datetime import datetime
7
- import logging
8
- import json
9
- import os
10
 
11
- # -----------------------------------
12
- # 1. ЛОГИ И МЕТРИКИ
13
- # -----------------------------------
14
 
15
- logging.basicConfig(level=logging.INFO)
16
- logger = logging.getLogger("ErohaSummarizer")
17
-
18
- def save_metrics(metrics: dict):
19
- """Сохраняет метрики в metrics.json"""
20
- os.makedirs("logs", exist_ok=True)
21
- with open("logs/metrics.json", "a", encoding="utf-8") as f:
22
- json.dump(metrics, f, ensure_ascii=False)
23
- f.write("\n")
24
-
25
-
26
- # -----------------------------------
27
- # 2. МОДЕЛЬ СУММАРИЗАЦИИ
28
- # -----------------------------------
29
-
30
- summarizer = None
31
 
32
  def summarize_text(text: str):
33
- """Функция суммаризации текста"""
34
- global summarizer
35
- start_time = time.time()
36
-
37
- if summarizer is None:
38
- summarizer = pipeline("summarization", model="facebook/bart-large-cnn")
39
-
40
- result = summarizer(text, max_length=180, min_length=50, do_sample=False)
41
- summary = result[0]["summary_text"]
42
-
43
- elapsed = round(time.time() - start_time, 3)
44
- metrics = {
45
- "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
46
- "input_length": len(text),
47
- "summary_length": len(summary),
48
- "processing_time_sec": elapsed,
49
- "status": "success",
50
- }
51
-
52
- logger.info(f"[METRICS] {metrics}")
53
- save_metrics(metrics)
54
- return summary
55
-
56
-
57
- # -----------------------------------
58
- # 3. FASTAPI — API-СЕРВЕР
59
- # -----------------------------------
60
-
61
- app = FastAPI(title="Eroha Summarizer API")
62
-
 
 
 
 
 
63
  app.add_middleware(
64
  CORSMiddleware,
65
  allow_origins=["*"],
@@ -69,30 +62,19 @@ app.add_middleware(
69
 
70
  @app.post("/api/summarize")
71
  async def summarize_api(data: dict):
72
- """REST API endpoint"""
73
  text = data.get("text", "")
74
- if not text.strip():
75
- return {"error": "Пустой ввод. Введите текст."}
76
  return {"summary": summarize_text(text)}
77
 
78
-
79
- # -----------------------------------
80
- # 4. GRADIO — Веб-интерфейс
81
- # -----------------------------------
82
-
83
  iface = gr.Interface(
84
  fn=summarize_text,
85
  inputs=gr.Textbox(lines=10, label="Введите текст для суммаризации"),
86
- outputs=gr.Textbox(label="Результат"),
87
  title="Eroha Summarizer PRO",
88
- description="AI-инструмент для анализа и суммаризации текста (рус/англ)."
89
  )
90
 
91
-
92
- # -----------------------------------
93
- # 5. ЗАПУСК (чтобы Hugging Face не засыпал)
94
- # -----------------------------------
95
-
96
  if __name__ == "__main__":
97
- logger.info("🚀 Starting Eroha Summarizer PRO...")
98
  iface.launch(server_name="0.0.0.0", server_port=7860, share=False)
 
2
  from transformers import pipeline
3
  from fastapi import FastAPI
4
  from fastapi.middleware.cors import CORSMiddleware
5
+ from langdetect import detect
 
 
 
 
6
 
7
+ # Кэшируем пайплайны, чтобы не перезагружались при каждом вызове
8
+ summarizers = {}
 
9
 
10
+ def get_summarizer(lang: str):
11
+ """Возвращает подходящий пайплайн для заданного языка"""
12
+ if lang == "ru":
13
+ model_name = "IlyaGusev/mbart_ru_sum_gazeta"
14
+ else:
15
+ model_name = "facebook/bart-large-cnn"
16
+ if model_name not in summarizers:
17
+ summarizers[model_name] = pipeline("summarization", model=model_name)
18
+ return summarizers[model_name]
 
 
 
 
 
 
 
19
 
20
  def summarize_text(text: str):
21
+ """Функция суммаризации с автоопределением языка и оптимизацией"""
22
+ if not text.strip():
23
+ return "❌ Пожалуйста, введите текст для анализа."
24
+
25
+ try:
26
+ lang = detect(text)
27
+ except:
28
+ lang = "en"
29
+
30
+ # Определяем модель по языку
31
+ summarizer = get_summarizer(lang)
32
+
33
+ # Оптимизация параметров
34
+ word_count = len(text.split())
35
+ if word_count < 100:
36
+ max_len, min_len = 80, 20
37
+ elif word_count < 300:
38
+ max_len, min_len = 150, 40
39
+ else:
40
+ max_len, min_len = 250, 60
41
+
42
+ # Генерация суммаризации
43
+ result = summarizer(text, max_length=max_len, min_length=min_len, do_sample=False)
44
+ summary = result[0]["summary_text"].strip()
45
+
46
+ # Форматированный вывод
47
+ formatted = f"### 📘 Резюме (язык: {'Русский' if lang == 'ru' else 'Английский'})\n\n"
48
+ formatted += f"{summary}\n\n"
49
+ formatted += "---\n"
50
+ formatted += f"**TL;DR:** {summary[:120]}{'...' if len(summary) > 120 else ''}"
51
+
52
+ return formatted
53
+
54
+ # FastAPI-приложение (REST API)
55
+ app = FastAPI(title="Eroha Summarizer PRO", version="1.2")
56
  app.add_middleware(
57
  CORSMiddleware,
58
  allow_origins=["*"],
 
62
 
63
  @app.post("/api/summarize")
64
  async def summarize_api(data: dict):
65
+ """REST API для суммаризации"""
66
  text = data.get("text", "")
 
 
67
  return {"summary": summarize_text(text)}
68
 
69
+ # Gradio-интерфейс
 
 
 
 
70
  iface = gr.Interface(
71
  fn=summarize_text,
72
  inputs=gr.Textbox(lines=10, label="Введите текст для суммаризации"),
73
+ outputs=gr.Markdown(label="Результат"),
74
  title="Eroha Summarizer PRO",
75
+ description="AI-инструмент для анализа и суммаризации текста (рус/англ) с автоопределением языка и TL;DR-форматом.",
76
  )
77
 
78
+ # Запуск
 
 
 
 
79
  if __name__ == "__main__":
 
80
  iface.launch(server_name="0.0.0.0", server_port=7860, share=False)