File size: 5,586 Bytes
d4a00b2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
#!/usr/bin/env python3
"""
Script para diversificar instruções em um dataset de treinamento.

Uso:
    python diversify_instructions.py --input dataset.jsonl --output dataset_diversified.jsonl
"""

import json
import argparse
import random
from typing import List, Dict

# Variações de instruções para EDA
INSTRUCTION_VARIATIONS = [
    "Realize uma Análise Exploratória de Dados (EDA) completa seguindo OBRIGATORIAMENTE os critérios estabelecidos.",
    "Analise os dados fornecidos e realize uma EDA completa seguindo os critérios estabelecidos.",
    "Faça uma Análise Exploratória de Dados seguindo OBRIGATORIAMENTE os critérios estabelecidos.",
    "Realize uma análise exploratória completa dos dados seguindo os critérios estabelecidos.",
    "Execute uma EDA detalhada dos dados fornecidos seguindo OBRIGATORIAMENTE os critérios estabelecidos.",
    "Analise exploratoriamente o dataset seguindo os padrões estabelecidos.",
    "Realize uma Análise Exploratória de Dados completa conforme os critérios estabelecidos.",
    "Faça uma análise exploratória detalhada dos dados seguindo OBRIGATORIAMENTE os critérios estabelecidos.",
    "Analise os dados de forma exploratória seguindo os critérios estabelecidos.",
    "Realize uma EDA completa dos dados fornecidos seguindo OBRIGATORIAMENTE os critérios estabelecidos.",
    "Execute uma Análise Exploratória de Dados seguindo os critérios estabelecidos.",
    "Faça uma análise exploratória completa seguindo OBRIGATORIAMENTE os critérios estabelecidos.",
    "Analise exploratoriamente os dados seguindo os padrões estabelecidos.",
    "Realize uma EDA detalhada seguindo OBRIGATORIAMENTE os critérios estabelecidos.",
    "Execute uma análise exploratória completa dos dados seguindo os critérios estabelecidos.",
]


def diversify_instructions(input_file: str, output_file: str, variations: List[str] = None) -> Dict:
    """
    Diversifica as instruções em um dataset.
    
    Args:
        input_file: Caminho do arquivo de entrada
        output_file: Caminho do arquivo de saída
        variations: Lista de variações de instruções (opcional)
    
    Returns:
        Estatísticas da diversificação
    """
    if variations is None:
        variations = INSTRUCTION_VARIATIONS
    
    examples = []
    
    # Ler exemplos
    print(f"📖 Lendo dataset: {input_file}")
    with open(input_file, 'r', encoding='utf-8') as f:
        for line in f:
            if line.strip():
                examples.append(json.loads(line))
    
    print(f"✅ {len(examples)} exemplos carregados")
    
    # Diversificar instruções
    print(f"🔄 Diversificando instruções com {len(variations)} variações...")
    
    stats = {
        'total': len(examples),
        'original_instructions': set(),
        'new_instructions': set(),
        'distribution': {}
    }
    
    for ex in examples:
        original_instruction = ex.get('instruction', '')
        stats['original_instructions'].add(original_instruction)
        
        # Selecionar variação aleatória
        new_instruction = random.choice(variations)
        ex['instruction'] = new_instruction
        
        stats['new_instructions'].add(new_instruction)
        stats['distribution'][new_instruction] = stats['distribution'].get(new_instruction, 0) + 1
    
    # Salvar dataset diversificado
    print(f"💾 Salvando dataset diversificado: {output_file}")
    with open(output_file, 'w', encoding='utf-8') as f:
        for ex in examples:
            f.write(json.dumps(ex, ensure_ascii=False) + '\n')
    
    print(f"✅ Dataset salvo com sucesso!")
    
    return stats


def print_stats(stats: Dict):
    """Imprime estatísticas da diversificação."""
    print("\n" + "=" * 80)
    print("ESTATÍSTICAS DA DIVERSIFICAÇÃO")
    print("=" * 80)
    print(f"Total de exemplos: {stats['total']}")
    print(f"Instruções originais únicas: {len(stats['original_instructions'])}")
    print(f"Instruções novas únicas: {len(stats['new_instructions'])}")
    print(f"Diversidade: {len(stats['new_instructions'])/stats['total']*100:.1f}%")
    print()
    
    print("Distribuição das instruções:")
    for instruction, count in sorted(stats['distribution'].items(), key=lambda x: x[1], reverse=True):
        percentage = (count / stats['total']) * 100
        print(f"  • {count:4d} ({percentage:5.1f}%): {instruction[:60]}...")
    print()


def main():
    parser = argparse.ArgumentParser(
        description='Diversifica instruções em um dataset de treinamento'
    )
    parser.add_argument(
        '--input',
        type=str,
        required=True,
        help='Arquivo de entrada (JSONL)'
    )
    parser.add_argument(
        '--output',
        type=str,
        required=True,
        help='Arquivo de saída (JSONL)'
    )
    parser.add_argument(
        '--seed',
        type=int,
        default=42,
        help='Seed para reprodutibilidade (padrão: 42)'
    )
    
    args = parser.parse_args()
    
    # Definir seed para reprodutibilidade
    random.seed(args.seed)
    
    # Diversificar
    stats = diversify_instructions(args.input, args.output)
    
    # Imprimir estatísticas
    print_stats(stats)
    
    print("=" * 80)
    print("✅ DIVERSIFICAÇÃO CONCLUÍDA!")
    print("=" * 80)
    print(f"\nArquivo gerado: {args.output}")
    print("\n⚠️ IMPORTANTE: Revise alguns exemplos para garantir que a diversificação")
    print("   não afetou a qualidade ou coerência dos dados.")


if __name__ == "__main__":
    main()