[PARSING] Sumarize1.py
Сущности
#!/usr/bin/env python3
<br>
# -*- coding: utf-8 -*-
<br>
<br>
import sys
<br>
import os
<br>
import time
<br>
import itertools
<br>
import matplotlib.pyplot as plt
<br>
import pyfiglet
<br>
from tqdm import tqdm
<br>
import openai
<br>
from colorama import Fore, Style
<br>
from deep_translator import GoogleTranslator
<br>
import re
<br>
<br>
###############################################################################
<br>
# Шаг 1: Принудительно меняем stdout, stderr на UTF-8 (Python 3.7+)
<br>
###############################################################################
<br>
if sys.version_info >= (3, 7):
<br>
try:
<br>
sys.stdout.reconfigure(encoding='utf-8', errors='replace')
<br>
sys.stderr.reconfigure(encoding='utf-8', errors='replace')
<br>
except Exception as e:
<br>
print(f"{Fore.RED}Предупреждение: не удалось reconfigure stdout/stderr: {e}{Style.RESET_ALL}")
<br>
<br>
# Шаг 2: Установить ключ OpenAI
<br>
openai.api_key = "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"
<br>
<br>
###############################################################################
<br>
# Функция перевода текста с казахского на русский
<br>
###############################################################################
<br>
def translate_to_russian(text):
<br>
"""Переводит текст с казахского на русский (если есть казахские символы)"""
<br>
if any(char in text for char in "әңғөұүһіқ"):
<br>
try:
<br>
translated_text = GoogleTranslator(source="kk", target="ru").translate(text)
<br>
return translated_text
<br>
except Exception as e:
<br>
print(f"{Fore.RED}Ошибка перевода: {e}{Style.RESET_ALL}")
<br>
return text # Возвращаем оригинал, если перевод не удался
<br>
return text # Если казахских букв нет, просто возвращаем оригинальный текст
<br>
<br>
###############################################################################
<br>
# Функция очистки текста
<br>
###############################################################################
<br>
def clean_text(text):
<br>
"""
<br>
Убирает ненужные ссылки, HTML-коды, дубликаты хэштегов и соцсети.
<br>
"""
<br>
# Удаляем ссылки
<br>
text = re.sub(r"https?://\S+", "", text)
<br>
<br>
# Удаляем HTML-теги (если вдруг есть)
<br>
text = re.sub(r"<.*?>", "", text)
<br>
<br>
# Удаляем дубликаты хэштегов и повторяющиеся соцсети
<br>
text = re.sub(r"#\S+\s*", "", text)
<br>
text = re.sub(r"(Telegram|Instagram|Facebook|Tik-Tok|WhatsApp|YouTube|Cайт)[^\n]*", "", text)
<br>
<br>
return text.strip()
<br>
<br>
###############################################################################
<br>
# Функция поиска и чтения .txt-файлов
<br>
###############################################################################
<br>
def find_txt_files(root_dir):
<br>
txt_files = []
<br>
for dirpath, _, filenames in os.walk(root_dir):
<br>
for file in filenames:
<br>
if file.lower().endswith(".txt"):
<br>
txt_files.append(os.path.join(dirpath, file))
<br>
return txt_files
<br>
<br>
def extract_text(file_path):
<br>
"""
<br>
Читает файл, переводит с казахского на русский, очищает текст.
<br>
"""
<br>
try:
<br>
with open(file_path, "r", encoding="utf-8") as f:
<br>
content = f.read()
<br>
except Exception as e:
<br>
print(f"{Fore.RED}Ошибка чтения {file_path}: {e}{Style.RESET_ALL}")
<br>
return ""
<br>
<br>
# Чистим текст от мусора
<br>
content = clean_text(content)
<br>
<br>
# Переводим текст, если он на казахском
<br>
return translate_to_russian(content)
<br>
<br>
###############################################################################
<br>
# Функция генерации саммари через GPT-4 (разбивка на части по 5000 символов)
<br>
###############################################################################
<br>
def generate_summary(text, file_name):
<br>
if not text:
<br>
return "Ошибка: пустой текст."
<br>
<br>
try:
<br>
chunks = [text[i:i+5000] for i in range(0, len(text), 5000)] # Разбиваем текст на части по 5000 символов
<br>
summary_parts = []
<br>
<br>
for chunk in chunks:
<br>
response = openai.ChatCompletion.create(
<br>
model="gpt-4",
<br>
messages=[
<br>
{
<br>
"role": "system",
<br>
"content": (
<br>
"Прочитай текст, исправь ошибки транскрибации, "
<br>
"убери артефакты и восстанови смысл фраз.\n"
<br>
"Определи основную тему, категорию, уровень важности (низкий, средний, высокий) "
<br>
"и тональность (нейтральная, аналитическая, критическая, позитивная). "
<br>
"Выяви ключевых персон и организации.\n"
<br>
"Если есть важные цитаты, выдели их в отдельный блок. "
<br>
"Сделай описание коротким и ёмким, избегая лишних деталей."
<br>
)
<br>
},
<br>
{
<br>
"role": "user",
<br>
"content": chunk.encode("utf-8", errors="replace").decode("utf-8")
<br>
}
<br>
]
<br>
)
<br>
summary_parts.append(response.choices[0].message.content.strip())
<br>
<br>
return "\n\n".join(summary_parts)
<br>
<br>
except Exception as e:
<br>
print(f"{Fore.RED}Ошибка при генерации саммари: {e}{Style.RESET_ALL}")
<br>
return "Ошибка: не удалось создать саммари."
<br>
<br>
###############################################################################
<br>
# Функция сохранения отчёта в Markdown
<br>
###############################################################################
<br>
def save_markdown_report(summary_text, stats_text, filename="summary_report.md"):
<br>
try:
<br>
with open(filename, "w", encoding="utf-8") as f:
<br>
f.write("# Отчёт по обработке файлов\n\n")
<br>
f.write("## Саммари\n\n")
<br>
f.write(summary_text + "\n\n")
<br>
f.write("## Статистика\n\n")
<br>
f.write(stats_text + "\n")
<br>
print(f"{Fore.GREEN}\n✅ Markdown-отчёт успешно сохранён: {filename}{Style.RESET_ALL}")
<br>
except Exception as e:
<br>
print(f"{Fore.RED}Ошибка при сохранении Markdown: {e}{Style.RESET_ALL}")
<br>
<br>
###############################################################################
<br>
# Основная логика
<br>
###############################################################################
<br>
def main():
<br>
root_dir = os.getcwd()
<br>
txt_files = find_txt_files(root_dir)
<br>
total_files = len(txt_files)
<br>
<br>
print(f"{Fore.CYAN}Найдено {total_files} TXT-файлов. Начинаю обработку...{Style.RESET_ALL}")
<br>
summary_report = ""
<br>
for file_path in tqdm(txt_files, desc="💀 Обработка файлов 💀", unit="file", bar_format="{l_bar}💀{bar}💀{r_bar}"):
<br>
text = extract_text(file_path)
<br>
if not text:
<br>
continue
<br>
summary = generate_summary(text, os.path.basename(file_path))
<br>
summary_report += f"{summary}\n\n"
<br>
<br>
stats_text = "Статистические данные пока не реализованы."
<br>
save_markdown_report(summary_report, stats_text)
<br>
<br>
if __name__ == "__main__":
<br>
main()