es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Agrupando palabras juntas al examinar la similitud de vectores (Python)

Tengo una lista larga con el formato

mylist =[([256, 408, 147, 628], 'ezis'), ([628, 526, 236, 676], 'camera'), ([526, 876, 676, 541], 'camera'), ([567, 731, 724, 203], 'size'), ([822, 187, 256, 172], 'camera'), ([489, 628, 214, 428], 'esu'), ([648, 487, 487, 338], 'take'), ([487, 606, 338, 428], 'pictur'),.....]

La lista completa se puede encontrar en https://pastebin.com/Mn9En3r6

Donde los vectores emparejados con cada palabra en esto representan el índice único de las palabras que la rodean en una oración (es decir, el número 256 representa 'grande', etc.)

En esta lista larga solo hay 100 palabras únicas, 50 palabras reales y 50 palabras que son simplemente esas palabras reales al revés (size -> ezis)

Quiero agruparlas comparando sus valores de vector y espero que la mayoría de las palabras reales y su contraparte invertida estén emparejadas.

Idealmente, me gustaría usar la biblioteca de agrupación Sklearn (https://scikit-learn.org/stable/modules/generated/sklearn.cluster.AgglomerativeClustering.html), pero el problema que tengo es que no estoy muy seguro de cómo implementarlo.

¿Funcionaría tomar el valor de ‘vector promedio’ de cada una de estas 100 palabras y luego agruparlas juntas? Si es así, ¿cómo lo haría?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para agrupar las palabras juntas utilizando la biblioteca de agrupamiento de Sklearn, podemos utilizar el algoritmo AgglomerativeClustering. Sin embargo, antes de aplicar este algoritmo, debemos convertir la lista de vectores de palabras en un array de numpy.

    Para encontrar el valor promedio del vector de cada palabra, podemos primero crear un diccionario para almacenar los vectores de cada palabra única como claves. Luego, podemos iterar a través de la lista, calcular el valor promedio del vector para cada palabra única utilizando la función mean de NumPy y almacenarlo en una lista separada.

    Una vez que tengamos la lista de vectores promedio, podemos aplicar el algoritmo AgglomerativeClustering para agrupar las palabras en base a sus valores de vector.

    Aquí hay una implementación de ejemplo:

    import numpy as np
    from sklearn.cluster import AgglomerativeClustering
    
    mylist =[([256, 408, 147, 628], 'ezis'), ([628, 526, 236, 676], 'camera'), ([526, 876, 676, 541], 'camera'), ([567, 731, 724, 203], 'size'), ([822, 187, 256, 172], 'camera'), ([489, 628, 214, 428], 'esu'), ([648, 487, 487, 338], 'take'), ([487, 606, 338, 428], 'pictur')]
    
    # Convertir la lista de vectores de palabras a un array de numpy
    word_vectors = np.array([vec for vec, word in mylist])
    
    # Crear un diccionario para almacenar los vectores de cada palabra única
    word_dict = {}
    for vec, word in mylist:
        if word in word_dict:
            word_dict[word].append(vec)
        else:
            word_dict[word] = [vec]
    
    # Calcular el valor promedio del vector para cada palabra única
    avg_vectors = []
    for word, vectors in word_dict.items():
        avg_vec = np.mean(vectors, axis=0)
        avg_vectors.append(avg_vec)
    
    # Aplicar el agrupamiento aglomerativo
    clustering = AgglomerativeClustering(n_clusters=2).fit(avg_vectors)
    clusters = clustering.labels_
    
    # Imprimir los clusters
    for i, word in enumerate(word_dict.keys()):
        print(word, clusters[i])
    

    En esta implementación de ejemplo, hemos establecido el número de clusters en 2, pero puedes ajustarlo según tu caso de uso específico.

Comments are closed.