[PARSING] Sumarize1.py

Google Docs neutral 4 чанков ~3 мин чтения
#!/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()