Yermek68 commited on
Commit
426fb91
·
verified ·
1 Parent(s): e75cbcc

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +65 -27
app.py CHANGED
@@ -4,11 +4,12 @@ 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:
@@ -17,42 +18,81 @@ def get_summarizer(lang: str):
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,19 +102,17 @@ app.add_middleware(
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)
 
4
  from fastapi.middleware.cors import CORSMiddleware
5
  from langdetect import detect
6
 
7
+ # Кэш моделей
8
  summarizers = {}
9
+ analyzers = {}
10
 
11
  def get_summarizer(lang: str):
12
+ """Подбор модели суммаризации по языку"""
13
  if lang == "ru":
14
  model_name = "IlyaGusev/mbart_ru_sum_gazeta"
15
  else:
 
18
  summarizers[model_name] = pipeline("summarization", model=model_name)
19
  return summarizers[model_name]
20
 
21
+ def get_sentiment_analyzer(lang: str):
22
+ """Подбор модели анализа настроения"""
23
+ if lang == "ru":
24
+ model_name = "blanchefort/rubert-base-cased-sentiment"
25
+ else:
26
+ model_name = "nlptown/bert-base-multilingual-uncased-sentiment"
27
+ if model_name not in analyzers:
28
+ analyzers[model_name] = pipeline("sentiment-analysis", model=model_name)
29
+ return analyzers[model_name]
30
+
31
+ def detect_topic(text: str):
32
+ """Простая эвристика для темы текста"""
33
+ topics = {
34
+ "политика": ["правительство", "закон", "президент", "выборы", "партия"],
35
+ "экономика": ["доллар", "рынок", "инфляция", "инвестиции", "компания", "бизнес"],
36
+ "технологии": ["AI", "искусственный интеллект", "технологии", "робот", "интернет"],
37
+ "спорт": ["матч", "игра", "команда", "футбол", "спортсмен"],
38
+ "наука": ["исследование", "учёные", "эксперимент", "данные", "результаты"]
39
+ }
40
+ text_lower = text.lower()
41
+ for topic, keywords in topics.items():
42
+ if any(word.lower() in text_lower for word in keywords):
43
+ return topic.capitalize()
44
+ return "Общее / неопределённое направление"
45
+
46
  def summarize_text(text: str):
47
+ """Главная функция суммаризации"""
48
  if not text.strip():
49
+ return "❌ Введите текст для анализа."
50
 
51
  try:
52
  lang = detect(text)
53
  except:
54
  lang = "en"
55
 
 
56
  summarizer = get_summarizer(lang)
57
+ sentiment_model = get_sentiment_analyzer(lang)
58
 
59
+ # Оптимизация по длине
60
+ words = len(text.split())
61
+ if words < 100:
62
  max_len, min_len = 80, 20
63
+ elif words < 300:
64
  max_len, min_len = 150, 40
65
  else:
66
  max_len, min_len = 250, 60
67
 
68
+ # Суммаризация
69
+ summary = summarizer(text, max_length=max_len, min_length=min_len, do_sample=False)[0]["summary_text"]
 
70
 
71
+ # Анализ настроения
72
+ sentiment_result = sentiment_model(summary)[0]
73
+ sentiment = sentiment_result["label"]
74
+ if "POS" in sentiment or "5" in sentiment:
75
+ sentiment = "😊 Позитивное"
76
+ elif "NEG" in sentiment or "1" in sentiment:
77
+ sentiment = "😞 Негативное"
78
+ else:
79
+ sentiment = "😐 Нейтральное"
80
 
81
+ # Определение темы
82
+ topic = detect_topic(text)
83
+
84
+ # Форматированный вывод
85
+ output = f"## 🧠 Eroha Summarizer PRO+ (автоязык: {'Русский' if lang == 'ru' else 'Английский'})\n\n"
86
+ output += f"**📌 Основная тема:** {topic}\n\n"
87
+ output += f"**💬 Настроение:** {sentiment}\n\n"
88
+ output += f"---\n"
89
+ output += f"### 📘 Резюме:\n{summary}\n\n"
90
+ output += f"---\n"
91
+ output += f"**TL;DR:** {summary[:150]}{'...' if len(summary) > 150 else ''}"
92
+ return output
93
 
94
+ # FastAPI backend
95
+ app = FastAPI(title="Eroha Summarizer PRO+", version="1.3")
96
  app.add_middleware(
97
  CORSMiddleware,
98
  allow_origins=["*"],
 
102
 
103
  @app.post("/api/summarize")
104
  async def summarize_api(data: dict):
 
105
  text = data.get("text", "")
106
  return {"summary": summarize_text(text)}
107
 
108
+ # Gradio интерфейс
109
  iface = gr.Interface(
110
  fn=summarize_text,
111
+ inputs=gr.Textbox(lines=10, label="Введите текст для анализа и суммаризации"),
112
  outputs=gr.Markdown(label="Результат"),
113
+ title="Eroha Summarizer PRO+",
114
+ description="AI-инструмент для суммаризации, определения языка, темы и настроения текста (рус/англ).",
115
  )
116
 
 
117
  if __name__ == "__main__":
118
+ iface.launch(server_name="0.0.0.0", server_port=7860)