File size: 7,397 Bytes
309ed7a
c09a626
f5bf61e
309ed7a
37f1796
c09a626
37f1796
 
f0ecea4
 
 
 
 
37f1796
f5bf61e
4a9dbfa
 
f5bf61e
 
f0ecea4
f5bf61e
4a9dbfa
 
 
 
f0ecea4
 
 
 
 
4a9dbfa
 
 
f0ecea4
4a9dbfa
 
 
f5bf61e
f0ecea4
f5bf61e
4a9dbfa
f5bf61e
f0ecea4
c09a626
07db390
6e209ac
1c6da15
9d4bb80
 
 
 
1c6da15
309ed7a
1c6da15
9d4bb80
1c6da15
 
07db390
 
1c6da15
309ed7a
1c6da15
9d4bb80
c09a626
9d4bb80
9375a9e
 
 
 
 
 
 
42a034b
9375a9e
 
 
 
42a034b
9d4bb80
42a034b
 
 
 
9d4bb80
42a034b
 
 
9375a9e
9d4bb80
 
 
42a034b
9d4bb80
 
 
 
9375a9e
 
a4788b3
 
64c84a7
1568785
a4788b3
64c84a7
 
 
1568785
 
 
 
64c84a7
1568785
 
425d4e3
64c84a7
425d4e3
 
64c84a7
 
425d4e3
 
 
 
64c84a7
 
 
1568785
425d4e3
64c84a7
a4788b3
425d4e3
1568785
 
 
 
425d4e3
64c84a7
1568785
 
a4788b3
 
 
425d4e3
a4788b3
 
64c84a7
1568785
64c84a7
425d4e3
 
 
 
64c84a7
425d4e3
 
64c84a7
 
 
 
 
 
425d4e3
a4788b3
 
 
 
 
1568785
 
425d4e3
1568785
425d4e3
1568785
a4788b3
 
1568785
a4788b3
425d4e3
a4788b3
 
 
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
# functions.py
import json
import requests
import matplotlib.pyplot as plt  # Añadido import <button class="citation-flag" data-index="1">
from datasets import load_dataset

# Cargar modalidades y tareas (ahora devuelve una lista de tareas) <button class="citation-flag" data-index="1">
def cargar_modalidades_tareas():
    try:
        with open("modalidades_tareas.json", "r") as file:
            return json.load(file)
    except FileNotFoundError:
        return {}  # Devolver diccionario vacío si no existe

def actualizar_modalidades_tareas_desde_huggingface():
    MODALIDADES = ["text-classification", "image-classification", "speech-recognition"]
    MODALIDAD_TAREAS = cargar_modalidades_tareas()  # Cargar JSON existente
    
    for task in MODALIDADES:
        response = requests.get(f"https://huggingface.co/api/datasets?task={task}&full=true&limit=5").json()
        
        for dataset in response:
            dataset_id = dataset["id"]
            dataset_info = requests.get(f"https://huggingface.co/api/datasets/{dataset_id}").json()
            
            # Añadir datos al JSON
            if task not in MODALIDAD_TAREAS:
                MODALIDAD_TAREAS[task] = {
                    "nombre": task.replace("-", " ").capitalize(),
                    "columnas": list(dataset_info.get("features", {}).keys()),
                    "datasets": {}
                }
            
            MODALIDAD_TAREAS[task]["datasets"][dataset_id] = {
                "columnas": list(dataset_info.get("features", {}).keys()),
                "licencia": dataset.get("license", "unknown")
            }
    
    # Guardar JSON con permisos explícitos <button class="citation-flag" data-index="2">
    with open("modalidades_tareas.json", "w") as file:
        json.dump(MODALIDAD_TAREAS, file, indent=4)
    
    return list(MODALIDAD_TAREAS.keys())  # Devolver lista de tareas actualizadas

# Generar gráfica de barras
def generar_grafica_barras(tareas_seleccionadas, MODALIDAD_TAREAS):
    try:
        conteo = {}
        for modalidad, datos in MODALIDAD_TAREAS.items():
            tareas_modalidad = datos["tareas"].keys()
            conteo[modalidad] = len([t for t in tareas_seleccionadas if t in tareas_modalidad])
        
        # Crear gráfica con matplotlib
        fig, ax = plt.subplots(figsize=(10, 6))
        ax.barh(list(conteo.keys()), list(conteo.values()), color='skyblue')
        ax.set_xlabel('Cantidad de Tareas Seleccionadas')
        ax.set_ylabel('Modalidades')
        ax.set_title('Distribución de Tareas por Modalidad')
        ax.invert_yaxis()
        return fig
    
    except Exception as e:
        raise ValueError(f"Error al generar gráfica: {str(e)}")

# Generar encabezado
def generar_encabezado(tareas_seleccionadas):
    MODALIDAD_TAREAS = cargar_modalidades_tareas()
    
    if not tareas_seleccionadas:
        raise ValueError("Selecciona al menos una tarea.")
    
    columnas = ["id"]
    columnas_modulos = set()
    
    for tarea in tareas_seleccionadas:
        for modalidad, datos in MODALIDAD_TAREAS.items():
            if tarea in datos["tareas"]:
                # Añadir columnas generales de la modalidad
                for col in datos["columnas_generales"]:
                    if col not in columnas_modulos:
                        columnas.append(col)
                        columnas_modulos.add(col)
                # Añadir columnas específicas de la tarea
                for col in datos["tareas"][tarea]:
                    if col not in columnas_modulos:
                        columnas.append(col)
                        columnas_modulos.add(col)
    
    # Ordenar columnas: inputs → outputs → labels
    columnas_ordenadas = ["id"] + sorted(
        columnas[1:],
        key=lambda x: (
            "input" in x,
            "output" in x,
            "label" in x
        )
    )
    
    return ",".join(columnas_ordenadas)

# Buscar datasets usando tags oficiales de HuggingFace
def buscar_datasets(tareas_seleccionadas, filtro_tamaño, filtro_licencia):
    try:
        # Usar tags oficiales para búsqueda precisa
        query = "+".join([f"task:{tarea}" for tarea in tareas_seleccionadas])
        url = f"https://huggingface.co/api/datasets?search={query}&sort=downloads"
        response = requests.get(url)
        response.raise_for_status()
        datasets = response.json()
        
        # Filtrar datasets útiles
        datasets_utiles = []
        for dataset in datasets:
            try:
                # Verificar licencia y tamaño
                if filtro_licencia and dataset.get("license", "").lower() != filtro_licencia:
                    continue
                if filtro_tamaño and dataset.get("size_categories", "").lower() != filtro_tamaño:
                    continue
                
                # Verificar columnas relevantes
                dataset_info = requests.get(f"https://huggingface.co/api/datasets/{dataset['id']}").json()
                if "features" in dataset_info:
                    datasets_utiles.append(
                        (dataset['id'], f"{dataset['id']} ({dataset['tags']}) - {dataset['description']}")
                    )
            
            except requests.exceptions.RequestException:
                continue
        
        return datasets_utiles
    
    except Exception as e:
        raise ValueError(f"Error al buscar datasets: {str(e)}")


# Generar dataset con mapeo dinámico de columnas
def generar_dataset(encabezado, datasets_seleccionados, pagina_actual=1, filas_por_pagina=5):
    try:
        columnas = encabezado.split(",")
        filas = []
        
        for dataset_id in datasets_seleccionados:
            try:
                dataset = load_dataset(dataset_id, split="train")
                features = dataset.features
                
                # Mapear columnas automáticamente
                mapeo = {}
                for col in columnas:
                    if col == "id":
                        mapeo[col] = lambda idx: f"id_{idx}"
                    elif col in features:
                        mapeo[col] = lambda fila, c=col: str(fila[c])
                    else:
                        # Buscar columna alternativa (ej. 'text' para 'text_input')
                        columna_alternativa = next(
                            (k for k in features if col.split("_")[0] in k),
                            "valor_default"
                        )
                        mapeo[col] = lambda fila, c=columna_alternativa: str(fila.get(c, "N/A"))
                
                inicio = (pagina_actual - 1) * filas_por_pagina
                fin = pagina_actual * filas_por_pagina
                
                for i, fila in enumerate(dataset[inicio:fin]):
                    valores = []
                    for col in columnas:
                        if col == "id":
                            valores.append(mapeo[col](i))
                        else:
                            valores.append(mapeo[col](fila))
                    filas.append(",".join(valores))
            
            except Exception as e:
                filas.append(f"Error en {dataset_id}: {str(e)}")
        
        return "\n".join([encabezado] + filas)
    
    except Exception as e:
        raise ValueError(f"Error al generar el dataset: {str(e)}")