Vetorização em PLN

09/01/2025

A vetorização de palavras em Processamento de Linguagem Natural (PLN) é fundamental para converter palavras em representações numéricas. Id: 37

Capa do artigo Vetorização em PLN

Vetorização no Contexto de Processamento de Linguagem Natural (PLN)

A vetorização é uma etapa crucial no Processamento de Linguagem Natural (PLN), pois traduz textos, que são dados não estruturados, em representações numéricas que os algoritmos de aprendizado de máquina conseguem interpretar e processar. Este artigo explora os conceitos, técnicas e aplicações relacionadas à vetorização no PLN.

1. O que é Vetorização?

Vetorização refere-se ao processo de converter palavras, frases ou documentos em vetores numéricos. Esses vetores podem ser usados como entrada para modelos de aprendizado de máquina, possibilitando a análise, classificação ou clustering de textos. No PLN, o desafio está em capturar a semântica e a sintaxe dos textos durante o processo de vetorização. Para isso, são usadas técnicas que transformam palavras ou documentos em espaços vetoriais, preservando relações de similaridade semântica ou contextos de uso.

2. Técnicas de Vetorização

Existem diversas técnicas para a vetorização de textos. Entre as mais populares estão o Bag of Words (BoW), a frequência de termos (TF), o TF-IDF (Term Frequency-Inverse Document Frequency), e métodos mais sofisticados como Word2Vec e BERT. Cada uma dessas técnicas tem suas vantagens e limitações, e a escolha depende da tarefa específica no contexto de PLN.

2.1. Representações Baseadas em Frequência

2.1.1. Bag of Words (BoW)

Uma das técnicas mais simples, o BoW representa um texto como um vetor de frequências de palavras em um vocabulário fixo. Por exemplo, em um conjunto de documentos:

  • Cada documento é representado por um vetor onde cada dimensão corresponde a uma palavra do vocabulário.
  • A contagem de cada palavra no documento é usada como valor da dimensão correspondente.

Vantagens:

  • Simples de implementar.
  • Adequado para tarefas onde a ordem das palavras é irrelevante.

Desvantagens:

  • Desconsidera a ordem das palavras.
  • Vocabulário grande resulta em vetores esparsos.
Funcionamento do BoW

O BoW desconsidera a ordem das palavras, focando apenas na frequência de ocorrência de cada termo em um texto. O processo pode ser resumido em três etapas:

  1. Construção do Vocabulário:

    Criar uma lista única de todas as palavras presentes em um conjunto de textos (corpus).

  2. Contagem de Frequências:

    Para cada texto, contar a ocorrência de cada palavra do vocabulário.

  3. Representação Vetorial:

    Converter os textos em vetores, onde cada dimensão corresponde a uma palavra do vocabulário e o valor é a frequência dessa palavra no texto.

Exemplo Prático do BoW

Corpus de Exemplo:

  1. "Eu gosto de maçãs."
  2. "Eu não gosto de bananas."
  3. "Eu gosto de maçãs e bananas."
Passo 1: Construção do Vocabulário

Extraímos todas as palavras únicas, desconsiderando maiúsculas/minúsculas e pontuação:

Vocabulário: ["eu", "gosto", "de", "maçãs", "não", "bananas", "e"]

Passo 2: Contagem de Frequências

Criamos uma matriz onde as linhas correspondem aos documentos e as colunas às palavras do vocabulário. Cada célula contém a frequência da palavra no documento.

Palavra Documento 1 Documento 2 Documento 3

eu 1 1 1

gosto 1 1 1

de 1 1 1

maçãs 1 0 1

não 0 1 0

bananas 0 1 1

e 0 0 1

Passo 3: Representação Vetorial

Os textos agora podem ser representados como vetores:

Documento 1: [1, 1, 1, 1, 0, 0, 0]

Documento 2: [1, 1, 1, 0, 1, 1, 0]

Documento 3: [1, 1, 1, 1, 0, 1, 1]

A matriz BoW resultante da soma dos vetores:

Matriz BoW: [3, 3, 3, 2, 1, 2, 1]

Implementação do BoW em Python
from sklearn.feature_extraction.text import CountVectorizer
documents = [
"Eu gosto de maçãs."
"Eu não gosto de bananas."
"Eu gosto de maçãs e bananas."
]
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(documents)
print("Vocabulário:", vectorizer.get_feature_names_out())
print("Matriz BoW:")
print(X.toarray())

2. Técnicas de Vetorização (continuação)

2.2. TF-IDF (Term Frequency-Inverse Document Frequency)

O TF-IDF é uma técnica de vetorização que tenta medir a importância de uma palavra dentro de um conjunto de documentos. Ela considera duas informações:

  • Term Frequency (TF): A frequência de uma palavra em um documento específico.
  • Inverse Document Frequency (IDF): A importância da palavra no contexto do corpus, ou seja, quanto mais rara for a palavra em todos os documentos, mais importante ela é.

O TF-IDF é calculado pela multiplicação do Term Frequency (TF) com o Inverse Document Frequency (IDF). A fórmula para o cálculo do TF-IDF é a seguinte:

\(TF-IDF(t, d) = TF(t, d) * log(N / DF(t))\)

Onde:

  • TF(t, d): Frequência do termo t no documento d.
  • N: Número total de documentos no corpus.
  • DF(t): Número de documentos que contêm o termo t.

O TF-IDF ajuda a reduzir a importância das palavras muito comuns, como "de", "para", "a", e destaca palavras que são mais relevantes para cada documento.

Exemplo Prático do TF-IDF

Corpus de Exemplo:

  1. "O gato preto está na casa."
  2. "O cachorro está na casa."
  3. "O gato e o cachorro estão na casa."
Passo 1: Cálculo do Term Frequency (TF)

Primeiro, calculamos a frequência de cada palavra em cada documento:

TF("gato", Doc 1) = 1

TF("preto", Doc 1) = 1

TF("está", Doc 1) = 1

TF("na", Doc 1) = 1

TF("casa", Doc 1) = 1

TF("cachorro", Doc 2) = 1

TF("gato", Doc 3) = 1

TF("cachorro", Doc 3) = 1

Passo 2: Cálculo do Inverse Document Frequency (IDF)

Agora, calculamos a IDF para cada palavra. Para o termo "gato", que aparece em 2 documentos de 3, a fórmula seria:

IDF("gato") = log(3 / 2) ≈ 0.1761

Repetimos esse cálculo para os outros termos, como "preto", "cachorro", etc.

Passo 3: Cálculo do TF-IDF

Finalmente, multiplicamos o TF pelo IDF para calcular o TF-IDF final para cada palavra:

TF-IDF("gato", Doc 1) = 1 * 0.1761 ≈ 0.1761

Esse valor será maior para termos raros no corpus e menor para termos comuns. O resultado final pode ser usado para a vetorização de documentos.

Implementação do TF-IDF em Python
from sklearn.feature_extraction.text import TfidfVectorizer
documents = [
"O gato preto está na casa."
"O cachorro está na casa."
"O gato e o cachorro estão na casa."
]
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(documents)
print("Vocabulário:", vectorizer.get_feature_names_out())
print("Matriz TF-IDF:")
print(X.toarray())

2.3. Técnicas Avançadas de Vetorização: Word2Vec, GloVe e BERT

Embora o BoW e o TF-IDF sejam úteis em muitos cenários, eles possuem limitações, como a incapacidade de capturar relações semânticas complexas entre palavras. Para superar essas limitações, surgiram técnicas mais avançadas, como Word2Vec, GloVe e BERT, que representam as palavras em um espaço vetorial contínuo, onde palavras com significados semelhantes ficam mais próximas.

2.3.1. Word2Vec

O Word2Vec é um modelo de aprendizado profundo que gera representações vetoriais de palavras. Existem duas abordagens principais para treinar o Word2Vec:

  • Skip-Gram: Para uma palavra de entrada, o modelo tenta prever as palavras de contexto ao seu redor.
  • CBOW (Continuous Bag of Words): Para um conjunto de palavras de contexto, o modelo tenta prever a palavra de entrada.

O Word2Vec captura não apenas o significado das palavras, mas também suas relações com outras palavras, como sinônimos e antonímias.

2.3.2. GloVe (Global Vectors for Word Representation)

O GloVe é uma técnica que também gera representações vetoriais de palavras, mas se baseia em uma abordagem diferente do Word2Vec. Em vez de utilizar um modelo de rede neural, o GloVe foca em aprender as representações de palavras a partir de estatísticas globais de co-ocorrência de palavras em um corpus de texto.

2.3.3. BERT (Bidirectional Encoder Representations from Transformers)

O BERT é um modelo de linguagem baseado em transformers que considera o contexto bidirecional das palavras. Em vez de olhar apenas para o contexto anterior ou posterior das palavras, o BERT captura o contexto completo, o que melhora significativamente a qualidade das representações geradas para tarefas como análise de sentimentos, tradução automática, e outras tarefas de PLN.

Comparação entre Word2Vec, GloVe e BERTWord2VecContexto local (neighborhood)Bom, mas limitadoModeradosGloVeContexto global (co-ocorrência)Bom para corpora grandesBaixosBERTContexto bidirecionalExcelente, captura melhor o significado contextualAltos

3. Aplicações Práticas em Processamento de Linguagem Natural

3.1. Análise de Sentimentos

A análise de sentimentos é uma tarefa importante no PLN, que visa determinar a polaridade de um texto, ou seja, se ele expressa uma opinião positiva, negativa ou neutra. Usando as representações vetoriais de palavras geradas pelo Word2Vec, GloVe ou BERT, podemos treinar modelos de aprendizado de máquina para classificar os sentimentos dos textos.

Um modelo de análise de sentimentos pode ser treinado usando exemplos de textos rotulados com sentimentos, como análises de produtos ou postagens em redes sociais. A vetorização das palavras do texto é feita por uma das técnicas mencionadas, e em seguida, essas representações são passadas para um modelo de classificação, como um classificador SVM (Máquinas de Vetores de Suporte), redes neurais, ou até mesmo modelos pré-treinados, como o BERT, para classificar o sentimento.

Exemplo de Implementação em Python
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
from gensim.models import Word2Vec
import numpy as np
# Carregar e pré-processar os dados (corpus maior com 10 elementos)
texts = [
"Este produto é excelente",
"Horrível, não gostei",
"É bom, mas poderia ser melhor",
"Eu amei o produto, super recomendo",
"Péssima qualidade",
"Não gostei do atendimento",
"Muito bom, funcionou perfeitamente",
"O produto não correspondeu às expectativas",
"Gostei bastante, valeu a pena",
"Produto razoável, poderia ser melhor"
]
labels = [1, 0, 1, 1, 0, 0, 1, 0, 1, 0] # 1: positivo, 0: negativo
# Treinar o modelo Word2Vec
processed_texts = [text.split() for text in texts]
model = Word2Vec(sentences=processed_texts, vector_size=100, window=5, min_count=1)
# Função para calcular o vetor médio de uma frase
def get_average_vector(text, model):
words = text.split()
word_vectors = [model.wv[word] for word in words if word in model.wv]
if word_vectors:
return np.mean(word_vectors, axis=0)
else:
return np.zeros(model.vector_size)
# Transformar textos em vetores médios de palavras
X = [get_average_vector(text, model) for text in texts]
# Dividir dados em treino e teste
X_train, X_test, y_train, y_test = train_test_split(X, labels, test_size=0.2)
# Treinar classificador SVM
svm = SVC(probability=True)
svm.fit(X_train, y_train)
# Avaliar a precisão
y_pred = svm.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")
# Função para avaliar nova frase
def avaliar_frase(frase, model, svm):
frase_vector = get_average_vector(frase, model)
probabilidade = svm.predict_proba([frase_vector])[0][1]
sentimento = "Positivo" if probabilidade > 0.5 else "Negativo"
# Avaliar uma nova frase após o treinamento
nova_frase = input("
Digite uma nova frase para avaliar o sentimento: ")
avaliar_frase(nova_frase, model, svm)

3.2. Tradução Automática

A tradução automática é uma tarefa desafiadora no PLN, que visa traduzir um texto de um idioma para outro. Modelos como o Word2Vec, GloVe e principalmente o BERT, podem ser usados para representar palavras em diferentes idiomas e capturar as relações semânticas entre elas. Para tradução automática, utilizamos principalmente redes neurais, especialmente as redes neurais seq2seq (sequence-to-sequence) e transformers.

A arquitetura Transformer, por exemplo, tem sido fundamental no avanço da tradução automática, sendo a base de modelos como o BERT e o GPT (Generative Pre-trained Transformer). Esses modelos aprendem o contexto das palavras em um texto e conseguem gerar traduções precisas.

Exemplo de Implementação com BERT para Tradução
from transformers import MarianMTModel, MarianTokenizer
# Carregar o modelo e tokenizer para tradução de inglês para francês
model_name = "Helsinki-NLP/opus-mt-en-fr"
model = MarianMTModel.from_pretrained(model_name)
tokenizer = MarianTokenizer.from_pretrained(model_name)
# Traduzir uma sentença
sentence = "I love programming."
translated = tokenizer.encode(sentence, return_tensors="pt")
translation = model.generate(translated)
# Decodificar a tradução
translated_sentence = tokenizer.decode(translation[0], skip_special_tokens=True)
print("Tradução:", translated_sentence)

3.3. Outras Aplicações do PLN com Vetores de Palavras

Além da análise de sentimentos e tradução automática, as representações vetoriais de palavras têm uma variedade de outras aplicações, como:

  • Classificação de Texto: Para categorizar documentos em diferentes classes (ex: notícias, emails, etc.).
  • Geração de Texto: Modelos como GPT-3 geram texto coerente e fluido, útil para chatbots e assistentes virtuais.
  • Respostas Automáticas: Sistemas de perguntas e respostas, como o ChatGPT, podem usar essas representações para entender e gerar respostas para perguntas complexas.
  • Busca Semântica: Melhorar os motores de busca para entender a intenção por trás das palavras, ao invés de simplesmente buscar por correspondência exata.
Exemplo de Implementação de Classificação de Texto
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import CountVectorizer
# Carregar dados de exemplo para classificação
documents = ["Eu amo programação", "Este é um bom livro", "O filme foi um desastre"]
labels = [1, 1, 0] # 1: positivo, 0: negativo
# Vetorização com CountVectorizer
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(documents)
# Treinar o classificador Naive Bayes
classifier = MultinomialNB()
classifier.fit(X, labels)
# Prever a classe de um novo documento
new_doc = ["Eu detestei o filme"]
X_new = vectorizer.transform(new_doc)
prediction = classifier.predict(X_new)
print("Predição:", prediction)

Confira, neste link do Colab, os exemplos apresentados nesta postagem:Clique aqui para acessar.

Para comentários:

Se quiser comentar, sugerir (acréscimos, retificações etc), criticar, elogiar, informar, sobre algum trecho deste artigo, peço a gentileza de utilizar a área de comentários do abaixo informada, no Youtube.

Já existe uma mensagem por lá dedicada a comentários sobre temas publicados neste portal.

Essa também é uma forma de contribuir com o trabalho e estimular sua continuidade e aprimoramento.

Peço a gentileza de comentar, curtir e compartilhar o conteúdo, além de se inscrever no canal do Youtube e ativar o sino de notificações para receber notícias de novos conteúdos.

Agradeço desde já!

Destinado para esses comentários em geral:

https://www.youtube.com/@roberto_csantos/community