codificacionNLP / app.py
Rajor78's picture
Update app.py
7bbf29e verified
import pandas as pd
from sentence_transformers import SentenceTransformer
from sklearn.cluster import DBSCAN
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
import gradio as gr
import io
# Cargar el modelo de embeddings
modelo = SentenceTransformer('all-MiniLM-L6-v2')
# Función para realizar el clustering de las frases
def obtener_categorias_dinamicas(frases, umbral_similitud=0.5):
# Codificar las frases en vectores (embeddings)
embeddings = modelo.encode(frases)
# Realizar clustering con DBSCAN (puedes cambiar el modelo de clustering si lo prefieres)
clustering = DBSCAN(eps=0.5, min_samples=2, metric='cosine').fit(embeddings)
# Asignar una categoría para cada frase según el cluster al que pertenece
etiquetas = clustering.labels_
# Agrupar las frases según sus etiquetas (clusters)
categorias = {}
for i, etiqueta in enumerate(etiquetas):
if etiqueta == -1:
categoria = "Sin grupo" # Las que no tienen un grupo asignado (ruido)
else:
categoria = f"Categoría {etiqueta + 1}"
if categoria not in categorias:
categorias[categoria] = []
categorias[categoria].append(frases[i])
# Ahora, se asigna cada frase a las categorías con similitud suficiente
categorias_frases = []
for frase in frases:
# Calcular la similitud con todas las categorías
frase_embedding = modelo.encode([frase])
# Listar las categorías que tienen una alta similitud con la frase
categorias_relevantes = []
for categoria, frases_grupo in categorias.items():
# Obtener la media de los embeddings del grupo
grupo_embeddings = modelo.encode(frases_grupo)
centro_grupo = np.mean(grupo_embeddings, axis=0)
# Calcular la similitud entre la frase y el centro del grupo
similitud = cosine_similarity(frase_embedding, [centro_grupo])[0][0]
# Si la similitud supera el umbral, asignamos la categoría
if similitud > umbral_similitud:
categorias_relevantes.append(categoria)
# Si no hay categorías relevantes, asignamos "Sin grupo"
if not categorias_relevantes:
categorias_relevantes.append("Sin grupo")
categorias_frases.append(";".join(categorias_relevantes))
# Crear un DataFrame para mostrar el resultado
resultados = pd.DataFrame({
'Frase': frases,
'Categorías': categorias_frases
})
# Guardar los resultados en un archivo Excel en memoria (para devolverlo en Gradio)
output = io.BytesIO() # Buffer en memoria para escribir el archivo Excel
resultados.to_excel(output, index=False, encoding='utf-8')
output.seek(0) # Volver al principio del archivo para que Gradio pueda leerlo
return output
# Función para cargar y procesar el archivo Excel
def procesar_excel(archivo):
df = pd.read_excel(archivo)
# Asumir que el archivo tiene una columna llamada "Frase"
frases = df['Frase'].tolist()
return obtener_categorias_dinamicas(frases)
# Crear la interfaz de Gradio
iface = gr.Interface(
fn=procesar_excel,
inputs=gr.File(label="Cargar archivo Excel con frases"),
outputs=gr.File(label="Descargar archivo Excel codificado") # Cambiar el output a archivo
)
iface.launch()