Como superar os diferentes comprimentos dos exemplos de treinamento ao trabalhar com Incorporações de Palavras (word2vec)

10

Estou trabalhando na análise de sentimentos sobre tweets usando o word2vec como representação de palavras.

Eu treinei meu modelo word2vec. Mas quando vou treinar meu classificador, enfrento o problema de que cada tweet tem tamanho diferente e o classificador (RandomForest) precisa que todos os exemplos sejam do mesmo tamanho.

Atualmente, para cada tweet, estou calculando a média dos vetores de todas as suas palavras, para terminar com uma representação vetorial do tweet.

Por exemplo: Meu modelo word2vec representa cada palavra como vetores de tamanho 300.

Eu Tweet1formei por 10 palavras e Tweet2por 5 palavras.

Então, o que eu faço é, por Tweet1

(v1_Tweet1 + v2_Tweet1 + ... +v10_Tweet1)/10 = v_Tweet1 #avg vector of 300 elements.

Para Tweet2:

(v1_Tweet2 + v2_Tweet2 + ... +v5_Tweet1)/5 = v_Tweet2 #avg vector of 300 elements.

* Sendo v1_TweetX o vetor da primeira palavra do TweetX e assim por diante.

Isso funciona 'bem', mas eu gostaria de saber que outras abordagens você adota para superar os diferentes tamanhos nos exemplos de trem e texto para o classificador.

Obrigado.

antorqs
fonte

Respostas:

6

Deixe-me sugerir três opções simples:

  1. calcule a média dos vetores (em termos de componentes), ou seja, calcule o vetor de incorporação de palavras para cada palavra no texto e calcule a média deles. (como sugerido por outros).

  2. pegue o máximo (em termos de componentes) dos vetores. (máximo, em vez da média)

  3. tome o mínimo (em termos de componentes) dos vetores. (min, em vez da média)

Cada uma delas gera um vetor de recurso independente do comprimento do texto.

Existem pesquisas sugerindo que concatenar o máximo e o mínimo gera um espaço de recurso bastante eficaz: não é o ideal absoluto, mas está próximo do ideal e é simples e fácil de implementar. Veja esta pergunta no Statistics.SE para obter detalhes.


Aqui está uma idéia alternativa, inspirada na resposta do cubone , que até onde eu sei não foi testada antes. A idéia é marcar o texto usando um marcador de parte da fala e depois usá-las para informar o processo de caracterização.

Em particular, escreva uma lista de todas as tags POS possíveis que poderiam ser emitidas pelo tagger POS. Suponha que existam 20 tags possíveis (CC, DT, JJS, MD, NNP, ...). O vetor de recurso terá 20 * 300 = 6000 elementos: ele terá um vetor de 300 vetores por tag POS, concatenado em alguma ordem canônica. O vetor de 300 para cada tag pode ser calculado calculando a média dos vetores de incorporação de palavras de todas as palavras que são marcadas pelo tag-POS com essa tag. Ou você pode obter um vetor de 600 por tag POS, obtido calculando o mínimo e o máximo em todos os vetores de palavras com essa tag.

Isso pode render um espaço de recursos mais rico, não sei se traria alguma melhoria, mas é algo que você pode tentar se quiser experimentar idéias diferentes.

DW
fonte
3

Duas sugestões muito diferentes aqui para evitar a média dos vetores:

  1. Use a Distância do movimentador de palavras ( https://github.com/mkusner/wmd ) para calcular a distância entre os tweets (não tenho certeza de como funcionaria em textos curtos, como tweets, ainda preciso tentar isso ...)
  2. Agrupe os próprios vetores de palavras (usando, por exemplo, kmeans) e, para cada tweet, crie um vetor com k entradas (uma para cada cluster) que codifique se contém palavras pertencentes a esse cluster. Acho que vi isso em um tutorial do Kaggle no word2vec, ficará feliz pelo link, se você o encontrar!
Sharon
fonte
1

Em vez de calcular a média e obter um único vetor para o tweet, você pode obter vetores para cada palavra e para tamanhos de vetor de tamanhos diferentes, o preenchimento pode ser feito com zeros.

Hima Varsha
fonte
Olá, obrigado pela sua resposta. Atualizei a pergunta com um pequeno exemplo. Você atualizaria sua resposta para mostrar como aplicaria isso ao exemplo que forneci? Obrigado.
Antorqs
Entendo muito melhor depois da sua edição. Mas por que iria querer um único vetor? por que você não pode usar todas as palavras (vetores) para classificação?
Hima Varsha
Eu uso todos os vetores de palavras. Mas preciso representar todos os tweets de uma maneira que todos tenham o mesmo tamanho. Para o classificador, todos os exemplos devem ter o mesmo tamanho.
Antorqs
Você já tentou usar um vetorizador e fazer fit_transform para os tweets?
Hima Varsha
1

No meu trabalho, fiz da mesma maneira calculando a média dos vetores de palavras. Mas há outra idéia que eu queria tentar. É com a ajuda de tags POS.

Primeiro construa uma frase mais complicada com todas as tags POS quanto possível e defina essas tags POS como um modelo. Para cada frase no corpus do twitter, o POS marca todas as palavras nele e aplica esses vetores de palavras respectivos às tags POS no modelo. Portanto, as tags POS invisíveis terão zeros.

Por exemplo: NNP PDT DT NNS VB MD JJS CC PRP RBSé o modelo. Assim, cada posição conterá um vetor tridimensional totalmente um vetor tridimensional. E se as tags POS do primeiro tweet forem NNP VB JJS PRP, os vetores de palavras serão aplicados nessas posições e terão vetores nas NNP VB JJS PRPposições e vetores zero tridimensionais em outras posições.

Esse método não apenas resolve o problema de representar a sentença por um único vetor, mas também preserva a estrutura sintática da sentença, posicionando-o no POS correto.

Obviamente, haverá problemas quando houver mais de uma tag POS ou posições confusas das tags. Esta é apenas uma das possibilidades.

yazhi
fonte
Não entendo bem essa abordagem. Você pode editar para esclarecer / elaborar a abordagem? O que você planeja fazer se as tags POS no meu tweet não aparecerem na mesma ordem que o seu modelo? O que você planeja fazer se meu tweet contiver tags POS que não estavam presentes no seu modelo? Isso parece bastante frágil.
DW
Inspirado pela sua resposta, adicionei uma ideia à minha resposta, que se baseia na sua, mas tenta abordar a fragilidade mencionada no meu comentário. Eu gosto do que você inventou!
DW
1

Eu posso pensar em algumas possibilidades que podem se adequar ao seu caso:

  1. Use o truque de hash para transformar vetores arbitrários de comprimento em comprimento constante.
  2. Troque vetores de palavras por vetores de parágrafo . Gensim e Deeplearning4j têm implementações que você pode ver.
  3. Confira a lista awesome-2vec com links para uma implementação do tweet2vec !
dvdnglnd
fonte