train min_count example español python gensim word2vec

min_count - Cómo calcular la similitud de la oración usando el modelo word2vec de gensim con python



word2vec gensim (10)

De acuerdo con Gensim Word2Vec , puedo usar el modelo word2vec en el paquete gensim para calcular la similitud entre 2 palabras.

p.ej

trained_model.similarity(''woman'', ''man'') 0.73723527

Sin embargo, el modelo word2vec no puede predecir la similitud de la oración. Descubrí el modelo LSI con similitud de frase en gensim, pero no parece que se pueda combinar con el modelo word2vec. La longitud del corpus de cada oración que tengo no es muy larga (menos de 10 palabras). Entonces, ¿hay formas simples de lograr el objetivo?


Como está utilizando gensim, probablemente debería usar su implementación de doc2vec. doc2vec es una extensión de word2vec al nivel de frase, oración y documento. Es una extensión bastante simple, que se describe aquí

http://cs.stanford.edu/~quocle/paragraph_vector.pdf

Gensim es agradable porque es intuitivo, rápido y flexible. ¡Lo mejor es que puedes tomar las incrustaciones de palabras preestablecidas de la página oficial de word2vec y la capa syn0 del modelo Doc2Vec de gensim queda expuesta para que puedas sembrar las incrustaciones de palabras con estos vectores de alta calidad!

GoogleNews-vectores-negativos300.bin.gz

Creo que gensim es definitivamente la herramienta más fácil (y hasta ahora para mí, la mejor) para incrustar una oración en un espacio vectorial.

Existen otras técnicas de frase a vector que la propuesta en el artículo de Le & Mikolov anterior. Socher y Manning de Stanford son sin duda dos de los investigadores más famosos que trabajan en esta área. Su trabajo se ha basado en el principio de composición: la semántica de la oración proviene de:

1. semantics of the words 2. rules for how these words interact and combine into phrases

Han propuesto algunos de esos modelos (cada vez más complejos) sobre cómo usar la composicionalidad para construir representaciones a nivel de oraciones.

2011 - despliegue autoencoder recursivo (muy comparativamente simple. Comience aquí si está interesado)

2012 - red neuronal matriz-vector

2013 (?) - red de tensores neuronales

2015 - Tree LSTM

sus documentos están todos disponibles en socher.org. Algunos de estos modelos están disponibles, pero aún recomendaría el doc2vec de gensim. Por un lado, el URAE 2011 no es particularmente poderoso. Además, viene pretratado con pesos adecuados para parafrasear datos de noticias. El código que proporciona no le permite volver a entrenar la red. Tampoco puedes intercambiar diferentes vectores de palabras, por lo que te quedas atascado con las incrustaciones previas a Word2vec de 2011 de Turian. Estos vectores ciertamente no están en el nivel de word2vec o GloVe''s.

Aún no he trabajado con Tree LSTM, ¡pero parece muy prometedor!

tl; dr Sí, use gensim''s doc2vec. ¡Pero existen otros métodos!


Este es un problema bastante desafiante que estás preguntando. Calcular la similitud de oraciones requiere construir un modelo gramatical de la oración, comprender estructuras equivalentes (por ejemplo, "caminó a la tienda ayer" y "ayer, caminó a la tienda"), encontrando similitud no solo en los pronombres y verbos, sino también en el nombres propios, encontrar co-ocurrencias / relaciones estadísticas en muchos ejemplos textuales reales, etc.

Lo más simple que podría intentar, aunque no sé qué tan bien funcionaría y no le daría los mejores resultados, sería eliminar primero todas las palabras "detener" (palabras como "the", "an ", etc. que no le dan mucho significado a la oración) y luego ejecuta word2vec en las palabras en ambas oraciones, suma los vectores en una oración, suma los vectores en la otra oración y luego encuentra la diferencia entre las sumas Al resumirlos en lugar de hacer una diferencia entre palabras, al menos no estará sujeto al orden de las palabras. Dicho esto, esto fracasará de muchas maneras y no es una buena solución de ninguna manera (aunque las buenas soluciones a este problema casi siempre implican cierta cantidad de PNL, aprendizaje automático y otras habilidades).

Entonces, la respuesta corta es, no, no hay una manera fácil de hacer esto (al menos no hacerlo bien).


Estoy usando el siguiente método y funciona bien. Primero necesita ejecutar un POSTagger y luego filtrar su oración para deshacerse de las palabras stop (determinantes, conjunciones, ...). Recomiendo TextBlob APTagger . Luego construyes una palabra2vec tomando la media de cada vector de palabra en la oración. El método n_similarity en Gemsim word2vec hace exactamente eso al permitir pasar dos conjuntos de palabras para comparar.



Hay una función de la documentation toma una lista de palabras y compara sus similitudes.

s1 = ''This room is dirty'' s3 = ''dirty and disgusting room'' distance = model.wv.n_similarity(s1.lower().split(), s2.lower().split())


He probado los métodos proporcionados por las respuestas anteriores. Funciona, pero el principal inconveniente de esto es que cuanto más largas sean las oraciones, mayor será la similitud (para calcular la similitud uso la puntuación del coseno de las dos incrustaciones medias de dos oraciones) ya que cuanto más palabras hay, más efectos semánticos positivos se agregará a la oración.

Pensé que debería cambiar de opinión y utilizar la incrustación de frases en su lugar como se estudia en este documento y this .


Me gustaría actualizar la solución existente para ayudar a las personas que van a calcular la similitud semántica de las oraciones.

Paso 1:

Cargue el modelo adecuado usando gensim y calcule los vectores de palabras para las palabras en la oración y guárdelas como una lista de palabras

Paso 2: Calcular el vector de la oración

El cálculo de la similitud semántica entre oraciones era difícil antes, pero recientemente se propuso un artículo llamado " UNA LÍNEA DE BASE SENCILLA PERO TODO PARA COMBATIR LAS OBSTRUCCIONES " que sugiere un enfoque simple al calcular el promedio ponderado de los vectores de palabras en la oración y luego eliminar las proyecciones de los vectores promedio en su primer componente principal. Aquí el peso de una palabra w es a / (a ​​+ p (w)) siendo a un parámetro yp (w) la frecuencia de palabra (estimada) llamada frecuencia inversa suave .este método funciona significativamente mejor.

Un código simple para calcular el vector de la oración usando SIF (frecuencia inversa suave) el método propuesto en el documento se ha dado here

Paso 3: usando sklearn cosine_similarity cargue dos vectores para las oraciones y calcule la similitud.

Este es el método más simple y eficiente para calcular la similitud de la oración.


Si usa word2vec, necesita calcular el vector promedio para todas las palabras en cada oración / documento y usar la similitud del coseno entre vectores:

import numpy as np from scipy import spatial index2word_set = set(model.wv.index2word) def avg_feature_vector(sentence, model, num_features, index2word_set): words = sentence.split() feature_vec = np.zeros((num_features, ), dtype=''float32'') n_words = 0 for word in words: if word in index2word_set: n_words += 1 feature_vec = np.add(feature_vec, model[word]) if (n_words > 0): feature_vec = np.divide(feature_vec, n_words) return feature_vec

Calcular similitud

s1_afv = avg_feature_vector(''this is a sentence'', model=model, num_features=300, index2word_set=index2word_set) s2_afv = avg_feature_vector(''this is also sentence'', model=model, num_features=300, index2word_set=index2word_set) sim = 1 - spatial.distance.cosine(s1_afv, s2_afv) print(sim) > 0.915479828613


Una vez que calcula la suma de los dos conjuntos de vectores de palabras, debe tomar el coseno entre los vectores, no el diff. El coseno se puede calcular tomando el producto escalar de los dos vectores normalizado. Por lo tanto, el conteo de palabras no es un factor.


puede usar el algoritmo de distancia de Word Mover. aquí hay una descripción fácil sobre WMD .

#load word2vec model, here GoogleNews is used model = gensim.models.KeyedVectors.load_word2vec_format(''../GoogleNews-vectors-negative300.bin'', binary=True) #two sample sentences s1 = ''the first sentence'' s2 = ''the second text'' #calculate distance between two sentences using WMD algorithm distance = model.wmdistance(s1, s2) print (''distance = %.3f'' % distance)

Ps: si enfrenta un error al importar la biblioteca pyemd , puede instalarlo usando el siguiente comando:

pip install pyemd