Natural Language Processing (NLP, também conhecido como text mining) é um termo abrangente para técnicas que permitem extrair informação de dados textuais. Na prática, estas técnicas são aplicadas com graus de sucesso variáveis. Nos últimos anos, os rápidos avanços nas redes neuronais (sobretudo por parte de gigantes tecnológicas como a Google) deram origem a vários progressos importantes. Como funcionam? Até que ponto são úteis na prática estas novas técnicas? E funcionam também com dados textuais em neerlandês? É demasiado para um só artigo, por isso serão duas partes. Nesta primeira parte, analisamos mais a fundo o conceito de
embeddings: uma forma de representar dados textuais que está na base dos avanços recentes. Na segunda parte, analisamos aplicações concretas e possibilidades específicas para textos em neerlandês.
NLP não é um desenvolvimento dos últimos anos; existe há muito tempo. Conceptualmente, desde os anos 50 e, na prática, desde aproximadamente os anos 90. Temas como
Named Entity Recognition,
Part-of-Speech tagging e
stemming & lemmatization fazem parte das ferramentas de NLP. Os principais problemas em que se aplicam dados de texto incluem
semantic search,
análise de sentimentos, topic modeling, classificação e clustering. Entre as técnicas mais utilizadas estão
bag-of-words,
tf-idf,
Naïve Bayes e
LDA. O que temos visto nos últimos anos, porém, é uma mudança para técnicas de NLP baseadas em redes neuronais. Tudo começou com a introdução do word2vec
[1] em 2013: uma espécie de dicionário que permite traduzir uma palavra numa sequência de números que capta o seu significado (word embeddings). Estes embeddings foram muito utilizados em redes neuronais recorrentes. O princípio da
attention[2] melhorou a capacidade das redes neuronais para aprender a reter relações de longo prazo em trechos de texto. Com a chegada do
transformer[3], essa capacidade melhorou consideravelmente e, hoje, o foco está nos modelos de linguagem pré-treinados da família BERT
[4]. Assim, o
transfer learning tornou-se finalmente uma realidade em NLP, tal como já tinha acontecido com as redes neuronais convolucionais pré-treinadas em computer vision. Por ordem cronológica, os desenvolvimentos académicos mais importantes são, portanto:

Mas, como referido, a aceleração começou com o word2vec e os word embeddings. Porque é que isto é tão importante? Porque muda radicalmente a forma como o texto é representado.
Representações de dados de texto
Um computador não consegue fazer cálculos com texto. Só com números. Para aplicar algoritmos a dados de texto, é preciso primeiro ‘traduzir’ esse texto em números. Por outras palavras, encontrar uma representação numérica.

Bag-of-words
A representação bag-of-words (BoW) é muito utilizada há anos. A abordagem é simples. Imagine que tem um conjunto de documentos (excertos de texto). O processo é o seguinte:
- Identificar as palavras que aparecem
- Usá-las para criar um vocabulário
- Para cada documento: contar quantas vezes aparece cada palavra do vocabulário
- Cada documento passa a ser uma longa sequência de números
- O seu ‘corpus’ (conjunto de dados de texto) passa a ser uma matriz de números
- B. Muitas vezes, as stop words são excluídas do vocabulário

Esta matriz de números pode então ser utilizada em vários algoritmos de classificação, clustering, topic modeling, etc. Também se utiliza frequentemente
tf/idf para atribuir um peso maior às palavras distintivas nesta matriz e um peso menor às palavras irrelevantes, mas esta técnica não se limita a BoW. Qual é, então, o problema desta representação? A simplicidade de BoW é o seu ponto forte, mas também tem algumas limitações. Para compreender um texto, precisamos de:
- Compreender o significado de cada palavra
- Compreender a relação entre as palavras
Como se sai BoW nestes aspetos?
- Compreender o significado de cada palavra
- Uma palavra é representada apenas por um índice que remete para o vocabulário. Não lhe está associado qualquer significado.
- Compreender a relação entre as palavras
- A ordem das palavras no texto é ignorada.
Dois exemplos para esclarecer:
- BoW não reconhece qualquer semelhança entre ‘animal’ e ‘bicho’, embora tenham significados quase idênticos
- Em contrapartida, BoW considera estas frases exatamente iguais:
- “Não foi como esperava, este filme é ótimo”
- “Foi como esperava, este filme não é ótimo”
Word embeddings
A ideia central por detrás dos word embeddings é a distributional hypothesis[5] de John Firth:
“Uma palavra conhece-se pela companhia que mantém”.
Por outras palavras, o significado de uma palavra pode ser inferido a partir do contexto em que aparece. É precisamente assim que funciona o algoritmo word2vec: analisa excertos de texto para identificar que palavras aparecem junto de que palavras de contexto.

No exemplo de
The quick brown fox, isto pode não parecer muito útil. Mas, se o fizer com milhões ou até milhares de milhões de frases, começam a surgir padrões. Obtém assim uma grande quantidade de dados com os quais pode treinar um modelo (uma rede neuronal) para prever as palavras do contexto a partir de uma determinada palavra. Pode parecer uma tarefa inútil e sem futuro, mas tem uma vantagem: como resultado secundário, obtém uma matriz com um conjunto de pesos (números) para cada palavra. E há algo de especial nestes números. Afinal, o significado da palavra está contido neles — e é possível extraí-lo! Como? Comparando os números: podem estar próximos uns dos outros (81 e 82) ou afastados (2 e 81), o que pode interpretar como semelhança ou diferença. E, como cada palavra é representada por vários números, pode analisar diferentes tipos de semelhança. Um exemplo é o já clássico “king – man + woman = queen”:
Vejamos os números obtidos (a que chamamos embeddings) para as quatro palavras “king”, “man”, “woman” e “queen” na imagem abaixo.
Há três aspetos a destacar:
- Alguns números/colunas (assinalados a cor abaixo) estão próximos quando comparamos “king” e “man”. Isto sugere que existe uma semelhança semântica entre as duas palavras (e existe)
- O mesmo se aplica a “woman” e “queen”
- Existe uma semelhança semelhante entre “king” e “queen”, mas noutros números/colunas

Do ponto de vista semântico, se pensar na palavra “rei” e substituir a componente masculina pela feminina, chega a “rainha”. E é precisamente isso (bem, quase precisamente) que acontece quando faz o mesmo cálculo com os word embeddings destas palavras! Isto sugere que alguns números do embedding representam o género e outros a ‘realeza’. Imagine agora que temos embeddings com apenas três números (na realidade, são centenas ou até milhares) e que representamos esses números como pontos num espaço 3D. Podemos então visualizar as relações entre as palavras:

Se quiser descobrir mais algumas relações interessantes e surpreendentes, recomendo este artigo:
https://graceavery.com/word2vec-fish-music-bass/
Word embeddings como transfer learning
Como pode obter word embeddings? Em geral, não precisa de os criar: pode reutilizar os que já existem. Investigadores da Google treinaram o algoritmo word2vec com conjuntos de dados enormes e disponibilizaram publicamente os embeddings em várias línguas. Existem também outros algoritmos para criar word embeddings. Os mais conhecidos são o fastText, do Facebook, e o GloVe, de Stanford. Pode descarregar e utilizar qualquer um deles. A primeira forma de transfer learning em NLP.
De word embeddings a text embeddings
Encontrámos, portanto, uma nova forma de representar palavras, em que o significado está mais ou menos codificado em números. Como podemos avaliar esta representação?
- Compreender o significado de palavras isoladas
- Até aqui, parece ter funcionado muito bem! Os word embeddings de “animal” e “bicho” serão muito semelhantes
- Compreender as relações entre palavras
Ora, como o nome indica, os word embeddings representam palavras, mas ainda não frases ou trechos de texto. Com BoW, conseguíamos pelo menos representar trechos de texto, mas como avançar agora? Uma abordagem comum era utilizar redes neuronais recorrentes (por exemplo, LSTM, GRU) em conjunto com word embeddings. O texto é dividido em palavras e convertido numa sequência de word embeddings, que são processados passo a passo. Em cada passo, a ‘memória’ interna da rede é atualizada, até se obter um embedding para o texto inteiro. Esse embedding é depois utilizado para a tarefa em causa (previsão, geração de texto, etc.).

A partir daqui, podemos distinguir, em termos gerais, duas abordagens:
- técnicas ‘diretas’ de text embeddings
- melhorias centradas na sensibilidade ao contexto
Text embeddings diretos
Existem várias técnicas para obter text embeddings. Em geral, são usadas para criar embeddings de frases ou parágrafos. Criar embeddings de páginas inteiras de texto de uma só vez ainda não funciona bem. O método mais simples (mas não necessariamente o pior) consiste em usar average word embeddings: calcular a média dos word embeddings de todas as palavras do texto. A desvantagem é que ignora a ordem das palavras e inclui palavras irrelevantes, mas este último problema pode ser resolvido, por exemplo, atribuindo primeiro pesos às palavras com tf/idf e calculando depois uma média ponderada. Seguiu-se uma série de outras abordagens. O algoritmo doc2vec[6] é, de certo modo, uma extensão do word2vec, em que o texto é fornecido como contexto a par das palavras individuais. As palavras e os textos são assim codificados no mesmo embedding space e podem ser comparados entre si. Com skip-thought vectors[7], o algoritmo word2vec é ampliado, substituindo-se as palavras por frases.
Passa-se, portanto, de: “o significado de uma palavra é: as palavras entre as quais aparece”, para: “o significado de uma frase é: as frases entre as quais aparece”. Para isso, usam-se RNN’s (GRU) com word embeddings num modelo encoder-decoder.
Sensibilidade ao contexto
Outra linha de investigação centrou-se mais em ajudar as redes neuronais a lidar melhor com o contexto através de word embeddings. O conceito de attention começou por ser uma técnica para dirigir a atenção para determinadas partes do texto durante uma tarefa. Em certos momentos, uma seleção específica do texto (o contexto) é relevante no conjunto mais amplo. Com o aparecimento da arquitetura transformer, combinações de mecanismos de attention substituíram as arquiteturas anteriores baseadas em redes neuronais recorrentes e convolucionais. Seguiu-se uma série de modelos de linguagem de grande escala baseados em transformers. Os mais conhecidos, os modelos da família BERT, disponibilizam word embeddings pré-treinados e sensíveis ao contexto. A partir daqui, chegar aos text embeddings é um passo relativamente pequeno. Sentence-BERT[8] (mais conhecido pelo termo sentence transformers) é uma implementação prática desta abordagem. Chegámos assim a um ponto importante: o transfer learning em NLP é finalmente uma realidade!

Em resumo
Agora que chegámos aos text embeddings, temos uma forma de criar uma representação poderosa de um excerto de texto, capaz de captar tanto o significado das palavras como as relações entre elas (a estrutura da frase). Então basta descarregar um modelo pré-treinado, usá-lo para gerar embeddings para o nosso texto e já podemos avançar? Dependendo da tarefa, isso é verdade até certo ponto. Pelo menos em teoria.
Na parte 2, veremos até que ponto estas promessas se concretizam na prática…
Referências
[1] [Mikolov et al. 2013]
https://arxiv.org/abs/1301.3781
[2] [Bahdanau et al. 2014]
https://arxiv.org/abs/1409.0473
[3] [Vaswani et al. 2017]
https://arxiv.org/abs/1706.03762
[4] [Devlin et al. 2018]
https://arxiv.org/abs/1810.04805
[5]
https://en.wikipedia.org/wiki/Distributional_semantics
[6] [Le, Mikolov 2014]
https://arxiv.org/abs/1405.4053
[7] [Kiros et al. 2015]
https://arxiv.org/abs/1506.06726
[8] [Reimers, Gurevych 2019]
https://arxiv.org/abs/1908.10084