¿Cómo genera fastText un vector para una palabra que no está en el modelo pre-entrenado?

fastText puede generar un vector para una palabra que no está en el modelo pre-entrenado porque construye el vector para una palabra a partir de vectores de n-gramos que constituyen una palabra, el proceso de entrenamiento entrena n-gramos, no palabras completas ( aparte de esto diferencia clave, es exactamente lo mismo que el modelo Word2vec ).

Entonces, incluso si una palabra no está presente en el corpus, aún puede construir un vector para esa palabra agregando los n-gramos que constituyen una palabra. Dado que la elección de un vector para n-gramos es una función hash, siempre encuentra un vector para un n-gramo.

Por ejemplo, si entrenamos en un corpus de juguete de prueba de solo, digamos, 7 palabras …

Tienen un perro feliz y de buen comportamiento.

Y si agregamos una sola declaración de impresión en la fuente de texto rápido donde las palabras se dividen en n-gramos y se vuelven a compilar, podemos ver que, para la siguiente ejecución de entrenamiento no supervisada …

skipgram de texto rápido -input train.txt -output model -dim 10 -minCount 1

Obtenemos la salida a continuación. La configuración predeterminada es dividir en n-gramos de tamaño mínimo 3 y tamaño máximo 6 ( podemos controlar este parámetro, que es de valor en algunas aplicaciones ).

Podemos ver, por ejemplo, que el n-gramo “hav” en la palabra “tener” comparte el mismo n-gramo que en el “hav” en la palabra “comportarse” ( el valor hash es 1054492 )

Para ver cómo construiría un vector para una palabra sin vocabulario, entrenémoslo nuevamente, limitando el número de cubos hash a 10 (el valor predeterminado es 2 millones ).

skipgram de texto rápido -input train.txt -output model -dim 10 -minCount 1 -output model -bucket 10

Podemos ver claramente que muchos n-gramos tienen cuernos de zapato en el mismo cubo ( no elegiríamos un tamaño de cubo tan pequeño en aplicaciones reales; en todo caso, podríamos aumentar el valor predeterminado de 200,000 ).

Ahora, si tratamos de generar un vector para la palabra mal escrita “comportarse”, que no estaba en el corpus original, podemos ver a continuación que todavía puede construir un vector, ya que divide los n-gramos que constituyen “comportamiento” en el 10 cubos existentes y resume esos vectores para generar vectores para “comportarse”.

fasttext print-vectors model.bin

Del mismo modo, para una palabra como “quora”, donde ninguno de los n-gramos que lo constituyen estaban presentes en el corpus original …

Esta capacidad de fastText para generar vectores a partir de sus n-gramas constituyentes podría explotarse para realizar la corrección léxica o para elegir variantes léxicas que son superiores a la forma tradicional de hacerlo con métodos de distancia de edición ( por ejemplo, la distancia de Levenshtein ), donde el contexto de la palabra circundante es no incluido en el factor. Dado que fastText es exactamente el mismo que el modelo de Word2vec desde el punto de vista de la capacitación ( aparte de tirar de vectores de n-gramas, en oposición a los vectores de palabras ), podemos elegir el parámetro de ventana de vecindario para decidir el nivel de relación semántica que queremos tener al hacer la corrección léxica.

  • Por ejemplo, fastText entrenado en un corpus con solo 0 vecinos ( es decir, cada palabra es una línea en sí misma ) funcionará de manera muy similar a los métodos tradicionales de distancia de edición.
  • Cuando se entrena con una ventana de vecindario de, digamos, 5, entonces, cuando el usuario escribe una palabra mal escrita, no solo obtendríamos variantes léxicas sino incluso palabras semánticamente relacionadas. Por ejemplo, escribir mal la palabra “feynman” como “feynmann” generará “quantum_electrodynamics” como un vecino además de la palabra correctamente escrita “feynman”.

A pesar del hecho de que un vector de palabras solo se compone de sumar los vectores de n-gramos que constituyen una palabra, hay información posicional incrustada en el vector resultante debido a la naturaleza telescópica de n-gramos ( por ejemplo, <do, <dot, <dote para la palabra dote ), lo que significa que el vector para la droga “zyrtec” no es el mismo que el vector para la palabra con el tipo “zrytec”, simplemente porque los n-gramos que constituyen ambos vectores son muy diferentes, como se ve a continuación.

El lanzamiento de fastText tiene un par de modelos de entrenamiento no supervisados ​​(omisión de gramo y bolsa continua de palabras; alimentación de texto y obtención de vectores como salida) para la generación de vectores de palabras, así como un método supervisado de clasificación de texto (alimentamos en oraciones con etiquetas asignadas a ellos en el entrenamiento, y luego, durante las pruebas, le damos una oración y genera una etiqueta para ello). Esto puede inducir a error si ejecutamos directamente la versión binaria; podríamos suponer que es un modelo supervisado.

Los dos enlaces de papel que describen los modelos no supervisados ​​y supervisados:

[1607.04606] Enriqueciendo vectores de palabras con información de subpalabras

[1607.01759] Bolsa de trucos para una clasificación de texto eficiente

Ambos modelos están presentes en una versión binaria, como se ve en las opciones a continuación.

Enlace de fuente fastText C ++ en Github

Para examinar la vecindad semántica de los vectores fastText, podemos usar convertvec (por ejemplo, convertvec txt2bin fasttext_mode.vec w2v_vector.bin) y la herramienta “distancia” en la cadena de herramientas word2vec.

Fuente de Word2vec

Por cada palabra desconocida obtendrá el vector que, por cierto, es el mismo que un vector “nulo” para una palabra vacía.

Es muy fácil de verificar ejecutando un pequeño experimento:

[correo electrónico protegido] : ~ $ echo “__1 uno dos tres”> train.txt
[correo electrónico protegido] : ~ $ ./fasttext supervisado -input train.txt -output model -dim 10 -label __
Leer 0 millones de palabras
Cantidad de palabras: 4
Número de etiquetas: 1
Progreso: 100.0% palabras / seg / hilo: 47749 lr: 0.000000 pérdida: 0.000000 eta: 0h0m h-14m
[correo electrónico protegido] : ~ $ ./fasttext print-vectors model.bin
uno
-0.075105 0.022646 -0.073409 -0.042747 -0.021919 0.0027805 0.048368 -0.042158 0.038487 0.013201
dos
-0.041003 -0.0012153 0.0037751 0.0032511 -0.066867 -0.011794 0.018901 -0.014351 -0.0065945 -0.074097

-0.067216 -0.03303 -0.084756 -0.065095 -0.09254 -0.006517 0.034823 -0.086659 -0.022044 -0.06692
quora
-0.067216 -0.03303 -0.084756 -0.065095 -0.09254 -0.006517 0.034823 -0.086659 -0.022044 -0.06692

More Interesting

¿Cuál es el beneficio de utilizar la agrupación promedio en lugar de la agrupación máxima?

Si, en el futuro, los robots / IA se vuelven comunes en los hogares, ¿cuál es el lenguaje de programación más probable en el que se escribirán?

¿Qué funciona mejor, un ANN con miles de unidades por capa pero solo docenas de capas o uno con docenas de unidades por capa, pero cientos de capas?

¿Cuál es la importancia de las redes residuales profundas?

Cómo comenzar con el aprendizaje de múltiples núcleos

¿Cuáles son las mejores bibliotecas de redes neuronales de Python y Java con soporte multi gpu y multiplataforma?

¿De qué maneras incorpora Snapchat el aprendizaje automático?

¿Existe alguna implementación de aprendizaje profundo de respuesta basada en la recuperación de preguntas?

¿Alguien ha probado el cableado cíclico de la red neuronal?

¿Cuáles son las ventajas de aprender Apache Spark?

¿Por qué la necesidad de depuración aún no se ha resuelto después de tantos desarrollos en tecnología, informática, algoritmos y aprendizaje automático?

¿Qué es la validación cruzada?

¿Cuál es la diferencia entre Deconvolución, Upsampling, Unpooling y Convolutional Sparse Coding?

Cómo obtener una pasantía de investigación en aprendizaje automático o inteligencia artificial en una universidad de los EE. UU., Ser indio trabajando en una startup

Si quiero comenzar con el aprendizaje profundo, ¿debería comprar una GPU de gama baja o aprovechar una solución en la nube? ¿Cuál es más barato / mejor?