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.

¿Existe alguna manera de utilizar embedding pre-entrenados con Tf-Idf en tensorflow?

Estoy utilizando la implementación por defecto y básica de Clasificación de Texto como sigue:



tokenizer = Tokenizer(num_words=tamaño_vocabulario, filters=filtros) tokenizer.fit_on_texts(list(train_X)) train_X = tokenizer.texts_to_sequences(train_X) val_X = tokenizer.texts_to_sequences(val_X) train_X = pad_sequences(train_X, maxlen=longitud_maxima) val_X = pad_sequences(val_X, maxlen=longitud_maxima) def obtener_coeficientes(palabra,*arr): return palabra, np.asarray(arr, dtype='float32') #Para cargar el Embedding embeddings_index = dict(obtener_coeficientes(*o.split(" ")) for o in open(ARCHIVO_EMBEDDING)) todos_embs = np.stack(embeddings_index.values()) media_emb, desviacion_emb = todos_embs.mean(), todos_embs.std() dimension_emb = todos_embs.shape[1] indice_palabra = tokenizer.word_index tamaño_vocabulario = min(tamaño_vocabulario, len(indice_palabra)) matriz_embedding = np.random.normal(media_emb, desviacion_emb, (tamaño_vocabulario, dimension_emb)) # tamaño_vocabulario era nb_words for palabra, indice in indice_palabra.items(): if indice >= tamaño_vocabulario: continue vector_embedding = embeddings_index.get(palabra) if vector_embedding is not None: matriz_embedding[indice] = vector_embedding

Funciona bien, pero ¿hay alguna manera de utilizar texts_to_matrix, donde hay opciones como binario, tfidf, count, etc.? ¿Es posible que pueda usarlos con los Embeddings existentes?

Una posible forma podría ser utilizar un modelo de entrada múltiple y luego concatenar las dos entradas en un solo lugar. ¿Aparte de eso, hay alguna otra forma posible?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible utilizar la función texts_to_matrix con embeddings existentes. La función texts_to_matrix puede recibir un parámetro opcional llamado mode, el cual te permite elegir cómo representar cada palabra en el texto de entrada como un vector.

    Para utilizar embeddings pre-entrenados con texts_to_matrix, puedes establecer el valor de mode en count o binary, y luego multiplicar la matriz resultante con la matriz de embeddings pre-entrenados.

    Por ejemplo, para utilizar el modo binary con embeddings pre-entrenados, puedes modificar el código de la siguiente manera:

    tokenizer = Tokenizer(num_words=vocab_size)
    tokenizer.fit_on_texts(list(train_X))
    train_X = tokenizer.texts_to_matrix(train_X, mode='binary')
    val_X = tokenizer.texts_to_matrix(val_X, mode='binary')
    
    # Obtener los embeddings pre-entrenados
    embeddings_index = dict(get_coefs(*o.split(" ")) for o in open(EMBEDDING_FILE))
    all_embs = np.stack(embeddings_index.values())
    emb_mean, emb_std = all_embs.mean(), all_embs.std()
    embed_dim = all_embs.shape[1]
    
    # Crear la matriz de embeddings
    embedding_matrix = np.zeros((len(tokenizer.word_index) + 1, embed_dim))
    for word, i in tokenizer.word_index.items():
        embedding_vector = embeddings_index.get(word)
        if embedding_vector is not None:
            # Las palabras que no se encuentren en el índice de embeddings serán todos ceros.
            embedding_matrix[i] = embedding_vector
    
    # Aplicar los embeddings pre-entrenados
    train_X_embed = np.dot(train_X, embedding_matrix)
    val_X_embed = np.dot(val_X, embedding_matrix)
    

    Ten en cuenta que en este ejemplo, las llamadas a texts_to_sequences y pad_sequences han sido reemplazadas por texts_to_matrix. La matriz binaria resultante es luego multiplicada con la matriz de embeddings pre-entrenados.

    Otros modos como tfidf también pueden ser utilizados de manera similar, multiplicando la matriz resultante con la matriz de embeddings pre-entrenados.

    Además del enfoque de texts_to_matrix, también es posible utilizar un modelo de múltiples entradas y concatenar las entradas como una opción viable.

Comments are closed.