Aplique incrustaciones de palabras en todo el documento para obtener un vector de características

38

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

Una incrustación de palabras asigna cada palabra w a un vector , donde es un número no demasiado grande (por ejemplo, 500). Las incrustaciones de palabras populares incluyen word2vec y Glove .vRdd

Quiero aplicar el aprendizaje supervisado para clasificar documentos. Actualmente estoy asignando cada documento a un vector de características usando la representación de bolsa de palabras, luego aplico un clasificador listo para usar. Me gustaría reemplazar el vector de características de la bolsa de palabras con algo basado en una inclusión de palabras pre-entrenada existente, para aprovechar el conocimiento semántico que contiene la inclusión de palabras. ¿Hay una forma estándar de hacer eso?

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

  • Podría calcular el vector para cada palabra en el documento y promediarlas todas. Sin embargo, esto parece que podría perder mucha información. Por ejemplo, con la representación de la bolsa de palabras, si hay algunas palabras que son altamente relevantes para la tarea de clasificación y la mayoría de las palabras son irrelevantes, el clasificador puede aprender fácilmente eso; Si promedio los vectores para todas las palabras en el documento, el clasificador no tiene ninguna posibilidad.

  • La concatenación de los vectores para 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 usar la incrustación de palabras para agrupar el vocabulario de todas las palabras en un conjunto fijo de grupos, por ejemplo, 1000 grupos, donde uso la similitud de coseno en los vectores como una medida de la similitud de palabras. Entonces, en lugar de una bolsa de palabras, podría tener una bolsa de grupos: el vector de características que proporciono al clasificador podría ser un vector 1000, donde el componente número cuenta el número de palabras en el documento que son parte del grupo .ii

  • Dada una palabra , estas incorporaciones de palabras me permiten calcular un conjunto de las 20 palabras más similares y su puntaje de similitud . Podría adaptar el vector de características tipo bolsa de palabras usando esto. Cuando veo la palabra , además de incrementar el elemento correspondiente a la palabra en , también podría incrementar el elemento correspondiente a la palabra en , incrementar el elemento correspondiente a la palabra en , y así sucesivamente.w 1 , ... , w 20 s 1 , ... , s 20 w w 1 w 1 s 1 w 2 s 2ww1,,w20s1,,s20ww1w1s1w2s2

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


No estoy buscando el párrafo 2vec o doc2vec; esos requieren entrenamiento en un gran corpus de datos, y no tengo un gran corpus de datos. En cambio, quiero usar una incrustación de palabras existente.

DW
fuente
1
¿Ha decidido un método específico para representar documentos utilizando incrustaciones previamente formadas? Quizás esto podría ayudar un poco?
turdus-merula
1
@ user115202, ordenado! Eso no resuelve el problema que tenía, pero es una idea inteligente que parece que vale la pena conocer. ¡Gracias por señalarlo! Nunca encontré una solución muy buena para este problema que fuera significativamente mejor que simplemente usar una bolsa de palabras. Tal vez esto no sea en lo que las incrustaciones de palabras son buenas. ¡Gracias!
DW
Este también está relacionado con su problema, probablemente un poco más que el anterior: aprendizaje de representación para textos muy cortos utilizando agregación de incrustación de palabras ponderadas .
turdus-merula
1
¿Por qué no usar un RNN? Los documentos de longitud variable no son un problema para los RNN. wildml.com/2015/09/…
kalu

Respuestas:

23

Una técnica simple que parece funcionar razonablemente bien para textos cortos (p. Ej., Una oración o un tweet) es calcular el vector para cada palabra en el documento y luego agregarlos usando la media coordinada, min o max.

nv1,v2,,vnRdmin(v1,,vn)max(v1,,vn)uui=min(vi1,,vin)R2d

TL; DR: Sorprendentemente, la concatenación de min y max funciona razonablemente bien.

Referencia:

Aprendizaje de representación para textos muy cortos utilizando agregación de incrustación de palabras ponderadas Cedric De Boom, Steven Van Canneyt, Thomas Demeester, Bart Dhoedt. Letras de reconocimiento de patrones; arxiv: 1607.00570. resumen , pdf . Ver especialmente las tablas 1 y 2.

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

DW
fuente
44
para texto corto, avg / min / max podría funcionar bien, pero ¿qué pasa si el texto largo, como un artículo de noticias?
aguacate
1
Para cualquiera que lea ese documento y se confunda tanto como yo: el documento no se centra en el enfoque mencionado por @DW, solo lo mencionan brevemente en "5.1. Líneas de base" como enfoque de referencia. El cuerpo del documento se centra en su propia técnica, que implica entrenar a un clasificador usando incrustaciones, ¡lo cual es mucho más complejo que el enfoque descrito aquí!
Migwell
16

Puede usar doc2vec de manera similar a word2vec y usar un modelo previamente entrenado de un corpus grande. Luego use algo como .infer_vector()en gensim para construir un vector de documento. El entrenamiento doc2vec no necesariamente debe provenir del conjunto de entrenamiento.

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

También puede combinar características dispersas (palabras) con características densas (vector de palabras) para complementarse entre sí. Entonces, su matriz de características sería una concatenación de la matriz de bolsa escasa de palabras 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 a word2vec, pero en lugar de predecir una palabra objetivo, puede predecir una etiqueta objetivo. Esto sintoniza directamente los vectores de palabras con la tarea de clasificación. http://arxiv.org/pdf/1607.01759v2.pdf

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

tokestermw
fuente
6

Si está trabajando con texto en inglés y desea comenzar con la inserción de palabras previamente capacitadas, consulte esto: https://code.google.com/archive/p/word2vec/

Esta es la versión C original de word2vec. Junto con este lanzamiento, también lanzaron un modelo entrenado en 100 mil millones de palabras tomadas de los artículos de Google News (ver subsección titulada: "Vectores de palabras y frases pre-entrenados").

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

Como tiene un corpus pequeño, sugiero que inicialice su matriz de incrustación de palabras mediante las incrustaciones previamente capacitadas mencionadas anteriormente. Luego entrene para el vector de párrafo en el código doc2vec. Si se siente cómodo con Python, puede verificar la versión de Gensim, que es muy fácil de modificar.

Consulte también este documento que detalla el funcionamiento interno de word2vec / doc2vec: http://arxiv.org/abs/1411.2738 . Esto facilitará la comprensión del código gensim.

El vagabundo
fuente
1
Gracias por las sugerencias No estoy pidiendo una palabra incrustada; Ya sé cómo obtener una inserción de palabras previamente capacitada (mencioné word2vec en mi pregunta). Mi pregunta es cómo construir vectores de características a partir de una inserción de palabras previamente entrenada. Aprecio la referencia a doc2vec, pero mi corpus es bastante pequeño, por lo que sospecho / temo que tratar de entrenar códigos doc2vec se sobreajuste y funcione mal (incluso si inicializo la matriz con incrustaciones pre-entrenadas).
DW