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'])

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.


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)

¿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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.