Yermek68 commited on
Commit
7bfdf8f
·
verified ·
1 Parent(s): b429f61

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +78 -44
app.py CHANGED
@@ -4,12 +4,12 @@ from fastapi import FastAPI
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,8 +18,8 @@ def get_summarizer(lang: str):
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:
@@ -28,23 +28,40 @@ def get_sentiment_analyzer(lang: str):
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
 
@@ -56,26 +73,30 @@ def summarize_text(text: str):
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_raw = summarizer(text, max_length=max_len, min_length=min_len, do_sample=False)[0]["summary_text"]
70
-
71
- # Декодируем и очищаем вывод
72
- if isinstance(summary_raw, bytes):
73
- summary = summary_raw.decode("utf-8", errors="ignore")
74
- else:
75
- summary = str(summary_raw).encode("utf-8", errors="ignore").decode("utf-8", errors="ignore")
76
-
77
- summary = summary.replace("▁", " ").replace("<n>", "\n").strip()
78
-
 
 
 
 
 
79
 
80
  # Анализ настроения
81
  sentiment_result = sentiment_model(summary)[0]
@@ -90,18 +111,31 @@ summary = summary.replace("▁", " ").replace("<n>", "\n").strip()
90
  # Определение темы
91
  topic = detect_topic(text)
92
 
93
- # Форматированный вывод
94
- output = f"## 🧠 Eroha Summarizer PRO+ (автоязык: {'Русский' if lang == 'ru' else 'Английский'})\n\n"
95
- output += f"**📌 Основная тема:** {topic}\n\n"
96
- output += f"**💬 Настроение:** {sentiment}\n\n"
97
- output += f"---\n"
98
- output += f"### 📘 Резюме:\n{summary}\n\n"
99
- output += f"---\n"
100
- output += f"**TL;DR:** {summary[:150]}{'...' if len(summary) > 150 else ''}"
101
- return output
102
-
103
- # FastAPI backend
104
- app = FastAPI(title="Eroha Summarizer PRO+", version="1.3")
 
 
 
 
 
 
 
 
 
 
 
 
 
105
  app.add_middleware(
106
  CORSMiddleware,
107
  allow_origins=["*"],
@@ -114,13 +148,13 @@ async def summarize_api(data: dict):
114
  text = data.get("text", "")
115
  return {"summary": summarize_text(text)}
116
 
117
- # Gradio интерфейс
118
  iface = gr.Interface(
119
  fn=summarize_text,
120
  inputs=gr.Textbox(lines=10, label="Введите текст для анализа и суммаризации"),
121
  outputs=gr.Markdown(label="Результат"),
122
- title="Eroha Summarizer PRO+",
123
- description="AI-инструмент для суммаризации, определения языка, темы и настроения текста (рус/англ).",
124
  )
125
 
126
  if __name__ == "__main__":
 
4
  from fastapi.middleware.cors import CORSMiddleware
5
  from langdetect import detect
6
 
7
+ # 🔹 Кэш моделей
8
  summarizers = {}
9
  analyzers = {}
10
 
11
+ # 🔹 Подбор модели суммаризации
12
  def get_summarizer(lang: str):
 
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
+ # 🔹 Подбор модели анализа настроения
22
  def get_sentiment_analyzer(lang: str):
 
23
  if lang == "ru":
24
  model_name = "blanchefort/rubert-base-cased-sentiment"
25
  else:
 
28
  analyzers[model_name] = pipeline("sentiment-analysis", model=model_name)
29
  return analyzers[model_name]
30
 
31
+ # 🔹 Определение темы (простая эвристика)
32
  def detect_topic(text: str):
 
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
44
  return "Общее / неопределённое направление"
45
 
46
+ # 🔹 Очистка текста от мусора
47
+ def clean_text(text: str):
48
+ text = (
49
+ text.replace("▁", " ")
50
+ .replace("<n>", "\n")
51
+ .replace("<s>", "")
52
+ .replace("</s>", "")
53
+ .replace("Ġ", " ")
54
+ .replace("Â", "")
55
+ .replace("", "")
56
+ .replace("�", "")
57
+ .strip()
58
+ )
59
+ while " " in text:
60
+ text = text.replace(" ", " ")
61
+ return text
62
+
63
+ # 🔹 Главная функция
64
  def summarize_text(text: str):
 
65
  if not text.strip():
66
  return "❌ Введите текст для анализа."
67
 
 
73
  summarizer = get_summarizer(lang)
74
  sentiment_model = get_sentiment_analyzer(lang)
75
 
76
+ # Оптимизация под длину текста
77
  words = len(text.split())
78
+ if words < 50:
79
+ # Короткий текст возвращаем TL;DR напрямую
80
+ summary = text.strip()
 
81
  else:
82
+ if words < 100:
83
+ max_len, min_len = 80, 20
84
+ elif words < 300:
85
+ max_len, min_len = 150, 40
86
+ else:
87
+ max_len, min_len = 250, 60
88
+
89
+ # Суммаризация
90
+ summary_raw = summarizer(
91
+ text, max_length=max_len, min_length=min_len, do_sample=False
92
+ )[0]["summary_text"]
93
+
94
+ # Безопасное декодирование и очистка
95
+ if isinstance(summary_raw, bytes):
96
+ summary = summary_raw.decode("utf-8", errors="ignore")
97
+ else:
98
+ summary = str(summary_raw).encode("utf-8", errors="ignore").decode("utf-8", errors="ignore")
99
+ summary = clean_text(summary)
100
 
101
  # Анализ настроения
102
  sentiment_result = sentiment_model(summary)[0]
 
111
  # Определение темы
112
  topic = detect_topic(text)
113
 
114
+ # Улучшенное форматирование Markdown
115
+ output = f"""
116
+ # 🧠 **Eroha Summarizer PRO++**
117
+ _(Автоязык: {'Русский' if lang == 'ru' else 'Английский'})_
118
+
119
+ ---
120
+
121
+ ### 📌 **Основная тема:** {topic}
122
+ ### 💬 **Настроение:** {sentiment}
123
+
124
+ ---
125
+
126
+ ## 📘 **Резюме**
127
+ {summary}
128
+
129
+ ---
130
+
131
+ ### ✨ **TL;DR**
132
+ {summary[:200]}{'...' if len(summary) > 200 else ''}
133
+ """
134
+
135
+ return output.strip()
136
+
137
+ # 🔹 FastAPI backend
138
+ app = FastAPI(title="Eroha Summarizer PRO++", version="1.4")
139
  app.add_middleware(
140
  CORSMiddleware,
141
  allow_origins=["*"],
 
148
  text = data.get("text", "")
149
  return {"summary": summarize_text(text)}
150
 
151
+ # 🔹 Gradio интерфейс
152
  iface = gr.Interface(
153
  fn=summarize_text,
154
  inputs=gr.Textbox(lines=10, label="Введите текст для анализа и суммаризации"),
155
  outputs=gr.Markdown(label="Результат"),
156
+ title="Eroha Summarizer PRO++",
157
+ description="AI-инструмент для анализа, определения языка, темы и настроения текста (рус/англ).",
158
  )
159
 
160
  if __name__ == "__main__":