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 …
- ¿Qué son las redes de iteración de valor?
- ¿Cuáles son las mejores escuelas de posgrado canadienses para estudiar CS en Inteligencia Artificial, aprendizaje automático, procesamiento de lenguaje natural y minería de datos, especialmente para estudiantes internacionales?
- ¿De qué sirve el aprendizaje automático en la predicción de resultados de cricket?
- ¿Cuáles son algunos proyectos en Big Data y machine learning?
- MLconf 2015 Seattle: ¿Cómo funciona la técnica de aproximación simbólica agregada (SAX)?
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