Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Implementando o Word2Vec | Embeddings de Palavras
Introdução ao PLN

bookImplementando o Word2Vec

Tendo compreendido como o Word2Vec funciona, vamos prosseguir para implementá-lo utilizando Python. A biblioteca Gensim, uma ferramenta robusta e de código aberto para processamento de linguagem natural, oferece uma implementação direta por meio da classe Word2Vec em gensim.models.

Preparando os Dados

O Word2Vec requer que os dados de texto sejam tokenizados, ou seja, divididos em uma lista de listas onde cada lista interna contém as palavras de uma sentença específica. Neste exemplo, utilizaremos o romance Emma da autora inglesa Jane Austen como nosso corpus. Vamos carregar um arquivo CSV contendo sentenças pré-processadas e, em seguida, dividir cada sentença em palavras:

12345678
import pandas as pd emma_df = pd.read_csv( 'https://staging-content-media-cdn.codefinity.com/courses/c68c1f2e-2c90-4d5d-8db9-1e97ca89d15e/section_4/chapter_3/emma.csv') # Split each sentence into words sentences = emma_df['Sentence'].str.split() # Print the fourth sentence (list of words) print(sentences[3])
copy

emma_df['Sentence'].str.split() aplica o método .split() a cada sentença na coluna 'Sentence', resultando em uma lista de palavras para cada sentença. Como as sentenças já foram pré-processadas, com as palavras separadas por espaços em branco, o método .split() é suficiente para essa tokenização.

Treinamento do Modelo Word2Vec

Agora, foco no treinamento do modelo Word2Vec utilizando os dados tokenizados. A classe Word2Vec oferece diversos parâmetros para personalização. No entanto, os parâmetros mais comuns são:

  • vector_size (100 por padrão): dimensionalidade ou tamanho dos embeddings de palavras;
  • window (5 por padrão): tamanho da janela de contexto;
  • min_count (5 por padrão): palavras que ocorrem menos vezes que esse valor serão ignoradas;
  • sg (0 por padrão): arquitetura do modelo a ser utilizada (1 para Skip-gram, 0 para CBoW).
  • cbow_mean (1 por padrão): especifica se o contexto de entrada do CBoW é somado (0) ou feito a média (1)

Sobre as arquiteturas do modelo, CBoW é indicado para conjuntos de dados maiores e cenários onde a eficiência computacional é essencial. Skip-gram, por outro lado, é preferível para tarefas que exigem compreensão detalhada dos contextos das palavras, sendo particularmente eficaz em conjuntos de dados menores ou ao lidar com palavras raras.

12345678
from gensim.models import Word2Vec import pandas as pd emma_df = pd.read_csv( 'https://staging-content-media-cdn.codefinity.com/courses/c68c1f2e-2c90-4d5d-8db9-1e97ca89d15e/section_4/chapter_3/emma.csv') sentences = emma_df['Sentence'].str.split() # Initialize the model model = Word2Vec(sentences, vector_size=200, window=5, min_count=1, sg=0)
copy

Aqui, definimos o tamanho do embedding como 200, o tamanho da janela de contexto como 5 e incluímos todas as palavras ao definir min_count=1. Ao definir sg=0, optamos por usar o modelo CBoW.

Note
Estude Mais

A escolha do tamanho do embedding e da janela de contexto envolve compensações. Embeddings maiores capturam mais significado, mas aumentam o custo computacional e o risco de overfitting. Janelas de contexto menores são melhores para capturar sintaxe, enquanto janelas maiores são melhores para capturar semântica.

Encontrando Palavras Semelhantes

Uma vez que as palavras são representadas como vetores, podemos compará-las para medir similaridade. Embora seja possível usar distância, a direção de um vetor geralmente carrega mais significado semântico do que sua magnitude, especialmente em embeddings de palavras.

No entanto, usar o ângulo como métrica de similaridade diretamente não é tão conveniente. Em vez disso, podemos usar o cosseno do ângulo entre dois vetores, também conhecido como similaridade do cosseno. Ela varia de -1 a 1, com valores mais altos indicando maior similaridade. Essa abordagem foca em quão alinhados os vetores estão, independentemente do comprimento, tornando-a ideal para comparar significados de palavras. Veja uma ilustração:

Angles

Quanto maior a similaridade do cosseno, mais semelhantes são os dois vetores, e vice-versa. Por exemplo, se dois vetores de palavras possuem uma similaridade do cosseno próxima de 1 (ângulo próximo de 0 graus), isso indica que eles estão intimamente relacionados ou são semelhantes em contexto dentro do espaço vetorial.

Agora, vamos encontrar as 5 palavras mais semelhantes à palavra "man" usando a similaridade do cosseno:

12345678910
from gensim.models import Word2Vec import pandas as pd emma_df = pd.read_csv( 'https://staging-content-media-cdn.codefinity.com/courses/c68c1f2e-2c90-4d5d-8db9-1e97ca89d15e/section_4/chapter_3/emma.csv') sentences = emma_df['Sentence'].str.split() model = Word2Vec(sentences, vector_size=200, window=5, min_count=1, sg=0) # Retrieve the top-5 most similar words to 'man' similar_words = model.wv.most_similar('man', topn=5) print(similar_words)
copy

model.wv acessa os vetores de palavras do modelo treinado, enquanto o método .most_similar() encontra as palavras cujos embeddings estão mais próximos do embedding da palavra especificada, com base na similaridade do cosseno. O parâmetro topn determina o número de N palavras mais similares a serem retornadas.

question mark

Qual modelo é mais adequado para lidar com palavras raras dentro de um corpus?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 4. Capítulo 3

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

Suggested prompts:

Can you explain how to interpret the output of the most_similar() method?

What other parameters can I adjust in the Word2Vec model for different results?

How can I use the trained model to find similarities between other words?

Awesome!

Completion rate improved to 3.45

bookImplementando o Word2Vec

Deslize para mostrar o menu

Tendo compreendido como o Word2Vec funciona, vamos prosseguir para implementá-lo utilizando Python. A biblioteca Gensim, uma ferramenta robusta e de código aberto para processamento de linguagem natural, oferece uma implementação direta por meio da classe Word2Vec em gensim.models.

Preparando os Dados

O Word2Vec requer que os dados de texto sejam tokenizados, ou seja, divididos em uma lista de listas onde cada lista interna contém as palavras de uma sentença específica. Neste exemplo, utilizaremos o romance Emma da autora inglesa Jane Austen como nosso corpus. Vamos carregar um arquivo CSV contendo sentenças pré-processadas e, em seguida, dividir cada sentença em palavras:

12345678
import pandas as pd emma_df = pd.read_csv( 'https://staging-content-media-cdn.codefinity.com/courses/c68c1f2e-2c90-4d5d-8db9-1e97ca89d15e/section_4/chapter_3/emma.csv') # Split each sentence into words sentences = emma_df['Sentence'].str.split() # Print the fourth sentence (list of words) print(sentences[3])
copy

emma_df['Sentence'].str.split() aplica o método .split() a cada sentença na coluna 'Sentence', resultando em uma lista de palavras para cada sentença. Como as sentenças já foram pré-processadas, com as palavras separadas por espaços em branco, o método .split() é suficiente para essa tokenização.

Treinamento do Modelo Word2Vec

Agora, foco no treinamento do modelo Word2Vec utilizando os dados tokenizados. A classe Word2Vec oferece diversos parâmetros para personalização. No entanto, os parâmetros mais comuns são:

  • vector_size (100 por padrão): dimensionalidade ou tamanho dos embeddings de palavras;
  • window (5 por padrão): tamanho da janela de contexto;
  • min_count (5 por padrão): palavras que ocorrem menos vezes que esse valor serão ignoradas;
  • sg (0 por padrão): arquitetura do modelo a ser utilizada (1 para Skip-gram, 0 para CBoW).
  • cbow_mean (1 por padrão): especifica se o contexto de entrada do CBoW é somado (0) ou feito a média (1)

Sobre as arquiteturas do modelo, CBoW é indicado para conjuntos de dados maiores e cenários onde a eficiência computacional é essencial. Skip-gram, por outro lado, é preferível para tarefas que exigem compreensão detalhada dos contextos das palavras, sendo particularmente eficaz em conjuntos de dados menores ou ao lidar com palavras raras.

12345678
from gensim.models import Word2Vec import pandas as pd emma_df = pd.read_csv( 'https://staging-content-media-cdn.codefinity.com/courses/c68c1f2e-2c90-4d5d-8db9-1e97ca89d15e/section_4/chapter_3/emma.csv') sentences = emma_df['Sentence'].str.split() # Initialize the model model = Word2Vec(sentences, vector_size=200, window=5, min_count=1, sg=0)
copy

Aqui, definimos o tamanho do embedding como 200, o tamanho da janela de contexto como 5 e incluímos todas as palavras ao definir min_count=1. Ao definir sg=0, optamos por usar o modelo CBoW.

Note
Estude Mais

A escolha do tamanho do embedding e da janela de contexto envolve compensações. Embeddings maiores capturam mais significado, mas aumentam o custo computacional e o risco de overfitting. Janelas de contexto menores são melhores para capturar sintaxe, enquanto janelas maiores são melhores para capturar semântica.

Encontrando Palavras Semelhantes

Uma vez que as palavras são representadas como vetores, podemos compará-las para medir similaridade. Embora seja possível usar distância, a direção de um vetor geralmente carrega mais significado semântico do que sua magnitude, especialmente em embeddings de palavras.

No entanto, usar o ângulo como métrica de similaridade diretamente não é tão conveniente. Em vez disso, podemos usar o cosseno do ângulo entre dois vetores, também conhecido como similaridade do cosseno. Ela varia de -1 a 1, com valores mais altos indicando maior similaridade. Essa abordagem foca em quão alinhados os vetores estão, independentemente do comprimento, tornando-a ideal para comparar significados de palavras. Veja uma ilustração:

Angles

Quanto maior a similaridade do cosseno, mais semelhantes são os dois vetores, e vice-versa. Por exemplo, se dois vetores de palavras possuem uma similaridade do cosseno próxima de 1 (ângulo próximo de 0 graus), isso indica que eles estão intimamente relacionados ou são semelhantes em contexto dentro do espaço vetorial.

Agora, vamos encontrar as 5 palavras mais semelhantes à palavra "man" usando a similaridade do cosseno:

12345678910
from gensim.models import Word2Vec import pandas as pd emma_df = pd.read_csv( 'https://staging-content-media-cdn.codefinity.com/courses/c68c1f2e-2c90-4d5d-8db9-1e97ca89d15e/section_4/chapter_3/emma.csv') sentences = emma_df['Sentence'].str.split() model = Word2Vec(sentences, vector_size=200, window=5, min_count=1, sg=0) # Retrieve the top-5 most similar words to 'man' similar_words = model.wv.most_similar('man', topn=5) print(similar_words)
copy

model.wv acessa os vetores de palavras do modelo treinado, enquanto o método .most_similar() encontra as palavras cujos embeddings estão mais próximos do embedding da palavra especificada, com base na similaridade do cosseno. O parâmetro topn determina o número de N palavras mais similares a serem retornadas.

question mark

Qual modelo é mais adequado para lidar com palavras raras dentro de um corpus?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 4. Capítulo 3
some-alt