Predecir una palabra usando el modelo Word2vec

20

Dada una frase: "Cuando abro el ?? puerta se empieza a calentarse de forma automática"

Me gustaría obtener la lista de posibles palabras en ?? con una probabilidad

El concepto básico utilizado en el modelo word2vec es "predecir" una palabra dado el contexto circundante.

Una vez que se construye el modelo, ¿cuál es la operación correcta de vectores de contexto para realizar mi tarea de predicción en nuevas oraciones?

¿Es simplemente una suma lineal?

model.most_similar(positive=['When','I','open','the','door','it','starts' ,'heating','automatically'])
DED
fuente
Implementé el algoritmo anterior y encontré una pregunta: ¿Por qué se usa softmax? Permítame mostrarle un ejemplo de dos funciones de normalización: def softmax (w, t = 1.0): # Fuente: gist.github.com/stober/1946926 e = np.exp (w / t) return e / np.sum ( e) normalización def (w): retorno w / np.sum (w) a = np.array ([. 0002, .0001, .01, .03]) normalización de impresión (a) print softmax (a, t = 1 ) Comparemos las salidas: [0.00496278 0.00248139 0.24813896 0.74441687] [0.24752496 0.24750021 0.24996263 0.25501221] Como podemos ver, softmax da .03 aproximadamente la misma probabilidad en comparación con .0001 (que es

Respuestas:

9

Word2vec funciona en dos modelos CBOW y skip-gram. Tomemos el modelo CBOW, ya que su pregunta va de la misma manera que predice la palabra objetivo, dadas las palabras circundantes.

Básicamente, el modelo desarrolla matrices de ponderación de entrada y salida, que dependen de las palabras de contexto de entrada y la palabra de destino de salida con la ayuda de una capa oculta. Por lo tanto, la retropropagación se utiliza para actualizar los pesos cuando la diferencia de error entre el vector de salida pronosticado y la matriz de salida actual.

Básicamente hablando, la predicción de la palabra objetivo a partir de palabras de contexto dadas se usa como una ecuación para obtener la matriz de peso óptima para los datos dados.

Para responder a la segunda parte, parece un poco complejo que solo una suma lineal.

  1. Obtenga todos los vectores de palabras de palabras de contexto
  2. Promediarlos para descubrir el vector hde tamaño de capa ocultaNx1
  3. Obtenga la matriz de salida syn1( word2vec.co gensim) que es de tamañoVxN
  4. Multiplicar syn1por h, el vector resultante será de ztamañoVx1
  5. Calcule el vector de probabilidad y = softmax(z)con el tamaño Vx1, donde la probabilidad más alta denota la representación única de la palabra objetivo en vocabulario. Vdenota el tamaño del vocabulario y Ndenota el tamaño del vector incrustado.

Fuente: http://cs224d.stanford.edu/lecture_notes/LectureNotes1.pdf

Actualización: los modelos de memoria a corto y largo plazo actualmente están haciendo un gran trabajo al predecir las siguientes palabras. Los modelos seq2seq se explican en el tutorial de tensorflow . También hay una publicación de blog sobre generación de texto.

yazhi
fuente
Gracias ! ¿Conoces alguna implementación de esto? (como parte de gensim, por ejemplo). De lo contrario, no parece demasiado complicado de calcular.
DED
Hola, ¿podría darme más detalles sobre cómo recuperar la matriz de salida (syn1 en su ejemplo) del modelo de incrustación w2v entrenado? Creo que el w2v dejó caer la matriz de salida cuando terminé el entrenamiento.
Charles Chow
Según mi entendimiento, su respuesta a la segunda pregunta es reconstruir la matriz de salida, ¿es correcto?
Charles Chow
1
Creo que vale la pena señalar que esto no funciona como un clasificador de secuencia. El orden de las palabras se ignora.
mostrar
Se podría obtener la matriz de salida syn1simplemente guardando el modelo. sí, se ignora el orden, para la aplicación uno podría ir con el modelo seq2seq basado en LSTM.
yazhi
4

La predicción de palabras faltantes se ha agregado como una funcionalidad en la última versión de Word2Vec. Por supuesto, su oración debe coincidir con la sintaxis de entrada del modelo de Word2Vec utilizada para entrenar el modelo (letras minúsculas, palabras de detención, etc.)

Uso para predecir las 3 palabras principales para "¿Cuándo abro? Puerta":

print(model.predict_output_word(['When','I','open','door']), topn = 3)
Christof Henkel
fuente
¿Cómo sabía que centerestaba entre la tercera y la cuarta palabra? Eso no tiene sentido para mí. Me imagino que solo se pueden poner palabras de contexto de números pares y seleccionaría la palabra entre floor(len(n)/2))yfloor(len(n)/2))+1
bmc