Como implementar o Word2Vec em Python

Como implementar o Word2Vec em Python

Nessa aula iremos ver um exemplo de implementação de como utilizar o Word2Vec na linguagem python. É claro que o exemplo que utilizaremos o algoritmo já está pré implementado e estaremos apenas utilizando o código. Vale a pena compreender cada passo, pois a partir deste código você poderá reutiliza-lo para suas aplicações.

Recordando…

Antes de qualquer coisa, precisamos deixar bem claro que o algoritmo word2vec é uma implementação muito famosa que usa redes neurais para trabalhar com vetores de palavras. Sendo assim, é importantíssimo que você entenda o que são vetores de palavras.

Se você não sabe o que são vetores de palavras clique aqui.

Outra coisa importante é que para você entender o poder desse tipo de aplicação, você precisará compreender um pouco sobre o as limitações dos outros tipos de modelos como o Bag of Words. Isso tudo faz parte de uma grande área que é o processamento de linguagem natural, para entender mais acesse nosso curso de PLN.

Antes de mais nada…

Lembre-se que a implementação que vamos trabalhar nesse post precisa de um ambiente Python funcional e configurado. Recomendamos que você instale o Anaconda para trabalhar com ciência de dados e PLN.

Se você não sabe instalar o anaconda, veja esse nosso tutorial.

Implementação do word2vec em Python

O primeiro passo é importar as bibliotecas necessárias para realizar a extração, pré-processamento e criação do modelo.

import nltk
import urllib
import bs4 as bs
import re
from gensim.models import Word2Vec
from nltk.corpus import stopwords

Para nosso exemplo, utilizemos um artigo qualquer da wikipedia:

# pega os dados e transforma tudo em uma string
source = urllib.request.urlopen('https://en.wikipedia.org/wiki/Global_warming')

soup = bs.BeautifulSoup(source, 'lxml')
text = ""
for paragraph in soup.find_all('p'):
    text+= paragraph.text

A seguir realizaremos o pré-processamento dos dados obtidos removendo todas as palavras e símbolos desnecessários para o treinamento do nosso modelo:

# faz o pré processamento removendo caracteres que podem atrapalhar
text = re.sub(r'[[0-9]*]', ' ', text)
text = re.sub(r's+', ' ', text)
text = text.lower()
text = re.sub(r'[@#$%&*()<>'":;][-]',' ', text)
text = re.sub(r'd', ' ', text)
text = re.sub(r's+', ' ', text)

Como um passo adicional ao pré-processamento removeremos as stopwords:

sentences = nltk.sent_tokenize(text)

sentences = [nltk.word_tokenize(sentence) for sentence in sentences]

#faz a remoção de stopwords

for i in range(len(sentences)):
    sentences[i] = [word for word in sentences[i] if word not in stopwords.words('English')]

Por fim, utilizaremos o Word2vec para encontrar palavras similares:

model = Word2Vec(sentences, min_count=1)

words = model.wv.vocab

vector = model.wv['global']

# busca a palavra mais similar
similar = model.wv.most_similar('global')
print (similar)

O resultado mostrado pelo terminal é:

[
('cause', 0.3966740071773529), 
('atmospheric', 0.38441428542137146), 
('causes', 0.36916446685791016), 
('energy', 0.35318630933761597), 
('public', 0.35127368569374084), 
('increase', 0.33147305250167847), 
('feedbacks', 0.32824572920799255), 
('contemporary', 0.32718780636787415), 
('scientific', 0.32547885179519653), 
('temperatures', 0.32432469725608826)
]

Podemos perceber que a palavra que está mais próxima do termo “global” é “cause”. Porém, existem outras muito próximas como “atmospheric”, “causes”, “energy”.

Conclusão


O modelo Word2Vec possui diversas funcionalidades, cabe ao profissional de ciências de dados entender como isso poderá ser utilizado em uma nova abordagem de PLN. As palavras similares, por exemplo, podem ser utilizadas para encontrar sugestões de palavras para buscas efetuadas pelo usuário em mecanismos de busca. 

Vinicius dos Santos

Apenas um apaixonado por Ciência da Computação e forma com que ela pode transformar vidas!

Deixe uma resposta