init: scripts diversos (crawlers, conversores, scrapers)
This commit is contained in:
158
kb-processor/src/process_pdf.py
Executable file
158
kb-processor/src/process_pdf.py
Executable file
@@ -0,0 +1,158 @@
|
||||
#!/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()
|
||||
Reference in New Issue
Block a user