chatbot-carometro-staging / document_creator.py
leandroaraujodev's picture
teste funcionalidade de autenticação
d368963
raw
history blame
5.64 kB
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)
"""
# Dicionário {ano: {mes: [arquivos]}}
estrutura_anos = {}
# Lista para arquivos fora do padrão YYYY-MM
docs_sem_data = []
# Conjunto para todos os arquivos (para listagem geral no final)
todos_arquivos = set()
# Percorre o diretório de forma recursiva
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:
# Se a pasta não segue o padrão YYYY-MM, consideramos esses arquivos "sem data"
for nome_arq in files:
docs_sem_data.append(nome_arq)
todos_arquivos.add(nome_arq)
# Montamos o texto final, seguindo a lógica dos "casos"
descricao_final = []
# Organiza a lista de anos e percorre
for ano in sorted(estrutura_anos.keys()):
meses_ordenados = sorted(estrutura_anos[ano].keys())
qtd_meses = len(meses_ordenados)
# Caso 1: Apenas um mês e um arquivo
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}."
)
# pula para o próximo ano
continue
# Caso 2: Mais meses ou mais arquivos em algum mês
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)}."
)
# Caso 3: Arquivos sem data
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 global de todos os arquivos
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)}"
)
# Une o texto final
document_text = "\n".join(descricao_final)
# Cria e retorna um Document com esse texto
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)