File size: 6,921 Bytes
38cac35
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
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!")