- Introduction
- Aximações de incorporação de palavras
- Bag of Words
- Pros e Cons de saco de palavras
- TF-IDF Scheme
- Pros e Cons de TF-IDF
- Palavra2Vec
- Pros e Cons de Word2Vec
- Palavra2Vec em Python com Gensim Library
- Criando Corpus
- Pré-processamento
- Criando o modelo Word2Vec
- Análise do modelo
- Procurando vetores para um Word
- Finding Similar Words
- Conclusion
Introduction
Humans têm uma habilidade natural de entender o que outras pessoas estão dizendo e o que dizer em resposta. Esta capacidade é desenvolvida pela interacção consistente com outras pessoas e com a sociedade ao longo de muitos anos. A linguagem tem um papel muito importante na forma como os humanos interagem. As línguas que os humanos usam para interagir são chamadas línguas naturais.
As regras de várias línguas naturais são diferentes. Contudo, há uma coisa em comum nas línguas naturais: flexibilidade e evolução.
As línguas naturais são muito flexíveis. Suponha, você está dirigindo um carro e seu amigo diz uma dessas três afirmações: “Encoste”, “Pare o carro”, “Pare”. Você imediatamente compreende que ele lhe está a pedir para parar o carro. Isto é porque as linguagens naturais são extremamente flexíveis. Há várias maneiras de dizer uma coisa.
Outro aspecto importante das linguagens naturais é o fato de que elas estão constantemente evoluindo. Por exemplo, há alguns anos atrás não havia um termo como “Google it”, que se refere à procura de algo no motor de busca do Google. As linguagens naturais estão sempre em evolução.
Pelo contrário, as linguagens de computador seguem uma sintaxe estrita. Se você quiser dizer a um computador para imprimir algo na tela, há um comando especial para isso. A tarefa do Processamento de Linguagem Natural é fazer os computadores entenderem e gerarem a linguagem humana de uma forma semelhante aos humanos.
Esta é uma tarefa enorme e há muitos obstáculos envolvidos. Esta palestra em vídeo da Universidade de Michigan contém uma explicação muito boa de porque a PNL é tão difícil.
Neste artigo vamos implementar a técnica de incorporação de palavras Word2Vec usada para criar vetores de palavras com a biblioteca Gensim do Python. No entanto, antes de saltarmos directamente para a secção de codificação, vamos primeiro rever brevemente algumas das técnicas de incorporação de palavras mais utilizadas, juntamente com os seus prós e contras.
Aximações de incorporação de palavras
Uma das razões pelas quais o Processamento de Linguagem Natural é um problema difícil de resolver é o facto de que, ao contrário dos seres humanos, os computadores só conseguem compreender números. Temos que representar as palavras em um formato numérico que seja compreensível para os computadores. A incorporação de palavras refere-se às representações numéricas das palavras.
A abordagem de incorporação de palavras Severais existe actualmente e todas elas têm os seus prós e contras. Vamos discutir três delas aqui:
- Bag of Words
- TF-IDF Scheme
- Palavra2Vec
Bag of Words
A abordagem do saco de palavras é uma das mais simples abordagens de incorporação de palavras. A seguir são apresentados os passos para gerar os embaixamentos de palavras usando a abordagem do saco de palavras.
Vemos os embaixamentos de palavras gerados pela abordagem do saco de palavras com a ajuda de um exemplo. Suponha que você tenha um corpus com três frases.
- S1 = Eu adoro chuva
- S2 = chuva vai embora
- S3 = Eu estou longe
Para converter as frases acima em suas representações de incorporação de palavras correspondentes usando a aproximação do saco de palavras, precisamos executar os seguintes passos:
Nota que para S2 adicionamos 2 no lugar de “chuva” no dicionário; isto porque S2 contém “chuva” duas vezes.
Pros e Cons de saco de palavras
A abordagem de saco de palavras tem tanto prós como contras. A principal vantagem da abordagem do saco de palavras é que você não precisa de um corpo de palavras muito grande para obter bons resultados. Você pode ver que construímos um modelo muito básico de saco de palavras com três frases. Em termos computacionais, um modelo de saco de palavras não é muito complexo.
Uma grande desvantagem da abordagem de saco de palavras é o facto de que precisamos de criar enormes vectores com espaços vazios para representar um número (matriz esparsa) que consome memória e espaço. No exemplo anterior, nós tínhamos apenas 3 frases. No entanto, você pode ver três zeros em cada vetor.
Imagine um corpus com milhares de artigos. Neste caso, o número de palavras únicas em um dicionário pode ser de milhares. Se um documento contém 10% das palavras únicas, o vector de incorporação correspondente ainda conterá 90% de zeros.
Outra questão importante com a abordagem do saco de palavras é o facto de não manter qualquer informação de contexto. Ele não se importa com a ordem na qual as palavras aparecem em uma frase. Por exemplo, ele trata as frases “Garrafa está no carro” e “Carro está na garrafa” igualmente, que são frases totalmente diferentes.
Uma abordagem tipo saco de palavras, conhecida como n-grams, pode ajudar a manter a relação entre as palavras. N-grama refere-se a uma sequência contígua de n palavras. Por exemplo, 2-gramas para a frase “Você não está feliz”, são “Você está”, “não está” e “não está feliz”. Embora a abordagem n-grams seja capaz de capturar as relações entre palavras, o tamanho do conjunto de características cresce exponencialmente com muitos n-grams.
TF-IDF Scheme
O esquema TF-IDF é um tipo de abordagem de palavras em saco onde em vez de adicionar zeros e uns no vector de incorporação, você adiciona números flutuantes que contêm mais informação útil em comparação com zeros e uns. A idéia por trás do esquema TF-IDF é que palavras com alta freqüência de ocorrência em um documento, e menos freqüência de ocorrência em todos os outros documentos, são mais cruciais para a classificação.
TF-IDF é um produto de dois valores: Frequência de Termos (TF) e Frequência Inversa do Documento (IDF).
A frequência de ocorrência refere-se ao número de vezes que uma palavra aparece no documento e pode ser calculada como:
Term frequence = (Number of Occurences of a word)/(Total words in the document)
Por exemplo, se olharmos para a frase S1 da secção anterior i.e. “Eu adoro chuva”, cada palavra na frase ocorre uma vez e portanto tem uma frequência de 1. “rain go away”, a frequência de “rain” é duas enquanto que para o resto das palavras, é 1.
IDF refere-se ao log do número total de documentos dividido pelo número de documentos em que a palavra existe, e pode ser calculado como:
IDF(word) = Log((Total number of documents)/(Number of documents containing the word))
Por exemplo, o valor IDF para a palavra “rain” é 0.1760, já que o número total de documentos é 3 e rain aparece em 2 deles, portanto log(3/2)
é 0.1760. Por outro lado, se você olhar para a palavra “love” na primeira frase, ela aparece em um dos três documentos e portanto seu valor IDF é log(3)
, que é 0.4771.
Pros e Cons de TF-IDF
Though TF-IDF é uma melhoria em relação à abordagem simples do saco de palavras e produz melhores resultados para tarefas comuns de PNL, os prós e contras gerais permanecem os mesmos. Ainda precisamos criar uma enorme matriz esparsa, que também requer muito mais computação do que a abordagem do simples saco de palavras.
Palavra2Vec
The <a target=”_blank rel=”nofollow”” href=”https://en.wikipedia.org/wiki/Word2vec”>A abordagem de incorporação da palavra2Vec, desenvolvida por Tomas Mikolov, é considerada o estado da arte. A abordagem Word2Vec utiliza técnicas baseadas em aprendizagem profunda e redes neurais para converter palavras em vectores correspondentes, de tal forma que os vectores semanticamente semelhantes estão próximos uns dos outros no espaço N-dimensional, onde N se refere às dimensões do vector.
Word2Vec retorna alguns resultados surpreendentes. A capacidade do Word2Vec de manter uma relação semântica é reflectida por um exemplo clássico onde se tiver um vector para a palavra “Rei” e remover o vector representado pela palavra “Homem” do “Rei” e adicionar-lhe “Mulher”, obtém-se um vector que está próximo do vector “Rainha”. Esta relação é normalmente representada como:
King - Man + Women = Queen
Modelo Word2Vec vem em dois sabores: Skip Gram Model e Continuous Bag of Words Model (CBOW).
No modelo Skip Gram, as palavras de contexto são previstas usando a palavra base. Por exemplo, dada uma frase “I love to dance in the rain”, o modelo Skip gram irá prever “love” e “dance” dada a palavra “to” como input.
O contrário, o modelo CBOW irá prever “to”, se as palavras de contexto “love” e “dance” forem alimentadas como input para o modelo. O modelo aprende estas relações usando redes neurais profundas.
Pros e Cons de Word2Vec
Word2Vec tem várias vantagens sobre o saco de palavras e o esquema IF-IDF. Word2Vec retém o significado semântico de diferentes palavras em um documento. A informação do contexto não é perdida. Outra grande vantagem da abordagem do Word2Vec é que o tamanho do vector de incorporação é muito pequeno. Cada dimensão no vector de incorporação contém informação sobre um aspecto da palavra. Não precisamos de grandes vetores esparsos, ao contrário do saco de palavras e abordagens TF-IDF.
Note: Os detalhes matemáticos de como o Word2Vec funciona envolvem uma explicação de redes neurais e probabilidade softmax, que está além do escopo deste artigo. Se você quiser entender os fundamentos matemáticos do Word2Vec, por favor leia este artigo: https://arxiv.org/abs/1301.3781
Palavra2Vec em Python com Gensim Library
Nesta seção, vamos implementar o modelo Word2Vec com a ajuda da biblioteca Gensim de Python. Siga estes passos:
Criando Corpus
Discutimos anteriormente que para criar um modelo Word2Vec, precisamos de um corpus. Em aplicações da vida real, os modelos do Word2Vec são criados usando bilhões de documentos. Por exemplo, o modelo Word2Vec do Google é treinado usando 3 milhões de palavras e frases. No entanto, para simplificar, vamos criar um modelo Word2Vec usando um único artigo da Wikipedia. O nosso modelo não será tão bom como o do Google. Embora seja bom o suficiente para explicar como o modelo Word2Vec pode ser implementado usando a biblioteca Gensim.
Antes de podermos resumir os artigos da Wikipedia, precisamos ir buscá-los. Para fazer isso, vamos usar algumas bibliotecas. A primeira biblioteca que precisamos baixar é a biblioteca Beautiful Soup, que é um utilitário Python muito útil para raspagem da web. Execute o seguinte comando no prompt de comando para baixar o utilitário Beautiful Soup.
$ pip install beautifulsoup4
Uma outra biblioteca importante que precisamos para analisar XML e HTML é a biblioteca lxml. Execute o seguinte comando no prompt de comando para baixar lxml:
$ pip install lxml
O artigo que vamos raspar é o artigo da Wikipedia sobre Inteligência Artificial. Vamos escrever um script Python para raspar o artigo da Wikipedia:
No script acima, vamos primeiro baixar o artigo da Wikipedia usando o método urlopen
da classe request
da biblioteca urllib
. Depois lemos o conteúdo do artigo e o analisamos usando um objeto da classe BeautifulSoup
. A Wikipedia armazena o conteúdo do texto do artigo dentro das tags p
. Usamos a função find_all
do objeto BeautifulSoup
para ir buscar todo o conteúdo das tags dos parágrafos do artigo.
Finalmente, juntamos todos os parágrafos e armazenamos o artigo raspado em article_text
variável para uso posterior.
Pré-processamento
Neste ponto agora importamos o artigo. O próximo passo é o pré-processamento do conteúdo para o modelo Word2Vec. O seguinte script pré-processa o texto:
No script acima, nós convertemos todo o texto para minúsculas e então removemos todos os dígitos, caracteres especiais e espaços extras do texto. Após o pré-processamento, só ficamos com as palavras.
O modelo Word2Vec é treinado em uma coleção de palavras. Primeiro, precisamos converter nosso artigo em sentenças. Nós usamos nltk.sent_tokenize
utilidade para converter o nosso artigo em frases. Para converter frases em palavras, usamos o utilitário nltk.word_tokenize
. Como último passo de pré-processamento, removemos todas as palavras de parada do texto.
Após o script completar sua execução, o objeto all_words
contém a lista de todas as palavras do artigo. Vamos usar esta lista para criar nosso modelo Word2Vec com a biblioteca Gensim.
Criando o modelo Word2Vec
Com Gensim, é extremamente simples criar o modelo Word2Vec. A lista de palavras é passada para a classe Word2Vec
do pacote gensim.models
. Precisamos especificar o valor para o parâmetro min_count
. Um valor de 2 para min_count
especifica para incluir apenas aquelas palavras no modelo Word2Vec que aparecem pelo menos duas vezes no corpus. O seguinte script cria o modelo Word2Vec usando o artigo da Wikipedia que raspamos.
from gensim.models import Word2Vecword2vec = Word2Vec(all_words, min_count=2)
Para ver o dicionário de palavras únicas que existem pelo menos duas vezes no corpus, execute o seguinte script:
vocabulary = word2vec.wv.vocabprint(vocabulary)
Quando o script acima for executado, você verá uma lista de todas as palavras únicas que ocorrem pelo menos duas vezes.
Análise do modelo
Criamos com sucesso o nosso modelo Word2Vec na última seção. Agora é a hora de explorar o que criamos.
Procurando vetores para um Word
Sabemos que o modelo Word2Vec converte palavras para seus vetores correspondentes. Vamos ver como podemos ver a representação vectorial de qualquer palavra em particular.
v1 = word2vec.wv
O vector v1
contém a representação vectorial para a palavra “artificial”. Por padrão, uma centena de vetores dimensionais é criada por Gensim Word2Vec. Este é um vetor muito, muito menor em comparação com o que teria sido produzido pelo saco de palavras. Se utilizarmos a aproximação do saco de palavras para embutir o artigo, o comprimento do vector para cada um será 1206, uma vez que existem 1206 palavras únicas com uma frequência mínima de 2. Se a frequência mínima de ocorrência for definida para 1, o tamanho do saco de palavras vector irá aumentar ainda mais. Por outro lado, os vetores gerados através do Word2Vec não são afetados pelo tamanho do vocabulário.
Finding Similar Words
Earlier dissemos que a informação contextual das palavras não é perdida usando a abordagem do Word2Vec. Podemos verificar isso encontrando todas as palavras semelhantes à palavra “inteligência”.
Dê uma olhada no seguinte script:
sim_words = word2vec.wv.most_similar('intelligence')
Se você imprimir a variável sim_words
para o console, você verá as palavras mais semelhantes à “inteligência” como mostrado abaixo:
Do output, você pode ver as palavras semelhantes à “inteligência” juntamente com seu índice de similaridade. A palavra “ai” é a palavra mais parecida com “inteligência” de acordo com o modelo, o que realmente faz sentido. Da mesma forma, palavras como “humano” e “artificial” muitas vezes coexistem com a palavra “inteligência”. Nosso modelo captou com sucesso essas relações usando apenas um único artigo da Wikipédia.
Conclusion
Neste artigo, implementamos um modelo de incorporação de palavras Word2Vec com a biblioteca Gensim do Python. Nós fizemos isso raspando um artigo da Wikipedia e construímos nosso modelo Word2Vec usando o artigo como um corpus. Também revisamos brevemente as abordagens de incorporação de palavras mais usadas, juntamente com seus prós e contras, como uma comparação com o Word2Vec.
Eu sugeriria que você criasse um modelo Word2Vec próprio com a ajuda de qualquer corpus de texto e ver se você pode obter melhores resultados em comparação com a abordagem do saco de palavras.