|
import os |
|
import re |
|
from pathlib import Path |
|
from llama_index.core import Document |
|
|
|
def create_single_document_with_filenames(directory_path: str) -> Document: |
|
""" |
|
Percorre a pasta informada, organiza os arquivos em estrutura de anos (YYYY) e meses (MM), |
|
gera um texto descritivo semelhante ao código anterior (sem salvar em arquivo) e retorna |
|
esse texto dentro de um objeto Document. |
|
|
|
Uso: |
|
directory_path = "documentos" |
|
doc = create_single_document_with_filenames(directory_path) |
|
documents.append(doc) |
|
""" |
|
|
|
|
|
estrutura_anos = {} |
|
|
|
docs_sem_data = [] |
|
|
|
todos_arquivos = set() |
|
|
|
|
|
for root, dirs, files in os.walk(directory_path): |
|
match_ano_mes = re.search(r"(\d{4})-(\d{2})", root) |
|
if match_ano_mes: |
|
ano = match_ano_mes.group(1) |
|
mes = match_ano_mes.group(2) |
|
|
|
if ano not in estrutura_anos: |
|
estrutura_anos[ano] = {} |
|
if mes not in estrutura_anos[ano]: |
|
estrutura_anos[ano][mes] = [] |
|
|
|
for nome_arq in files: |
|
estrutura_anos[ano][mes].append(nome_arq) |
|
todos_arquivos.add(nome_arq) |
|
else: |
|
|
|
for nome_arq in files: |
|
docs_sem_data.append(nome_arq) |
|
todos_arquivos.add(nome_arq) |
|
|
|
|
|
descricao_final = [] |
|
|
|
|
|
for ano in sorted(estrutura_anos.keys()): |
|
meses_ordenados = sorted(estrutura_anos[ano].keys()) |
|
qtd_meses = len(meses_ordenados) |
|
|
|
|
|
if qtd_meses == 1: |
|
unico_mes = meses_ordenados[0] |
|
arquivos_unico_mes = estrutura_anos[ano][unico_mes] |
|
if len(arquivos_unico_mes) == 1: |
|
nome_mes_extenso = mes_extenso(unico_mes) |
|
arquivo_unico = arquivos_unico_mes[0] |
|
descricao_final.append( |
|
f"No ano de {ano}, temos somente o mês de {nome_mes_extenso} (mês {unico_mes}), " |
|
f"outros meses não foram listados, e nessa pasta encontramos apenas " |
|
f"um manual chamado {arquivo_unico}." |
|
) |
|
|
|
continue |
|
|
|
|
|
frase_inicial = f"No ano de {ano}, temos os meses de " |
|
meses_descricao = [f"{mes_extenso(m)} (mês {m})" for m in meses_ordenados] |
|
frase_inicial += ", ".join(meses_descricao) + "." |
|
descricao_final.append(frase_inicial) |
|
|
|
for mes_ in meses_ordenados: |
|
arquivos_mes = estrutura_anos[ano][mes_] |
|
nome_mes_extenso = mes_extenso(mes_) |
|
qtd_arquivos = len(arquivos_mes) |
|
if qtd_arquivos == 1: |
|
descricao_final.append( |
|
f"Em {nome_mes_extenso} temos somente o manual chamado {arquivos_mes[0]}." |
|
) |
|
else: |
|
descricao_final.append( |
|
f"Em {nome_mes_extenso} temos {qtd_arquivos} manuais, chamados: {', '.join(arquivos_mes)}." |
|
) |
|
|
|
|
|
if docs_sem_data: |
|
docs_sem_data_unicos = list(set(docs_sem_data)) |
|
if len(docs_sem_data_unicos) == 1: |
|
descricao_final.append( |
|
f"Em nossos documentos, fora de pastas de data, temos somente este arquivo: {docs_sem_data_unicos[0]}." |
|
) |
|
else: |
|
descricao_final.append( |
|
"Em nossos documentos, fora de pastas de data, encontramos estes arquivos: " |
|
+ ", ".join(docs_sem_data_unicos) + "." |
|
) |
|
|
|
|
|
lista_geral_ordenada = sorted(todos_arquivos) |
|
descricao_final.append( |
|
"Essas são as listas de todos os documentos, manuais e organogramas que podemos " |
|
f"resolver, listar e usar para nossas respostas, esses documentos vão ser muito úteis: {', '.join(lista_geral_ordenada)}" |
|
) |
|
|
|
|
|
document_text = "\n".join(descricao_final) |
|
|
|
|
|
document = Document( |
|
text=document_text, |
|
metadata={ |
|
"description": "Lista de manuais, arquivos e documentos que podemos responder.", |
|
"file_name": "Lista de documentos", |
|
"summary": "Entre 2011 e 2024, há uma grande variedade de manuais e documentos organizados por ano e mês: alguns anos possuem apenas um mês e um único arquivo, enquanto outros registram diversos períodos, cada um com vários manuais. Adicionalmente, há alguns arquivos “soltos”, fora dessas pastas de data. No fim, existe uma listagem completa de todos os itens, cobrindo instruções bancárias, regulamentos internos e outros materiais de suporte." |
|
} |
|
) |
|
return document |
|
|
|
def mes_extenso(mes_str: str) -> str: |
|
""" |
|
Converte '07' em 'Julho', '09' em 'Setembro', etc. |
|
""" |
|
meses_dict = { |
|
"01": "Janeiro", "02": "Fevereiro", "03": "Março", |
|
"04": "Abril", "05": "Maio", "06": "Junho", |
|
"07": "Julho", "08": "Agosto", "09": "Setembro", |
|
"10": "Outubro", "11": "Novembro", "12": "Dezembro" |
|
} |
|
return meses_dict.get(mes_str, mes_str) |
|
|
|
|