159 lines
5.4 KiB
Python
Executable File
159 lines
5.4 KiB
Python
Executable File
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
Script para processar PDFs e carregar no banco de dados
|
|
Descomplicar - Agência de Aceleração Digital
|
|
https://www.descomplicar.pt
|
|
"""
|
|
|
|
import os
|
|
from pathlib import Path
|
|
from processors.pdf_processor import PDFProcessor
|
|
from processors.db_processor import DBProcessor
|
|
from processors.embedding_processor import EmbeddingProcessor
|
|
from dotenv import load_dotenv
|
|
import json
|
|
from datetime import datetime
|
|
|
|
def update_changelog(new_files: list, modified_files: list = None):
|
|
"""Atualiza o CHANGELOG.md"""
|
|
changelog_path = Path(__file__).parent.parent / 'CHANGELOG.md'
|
|
|
|
# Criar entrada para hoje
|
|
today = datetime.now().strftime('%d-%m-%Y')
|
|
entry = f"\n[1.0.0] - {today}\n"
|
|
|
|
if new_files:
|
|
entry += "\nAdicionado\n"
|
|
for file in new_files:
|
|
entry += f"- {file}\n"
|
|
|
|
if modified_files:
|
|
entry += "\nAlterado\n"
|
|
for file in modified_files:
|
|
entry += f"- {file}\n"
|
|
|
|
# Adicionar ao início do arquivo
|
|
if changelog_path.exists():
|
|
content = changelog_path.read_text()
|
|
else:
|
|
content = "# Changelog\n\nTodas as alterações notáveis neste projeto serão documentadas neste arquivo.\n"
|
|
|
|
content = content.split('\n\n', 1)[0] + '\n' + entry + '\n' + content.split('\n\n', 1)[1]
|
|
changelog_path.write_text(content)
|
|
|
|
def update_readme(processed_files: list):
|
|
"""Atualiza o README.md com informações dos documentos processados"""
|
|
readme_path = Path(__file__).parent.parent / 'README.md'
|
|
|
|
content = """# SuperBot Knowledge Base
|
|
|
|
Base de Conhecimento para o SuperBot da Descomplicar.
|
|
|
|
## Documentos Processados
|
|
|
|
| Documento | Tipo | Data | Tags |
|
|
|-----------|------|------|------|
|
|
"""
|
|
|
|
for doc in processed_files:
|
|
tags = ', '.join(doc['tags']) if isinstance(doc['tags'], list) else doc['tags']
|
|
content += f"| {doc.get('título', 'Sem título')} | {doc.get('tipo_documento', 'N/A')} | {doc.get('data_original', 'N/A')} | {tags} |\n"
|
|
|
|
content += """
|
|
## Estrutura do Projeto
|
|
|
|
- `input/`: Diretório com os PDFs originais
|
|
- `output/`: Diretório com os documentos processados em markdown
|
|
- `src/`: Código fonte
|
|
- `processors/`: Módulos de processamento
|
|
- `pdf_processor.py`: Processamento de PDFs
|
|
- `db_processor.py`: Integração com banco de dados
|
|
- `embedding_processor.py`: Geração de embeddings
|
|
"""
|
|
|
|
readme_path.write_text(content)
|
|
|
|
def main():
|
|
"""Função principal."""
|
|
# Carregar variáveis de ambiente
|
|
load_dotenv()
|
|
|
|
# Configurar diretórios
|
|
project_root = Path(__file__).parent.parent
|
|
input_dir = project_root / 'input'
|
|
output_dir = project_root / 'output'
|
|
|
|
# Criar diretórios se não existirem
|
|
input_dir.mkdir(exist_ok=True)
|
|
output_dir.mkdir(exist_ok=True)
|
|
|
|
# Inicializar processadores
|
|
db = DBProcessor()
|
|
embedding = EmbeddingProcessor()
|
|
|
|
try:
|
|
# Inicializar schema do banco de dados
|
|
print("A inicializar schema do banco de dados...")
|
|
db.init_schema()
|
|
|
|
# Lista para armazenar informações dos documentos processados
|
|
processed_docs = []
|
|
new_files = []
|
|
|
|
# Processar cada PDF no diretório de entrada
|
|
for filename in os.listdir(input_dir):
|
|
if filename.endswith('.pdf'):
|
|
input_file = os.path.join(input_dir, filename)
|
|
print(f"\nA processar ficheiro: {input_file}")
|
|
|
|
# Criar diretório de saída específico
|
|
doc_output_dir = output_dir / filename.replace('.pdf', '')
|
|
doc_output_dir.mkdir(exist_ok=True)
|
|
|
|
# Processar PDF
|
|
processor = PDFProcessor(input_file)
|
|
processor.process_content()
|
|
|
|
# Salvar em markdown
|
|
output_file = doc_output_dir / 'conteudo.md'
|
|
processor.save_markdown(str(output_file))
|
|
|
|
# Salvar metadados
|
|
metadata_file = doc_output_dir / 'metadata.json'
|
|
with open(metadata_file, 'w', encoding='utf-8') as f:
|
|
json.dump(processor.metadata, f, ensure_ascii=False, indent=2)
|
|
|
|
# Salvar no banco de dados
|
|
print("A salvar no banco de dados...")
|
|
document_id = db.save_document(
|
|
title=processor.metadata.get('título', ''),
|
|
content=processor.content,
|
|
metadata=processor.metadata,
|
|
file_path=input_file
|
|
)
|
|
print(f"Documento salvo com ID: {document_id}")
|
|
|
|
# Gerar embeddings
|
|
print("A gerar embeddings...")
|
|
embedding.update_document_embeddings(document_id)
|
|
print("Embeddings gerados com sucesso")
|
|
|
|
# Adicionar à lista de documentos processados
|
|
processed_docs.append(processor.metadata)
|
|
new_files.append(filename)
|
|
|
|
print(f"\nResultado guardado em: {doc_output_dir}")
|
|
|
|
# Atualizar documentação
|
|
if processed_docs:
|
|
update_readme(processed_docs)
|
|
update_changelog(new_files)
|
|
print("\nDocumentação atualizada com sucesso!")
|
|
|
|
except Exception as e:
|
|
print(f"Erro: {str(e)}")
|
|
|
|
if __name__ == "__main__":
|
|
main()
|