Aplique incorporações de palavras em todo o documento, para obter um vetor de recurso

38

Como uso uma incorporação de palavras para mapear um documento para um vetor de recurso, adequado para uso com aprendizado supervisionado?

Uma incorporação de palavra mapeia cada palavra para um vetor , onde é um número não muito grande (por exemplo, 500). Os casamentos populares de palavras incluem word2vec e Glove .v R d dwvRdd

Quero aplicar o aprendizado supervisionado para classificar documentos. Atualmente, estou mapeando cada documento para um vetor de recurso usando a representação de palavras-chave e aplicando um classificador pronto para uso. Gostaria de substituir o vetor de recurso de palavras-chave por algo baseado em uma incorporação de palavras pré-treinada existente, para aproveitar o conhecimento semântico contido na incorporação de palavras. Existe uma maneira padrão de fazer isso?

Posso imaginar algumas possibilidades, mas não sei se há algo que faça mais sentido. Abordagens de candidatos que considerei:

  • Eu poderia calcular o vetor para cada palavra no documento e calcular a média de todas elas. No entanto, parece que isso pode perder muita informação. Por exemplo, com a representação de palavras-chave, se houver algumas que sejam altamente relevantes para a tarefa de classificação e a maioria das palavras for irrelevante, o classificador poderá aprender isso facilmente; se eu calcular a média dos vetores para todas as palavras do documento, o classificador não terá chance.

  • Concatenar os vetores para todas as palavras não funciona, porque não leva a um vetor de recurso de tamanho fixo. Também parece uma péssima idéia, pois será muito sensível ao posicionamento específico de uma palavra.

  • Eu poderia usar a palavra incorporação para agrupar o vocabulário de todas as palavras em um conjunto fixo de agrupamentos, digamos, 1000 agrupamentos, onde eu uso a similaridade de cosseno nos vetores como uma medida de similaridade de palavras. Então, em vez de um conjunto de palavras, eu poderia ter um conjunto de conjuntos: o vetor de recurso que forneço ao classificador poderia ser um vetor de 1000, onde o ésimo componente conta o número de palavras no documento que fazem parte do cluster .euii

  • Dada uma palavra , essas palavras permitem calcular um conjunto das 20 principais palavras mais semelhantes e sua pontuação de similaridade . Eu poderia adaptar o vetor de recurso parecido com um saco de palavras usando isso. Quando vejo a palavra , além de aumentar o elemento correspondente à palavra em , também posso incrementar o elemento correspondente à palavra por , incrementar o elemento correspondente à palavra por e assim por diante.w 1 , , w 20 s 1 , , s 20 w w 1 w 1 s 1 w 2 s 2ww1,,w20s1,,s20ww1w1s1w2s2

Existe alguma abordagem específica que provavelmente funcione bem na classificação de documentos?


Eu não estou procurando paragraph2vec ou doc2vec; eles exigem treinamento em um grande corpus de dados e eu não tenho um grande corpus de dados. Em vez disso, quero usar uma incorporação de palavras existente.

DW
fonte
1
Você já decidiu um método específico para representar documentos usando incorporações pré-treinadas? Talvez isso possa ajudar um pouco?
turdus-merula
1
@ user115202, arrumado! Isso não resolve o problema que tive, mas é uma ideia inteligente que parece valer a pena conhecer - obrigado por apontar! Nunca encontrei uma solução muito boa para esse problema que fosse significativamente melhor do que simplesmente usar palavras-chave. Talvez não seja exatamente assim que os casamentos de palavras são bons. Obrigado!
DW
Este também está relacionado ao seu problema, provavelmente um pouco mais do que o anterior: Aprendizado de representação para textos muito curtos usando agregação de incorporação de palavras ponderada .
Turdus merula-
1
Por que não usar um RNN? Documentos de tamanho variável não são um problema para RNNs. wildml.com/2015/09/...
kalu

Respostas:

23

Uma técnica simples que parece funcionar razoavelmente bem para textos curtos (por exemplo, uma frase ou um tweet) é calcular o vetor para cada palavra no documento e, em seguida, agregá-los usando a média coordenada, mín ou máx.

Com base nos resultados de um artigo recente, parece que usar o mínimo e o máximo funciona razoavelmente bem. Não é o ideal, mas é simples e é tão bom ou melhor quanto outras técnicas simples. Em particular, se os vetores para as palavras no documento forem , você calculará e . Aqui estamos tomando o mínimo em termos de coordenadas, ou seja, o mínimo é um vetor tal que e da mesma forma para o valor máx. O vetor de característica é a concatenação desses dois vetores, portanto, obtemos um vetor de característica emv 1 , v 2 , , v nR d min ( v 1 , , v n ) max ( v 1 , , v n ) u u i = min ( v 1 i , , v n i ) R 2 dnv1,v2,,vnRdmin(v1,,vn)max(v1,,vn)uui=min(vi1,,vin)R2d. Não sei se isso é melhor ou pior do que uma representação de palavras-chave, mas para documentos curtos, suspeito que possa ter um desempenho melhor que palavras-chave e permite o uso de combinações de palavras pré-treinadas.

TL; DR: Surpreendentemente, a concatenação do min e max funciona razoavelmente bem.

Referência:

Aprendizado de representação para textos muito curtos usando agregação de incorporação de palavras ponderada. Cedric De Boom, Steven Van Canneyt, Thomas Demeester, Bart Dhoedt. Cartas de reconhecimento de padrões; arxiv: 1607.00570. resumo , pdf . Veja especialmente as Tabelas 1 e 2.

Créditos: Agradeço a @ user115202 por trazer este artigo à minha atenção.

DW
fonte
4
para texto breve, avg / min / max pode funcionar bem, mas e se texto longo, como artigo de notícias?
abacate
1
Para quem lê esse artigo e fica tão confuso quanto eu: o artigo não se concentra na abordagem mencionada pelo @DW, eles apenas o mencionam brevemente em "5.1. Linhas de base" como uma abordagem de linha de base. O corpo do artigo concentra-se em sua própria técnica, que envolve o treinamento de um classificador usando embeddings, que é muito mais complexo do que a abordagem descrita aqui!
Migwell
16

Você pode usar o doc2vec semelhante ao word2vec e usar um modelo pré-treinado de um corpus grande. Em seguida, use algo como .infer_vector()no gensim para construir um vetor de documento. O treinamento do doc2vec não precisa vir do conjunto de treinamento.

Outro método é usar uma rede RNN, CNN ou feed forward para classificar. Isso combina efetivamente os vetores de palavras em um vetor de documento.

Você também pode combinar recursos esparsos (palavras) com recursos densos (vetor de palavras) para se complementarem. Portanto, sua matriz de recursos seria uma concatenação da matriz de poucas palavras com a média dos vetores de palavras. https://research.googleblog.com/2016/06/wide-deep-learning-better-together-with.html

Outro método interessante é usar um algoritmo semelhante ao word2vec, mas em vez de prever uma palavra de destino, você pode prever um rótulo de destino. Isso sintoniza diretamente os vetores de palavras para a tarefa de classificação. http://arxiv.org/pdf/1607.01759v2.pdf

Para métodos mais ad hoc, tente pesar as palavras de maneira diferente, dependendo da sintaxe. Por exemplo, você pode pesar verbos com mais força do que determinantes.

tokestermw
fonte
6

Se você está trabalhando com texto em inglês e deseja começar por incorporar palavras pré-treinadas, consulte: https://code.google.com/archive/p/word2vec/

Esta é a versão C original do word2vec. Junto com este lançamento, eles também lançaram um modelo treinado em 100 bilhões de palavras retiradas de artigos do Google Notícias (consulte a subseção: "Vetores pré-treinados de palavras e frases").

Na minha opinião e experiência em trabalhar com incorporação de palavras, para classificação de documentos, um modelo como doc2vec (com CBOW) funciona muito melhor do que um conjunto de palavras.

Como você tem um pequeno corpus, sugiro que você inicialize sua matriz de incorporação de palavras com as incorporações pré-treinadas mencionadas acima. Treine para o vetor de parágrafo no código doc2vec. Se você está familiarizado com o python, pode verificar a versão gensim, que é muito fácil de modificar.

Verifique também este documento que detalha o funcionamento interno do word2vec / doc2vec: http://arxiv.org/abs/1411.2738 . Isso facilitará a compreensão do código gensim.

O andarilho
fonte
1
Obrigado pelas sugestões. Não estou pedindo uma incorporação de palavras; Eu já sei como obter uma incorporação de palavras pré-treinadas (mencionei word2vec na minha pergunta). Minha pergunta é como construir vetores de recursos a partir de uma incorporação de palavras pré-treinada. Aprecio a referência ao doc2vec, mas meu corpus é bastante pequeno e, por isso, suspeito / temo que a tentativa de treinar códigos doc2vec seja superestimada e tenha um desempenho ruim (mesmo se eu inicializar a matriz com incorporações pré-treinadas).
DW