61 votos

Aplicar las incrustaciones de palabras a todo el documento, para obtener un vector de características

¿Cómo puedo utilizar una incrustación de palabras para asignar un documento a un vector de características, adecuado para su uso con el aprendizaje supervisado?

A incrustación de palabras mapea cada palabra $w$ a un vector $v \in \mathbb{R}^d$ , donde $d$ es un número no demasiado grande (por ejemplo, 500). Populares incrustaciones de palabras incluye word2vec y Guante .

Quiero aplicar el aprendizaje supervisado para clasificar documentos. Actualmente estoy asignando cada documento a un vector de características utilizando la representación de bolsa de palabras, y luego aplicando un clasificador estándar. Me gustaría reemplazar el vector de características de la bolsa de palabras con algo basado en una incrustación de palabras ya entrenada, para aprovechar el conocimiento semántico que contiene la incrustación de palabras. ¿Existe una forma estándar de hacerlo?

Puedo imaginar algunas posibilidades, pero no sé si hay algo que tenga más sentido. Enfoques candidatos que he considerado:

  • Podría calcular el vector de cada palabra del documento y hacer una media de todas ellas. Sin embargo, esto parece que podría perder mucha información. Por ejemplo, con la representación de bolsa de palabras, si hay unas pocas palabras que son muy relevantes para la tarea de clasificación y la mayoría de las palabras son irrelevantes, el clasificador puede aprenderlo fácilmente; si hago un promedio de los vectores de todas las palabras del documento, el clasificador no tiene ninguna posibilidad.

  • Concatenar los vectores de todas las palabras no funciona, porque no conduce a un vector de características de tamaño fijo. También parece una mala idea porque será demasiado sensible a la ubicación específica de una palabra.

  • Podría utilizar la incrustación de palabras para agrupar el vocabulario de todas las palabras en un conjunto fijo de clústeres, digamos, 1000 clústeres, donde utilizo la similitud del coseno en los vectores como medida de similitud de las palabras. Entonces, en lugar de una bolsa de palabras, podría tener una bolsa de clusters: el vector de características que proporciono al clasificador podría ser un vector de 1000, donde el $i$ cuenta el número de palabras del documento que forman parte del clúster $i$ .

  • Dada una palabra $w$ Estas incrustaciones de palabras me permiten calcular un conjunto de las 20 palabras más similares $w_1,\dots,w_{20}$ y su puntuación de similitud $s_1,\dots,s_{20}$ . Podría adaptar el vector de características tipo bolsa de palabras utilizando esto. Cuando veo la palabra $w$ además de incrementar el elemento correspondiente a la palabra $w$ por $1$ También podría incrementar el elemento correspondiente a la palabra $w_1$ por $s_1$ , incrementa el elemento correspondiente a la palabra $w_2$ por $s_2$ y así sucesivamente.

¿Hay algún enfoque específico que pueda funcionar bien para la clasificación de documentos?


No estoy buscando paragraph2vec o doc2vec; esos requieren entrenamiento en un corpus de datos grande, y yo no tengo un corpus de datos grande. En su lugar, quiero utilizar una incrustación de palabras existente.

33voto

UK Visa Works Puntos 29

Una técnica sencilla que parece funcionar razonablemente bien para textos cortos (por ejemplo, una frase o un tuit) consiste en calcular el vector de cada palabra del documento y, a continuación, agregarlo mediante la media, el mínimo o el máximo de las coordenadas.

Según los resultados de un artículo reciente, parece que el uso del mínimo y el máximo funciona razonablemente bien. No es óptimo, pero es sencillo y tan bueno o mejor que otras técnicas sencillas. En particular, si los vectores para el $n$ palabras en el documento son $v^1,v^2,\dots,v^n \in \mathbb{R}^d$ , entonces se calcula $\min(v^1,\dots,v^n)$ y $\max(v^1,\dots,v^n)$ . Aquí estamos tomando el mínimo por coordenadas, es decir, el mínimo es un vector $u$ tal que $u_i = \min(v^1_i, \dots, v^n_i)$ y de forma similar para el max. El vector de características es la concatenación de estos dos vectores, por lo que obtenemos un vector de características en $\mathbb{R}^{2d}$ . No sé si esto es mejor o peor que una representación de bolsa de palabras, pero para los documentos cortos sospecho que podría funcionar mejor que la bolsa de palabras, y permite utilizar incrustaciones de palabras preentrenadas.

TL;DR: Sorprendentemente, la concatenación del mínimo y el máximo funciona razonablemente bien.

Referencia:

Aprendizaje de la representación de textos muy cortos mediante la agregación de palabras ponderadas. Cedric De Boom, Steven Van Canneyt, Thomas Demeester, Bart Dhoedt. Pattern Recognition Letters; arxiv:1607.00570. abstracto , pdf . Véanse especialmente los cuadros 1 y 2.

Créditos: Gracias a @user115202 por llamar mi atención sobre este artículo.

18voto

jcollum Puntos 10236

Puede utilizar doc2vec de forma similar a word2vec y utilizar un modelo preformado a partir de un corpus grande. Luego, utilice algo como .infer_vector() en gensim para construir un vector de documentos. No es necesario que el doc2vec de entrenamiento provenga del conjunto de entrenamiento.

Otro método es utilizar una RNN, una CNN o una red feed forward para clasificar. Esto combina efectivamente los vectores de palabras en un vector de documentos.

También se pueden combinar características dispersas (palabras) con características densas (vectores de palabras) para que se complementen. Así, su matriz de características sería una concatenación de la matriz de bolsa de palabras dispersa con el promedio de vectores de palabras. https://research.googleblog.com/2016/06/wide-deep-learning-better-together-with.html

Otro método interesante es utilizar un algoritmo similar al de word2vec, pero en lugar de predecir una palabra objetivo, se puede predecir una etiqueta objetivo. Esto ajusta directamente los vectores de palabras a la tarea de clasificación. http://arxiv.org/pdf/1607.01759v2.pdf

Para métodos más ad hoc, puede intentar ponderar las palabras de forma diferente según la sintaxis. Por ejemplo, puede ponderar los verbos con más fuerza que los determinantes.

6voto

Charles Merriam Puntos 135

Si está trabajando con texto en inglés y quiere incrustaciones de palabras pre-entrenadas para empezar, entonces vea esto: https://code.google.com/archive/p/word2vec/

Esta es la versión original en C de word2vec. Junto con esta versión, también publicaron un modelo entrenado con 100.000 millones de palabras tomadas de artículos de Google News (véase la subsección titulada: "Vectores de palabras y frases preentrenados").

En mi opinión y experiencia de trabajo en incrustaciones de palabras, para la clasificación de documentos, un modelo como doc2vec (con CBOW) funciona mucho mejor que la bolsa de palabras.

Como tiene un corpus pequeño, le sugiero que inicialice su matriz de incrustación de palabras con las incrustaciones preentrenadas mencionadas anteriormente. Luego entrena para el vector de párrafos en el código doc2vec. Si te sientes cómodo con python, puedes consultar la versión de gensim, que es muy fácil de modificar.

Consulte también este artículo que detalla el funcionamiento interno de word2vec/doc2vec: http://arxiv.org/abs/1411.2738 . Esto hará que la comprensión del código gensim sea muy fácil.

4voto

Debbie Puntos 53

Me impresiona que nadie lo haya mencionado, pero otras buenas prácticas son rellenar las frases en un tamaño fijo, inicializar una capa de incrustación con los pesos de Word2Vec y alimentar un LSTM. Así que es básicamente lo que OP mencionó aquí, pero incluyendo el relleno para manejar las diferentes longitudes:

Concatenar los vectores de todas las palabras no funciona, porque no conduce a un vector de características de tamaño fijo.

Ejemplo

Considere la siguiente frase (tomada del Reto de clasificación de comentarios tóxicos ):

"Explicación ¿Por qué las ediciones hechas bajo mi nombre de usuario Hardcore Metallica Fan fueron revertidas? No fueron vandalismos, sólo el cierre de algunos GAs después de que voté en New York Dolls FAC. Y por favor, no elimine la plantilla de la página de discusión ya que estoy retirado ahora.89.205.38.27"

En primer lugar, limpiamos dicha frase:

"explicación de por qué las ediciones hechas bajo mi nombre de usuario hardcore metallica fan fueron revertidas? no fueron vandalismos, sólo el cierre de algunos gases después de que voté en la fac de new york dolls. y por favor no elimine la plantilla de la página de discusión ya que estoy retirado ahora. ipaddress"

A continuación, codificamos sus palabras en números enteros:

776 92 2 161 153 212 44 754 4597 9964 1290 104 399 34 57 2292 10 29 14515 3 66 6964 22 75 2730 173 5 2952 47 136 1298 16686 2615 1 8 67 73 10 29 290 2 398 45 2 60 43 164 5 10 81 4030 107 1 216

Y por último, si realizamos el relleno con una longitud de 200, quedaría así:

array([    0,     0,     0,     0,     0,     0,     0,     0,     0,
           0,     0,     0,     0,     0,     0,     0,     0,     0,
           0,     0,     0,     0,     0,     0,     0,     0,     0,
           0,     0,     0,     0,     0,     0,     0,     0,     0,
           0,     0,     0,     0,     0,     0,     0,     0,     0,
           0,     0,     0,     0,     0,     0,     0,     0,     0,
           0,     0,     0,     0,     0,     0,     0,     0,     0,
           0,     0,     0,     0,     0,     0,     0,     0,     0,
           0,     0,     0,     0,     0,     0,     0,     0,     0,
           0,     0,     0,     0,     0,     0,     0,     0,     0,
           0,     0,     0,     0,     0,     0,     0,     0,     0,
           0,     0,     0,     0,     0,     0,     0,     0,     0,
           0,     0,     0,     0,     0,     0,     0,     0,     0,
           0,     0,     0,     0,     0,     0,     0,     0,     0,
           0,     0,     0,     0,     0,     0,     0,     0,     0,
           0,     0,     0,     0,     0,     0,     0,     0,     0,
           0,     0,   776,    92,     2,   161,   153,   212,    44,
         754,  4597,  9964,  1290,   104,   399,    34,    57,  2292,
          10,    29, 14515,     3,    66,  6964,    22,    75,  2730,
         173,     5,  2952,    47,   136,  1298, 16686,  2615,     1,
           8,    67,    73,    10,    29,   290,     2,   398,    45,
           2,    60,    43,   164,     5,    10,    81,  4030,   107,
           1,   216], dtype=int32)

Podemos obligar a que todas las frases tengan un máximo de 200 palabras, rellenarlas con ceros si tienen menos, o cortar las palabras que vienen después si tienen más.

A continuación, inicializamos un modelo de incrustación con los pesos de word2vec, aquí hay un ejemplo usando Keras:

model.add(Embedding(nb_words, WV_DIM, weights=[wv_matrix], input_length=MAX_SEQUENCE_LENGTH, trainable=False))

wv_matrix contiene una matriz con forma $ℝ^{nd}$ (número de palabras únicas frente a la dimensión de incrustación).

Y finalmente añadimos una capa LSTM después de eso, por ejemplo:

embedded_sequences = SpatialDropout1D(0.2)(embedded_sequences)
x = Bidirectional(CuDNNLSTM(64, return_sequences=False))(embedded_sequences)

Referencias

0voto

Wen Qin Puntos 129

Yo sugeriría utilizar el enfoque del tamaño de la ventana. Dado window-size=1024 (token) y usted predefine dice 10 ventanas, entonces concatenando todos los vectores de las ventanas. Esto es similar a su solución 2, pero en lugar de utilizar vectores de palabras, utilizando vectores de ventanas. Con este enfoque, puede probar con otras incrustaciones como BERT o similares, ya que éstas tienen un tamaño limitado de longitud de token.

Si se utiliza Word2Vec, o vector de palabras, ¿consideraría utilizar una combinación lineal con la ponderación de la palabra como TFIDF y los vectores de palabras. He comprobado que el rendimiento es superior al de los vectores de palabras sin ponderación.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X