Spaces:
Sleeping
Sleeping
| import pandas as pd | |
| import numpy as np | |
| import os | |
| import json | |
| from sentence_transformers import SentenceTransformer | |
| print("🚀 Carregando modelo LOCAL (gratuito)...") | |
| # Carrega o modelo local - funciona offline! | |
| modelo = SentenceTransformer('all-MiniLM-L6-v2') | |
| def carregar_jsons_pandas(pasta): | |
| """ | |
| Carrega todos os JSONs para um DataFrame do pandas | |
| """ | |
| print(f"📂 Procurando JSONs na pasta: {pasta}") | |
| dados_lista = [] | |
| # Verifica se a pasta existe | |
| if not os.path.exists(pasta): | |
| print(f"❌ Pasta '{pasta}' não encontrada!") | |
| print("💡 Dica: Crie uma pasta chamada 'pasta_jsons' com seus arquivos JSON") | |
| return pd.DataFrame() | |
| # Lista arquivos na pasta | |
| arquivos = os.listdir(pasta) | |
| arquivos_json = [f for f in arquivos if f.endswith('.json')] | |
| if not arquivos_json: | |
| print("❌ Nenhum arquivo JSON encontrado na pasta!") | |
| return pd.DataFrame() | |
| print(f"📄 Encontrados {len(arquivos_json)} arquivos JSON") | |
| for arquivo in arquivos_json: | |
| caminho_completo = os.path.join(pasta, arquivo) | |
| try: | |
| with open(caminho_completo, 'r', encoding='utf-8') as f: | |
| conteudo_json = json.load(f) | |
| # Extrai texto para embedding | |
| texto = extrair_texto_json(conteudo_json) | |
| dados_lista.append({ | |
| 'nome_arquivo': arquivo, | |
| 'conteudo_original': str(conteudo_json), | |
| 'texto_para_embedding': texto, | |
| 'tamanho_texto': len(texto) | |
| }) | |
| print(f"✅ {arquivo} - carregado!") | |
| except Exception as e: | |
| print(f"❌ Erro em {arquivo}: {e}") | |
| # Cria DataFrame | |
| df = pd.DataFrame(dados_lista) | |
| print(f"📊 DataFrame criado com {len(df)} registros") | |
| return df | |
| def extrair_texto_json(dados_json): | |
| """ | |
| Extrai texto de um JSON para criar embeddings | |
| """ | |
| if isinstance(dados_json, dict): | |
| # Se for dicionário, junta todos os valores de texto | |
| textos = [] | |
| for key, value in dados_json.items(): | |
| if isinstance(value, (str, int, float)): | |
| textos.append(str(value)) | |
| elif isinstance(value, list): | |
| textos.extend([str(item) for item in value if isinstance(item, (str, int, float))]) | |
| return " ".join(textos) | |
| elif isinstance(dados_json, list): | |
| # Se for lista, converte todos os itens para string | |
| return " ".join([str(item) for item in dados_json]) | |
| else: | |
| # Se for outra coisa, converte para string | |
| return str(dados_json) | |
| def criar_embeddings_locais(df): | |
| """ | |
| Cria embeddings usando modelo LOCAL gratuito | |
| """ | |
| print("🔮 Criando embeddings LOCAIS...") | |
| if df.empty: | |
| print("❌ DataFrame vazio!") | |
| return df | |
| # Pega todos os textos | |
| textos = df['texto_para_embedding'].tolist() | |
| # Cria embeddings em lote (mais rápido) | |
| print("⏳ Gerando embeddings... (pode levar alguns segundos)") | |
| embeddings = modelo.encode(textos) | |
| # Adiciona ao DataFrame | |
| df['embedding'] = embeddings.tolist() | |
| df['tamanho_embedding'] = df['embedding'].apply(len) | |
| print(f"🎯 Embeddings criados para {len(df)} textos") | |
| print(f"📐 Dimensões do embedding: {embeddings.shape[1]}") | |
| return df | |
| def salvar_resultados_simples(df, nome_base='embeddings_locais'): | |
| """ | |
| Salva resultados APENAS em CSV e JSON (sem Excel) | |
| """ | |
| if df.empty: | |
| print("❌ Nada para salvar!") | |
| return | |
| # 1. CSV com embeddings como string | |
| df_csv = df.copy() | |
| df_csv['embedding_str'] = df_csv['embedding'].apply(str) | |
| # Salva CSV principal | |
| colunas_principais = ['nome_arquivo', 'texto_para_embedding', 'tamanho_texto', 'tamanho_embedding', 'embedding_str'] | |
| df_csv[colunas_principais].to_csv(f'{nome_base}.csv', index=False, encoding='utf-8') | |
| # 2. JSON com estrutura completa | |
| df[['nome_arquivo', 'embedding']].to_json(f'{nome_base}.json', orient='records', indent=2) | |
| # 3. CSV só com nomes e embeddings (mais leve) | |
| df[['nome_arquivo', 'embedding']].to_csv(f'{nome_base}_simples.csv', index=False) | |
| print(f"💾 Resultados salvos:") | |
| print(f" 📄 {nome_base}.csv (completo)") | |
| print(f" 📊 {nome_base}.json (estrutura JSON)") | |
| print(f" 📋 {nome_base}_simples.csv (apenas embeddings)") | |
| def analisar_com_pandas(df): | |
| """ | |
| Análise detalhada usando pandas | |
| """ | |
| print("\n📈 ANÁLISE DETALHADA:") | |
| print("=" * 50) | |
| # Informações básicas | |
| print(f"📊 Total de arquivos: {len(df)}") | |
| print(f"📝 Tamanho médio do texto: {df['tamanho_texto'].mean():.0f} caracteres") | |
| print(f"🎯 Dimensões do embedding: {df['tamanho_embedding'].iloc[0]}") | |
| # Estatísticas com pandas | |
| print(f"\n📋 Estatísticas dos textos:") | |
| print(df['tamanho_texto'].describe()) | |
| # Top 3 maiores textos | |
| print(f"\n🏆 Top 3 textos mais longos:") | |
| top_longs = df.nlargest(3, 'tamanho_texto')[['nome_arquivo', 'tamanho_texto']] | |
| for idx, row in top_longs.iterrows(): | |
| print(f" {row['nome_arquivo']} - {row['tamanho_texto']} chars") | |
| # Distribuição por tamanho | |
| df['categoria_tamanho'] = pd.cut(df['tamanho_texto'], | |
| bins=[0, 100, 500, 1000, float('inf')], | |
| labels=['Muito Curto (<100)', 'Curto (100-500)', | |
| 'Médio (500-1000)', 'Longo (>1000)']) | |
| print(f"\n📦 Distribuição por tamanho:") | |
| print(df['categoria_tamanho'].value_counts().sort_index()) | |
| # 🎯 PROGRAMA PRINCIPAL | |
| if __name__ == "__main__": | |
| # CONFIGURAÇÃO - MUDE AQUI PARA SUA PASTA! | |
| pasta_jsons = "pasta_json" # ⚠️ SUBSTITUA pelo caminho da SUA pasta! | |
| print("=" * 60) | |
| print("🎊 SISTEMA DE EMBEDDINGS LOCAIS (GRATUITO)") | |
| print("=" * 60) | |
| # 1. Carregar JSONs | |
| df = carregar_jsons_pandas(pasta_jsons) | |
| if not df.empty: | |
| # 2. Criar embeddings | |
| df_embeddings = criar_embeddings_locais(df) | |
| # 3. Salvar resultados (SEM Excel) | |
| salvar_resultados_simples(df_embeddings) | |
| # 4. Análise | |
| analisar_com_pandas(df_embeddings) | |
| # 5. Mostrar preview | |
| print(f"\n👀 PRÉVIA DOS DADOS:") | |
| print(df_embeddings[['nome_arquivo', 'tamanho_texto', 'tamanho_embedding']].head()) | |
| # 6. Exemplo de como usar os embeddings | |
| print(f"\n💡 EXEMPLO: Como usar os embeddings:") | |
| print(f" df = pd.read_csv('embeddings_locais.csv')") | |
| print(f" print(df.head())") | |
| else: | |
| print("❌ Não foi possível carregar os dados.") | |
| print("\n💡 SOLUÇÃO DE PROBLEMAS:") | |
| print("1. Crie uma pasta chamada 'pasta_jsons'") | |
| print("2. Coloque arquivos .json dentro dela") | |
| print("3. Execute o script novamente") | |
| print("\n✅ Processo concluído!") |