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.