Gensim Tutorial – Um Guia Completo para Iniciantes

Gensim é cobrado como um pacote de Processamento de Linguagem Natural que faz ‘Modelagem Tópica para Humanos’. Mas é praticamente muito mais do que isso. É um pacote líder e de última geração para o processamento de textos, trabalhando com modelos vetoriais de palavras (como Word2Vec, FastText etc) e para a construção de modelos tópicos.

Gensim Tutorial – Um Guia Completo para Iniciantes. Foto de Jasmin Schreiber

Conteúdo

1. Introdução
2. O que é um Dicionário e um Corpus?
3. Como criar um Dicionário a partir de uma lista de frases?
4. Como criar um Dicionário a partir de um ou mais ficheiros de texto?
5. Como criar um saco de palavras corpus in gensim?
6. Como criar um conjunto de palavras corpus a partir de um arquivo de texto externo?
7. Como salvar um dicionário de gensim e corpus em disco e carregá-los de volta?
8. Como criar a matriz TFIDF (corpus) em gensim?
9. Como utilizar a API do download do gensim para carregar conjuntos de dados?
10. Como criar bigramas e trigramas usando modelos Phraser?
11. Como criar modelos tópicos com LDA?
12. Como interpretar a saída do LDA Topic Model?
13. Como criar um modelo tópico LSI usando o gensim?
14. Como treinar o modelo Word2Vec usando o gensim?
15. Como atualizar um modelo Word2Vec existente com novos dados?
16. Como extrair vetores de palavras usando modelos Word2Vec e FastText pré-treinados?
17. Como criar vetores de documento usando Doc2Vec?
18. Como calcular métricas de similaridade como similaridade cosseno e similaridade cosseno suave?
19. Como resumir documentos de texto?
20. Conclusão

Introdução

O que é gensim?

Gensim é faturado como um pacote de Processamento de Linguagem Natural que faz ‘Modelagem Tópica para Humanos’. Mas é praticamente muito mais do que isso.

Se você não está familiarizado com modelagem de tópicos, é uma técnica para extrair os tópicos subjacentes de grandes volumes de texto. Gensim fornece algoritmos como LDA e LSI (que veremos mais adiante neste post) e a sofisticação necessária para construir modelos de tópicos de alta qualidade.

Você pode argumentar que modelos de tópicos e incorporação de palavras estão disponíveis em outros pacotes como scikit, R etc. Mas a largura e o escopo das facilidades para construir e avaliar modelos de tópicos são inigualáveis no gensim, além de muitas facilidades mais convenientes para processamento de texto.

É um ótimo pacote para processar textos, trabalhando com modelos vetoriais de palavras (como Word2Vec, FastText etc) e para construir modelos de tópicos.

Também, outra vantagem significativa com o gensim é: ele permite lidar com grandes arquivos de texto sem ter que carregar o arquivo inteiro na memória.

Este post pretende dar uma visão prática de quase todas as principais características, explicadas de uma forma simples e fácil de entender.

Ao final deste tutorial, você saberia:

  • Quais são os conceitos centrais no gensim?
  • O que é dicionário e corpus, porque são importantes e onde usá-los?
  • Como criar e trabalhar com dicionário e corpus?
  • Como carregar e trabalhar com dados de texto de múltiplos arquivos de texto de forma eficiente na memória
  • Criar modelos tópicos com LDA e interpretar as saídas
  • Criar modelo TFIDF, bigramas, trigramas, modelo Word2Vec, modelo Doc2Vec
  • Calcular métricas de similaridade
  • E muito mais..
  • >

Vamos começar.

O que é um Dicionário e Corpus?

Para trabalhar em documentos de texto, Gensim requer que as palavras (aka tokens) sejam convertidas para ids únicos. Para conseguir isso, Gensim permite criar um objeto Dictionary que mapeia cada palavra para um único id.

Veremos como fazer isso na próxima seção.

Mas por que o objeto dicionário é necessário e onde ele pode ser usado?

O objeto dicionário é normalmente usado para criar um ‘saco de palavras’ Corpus. É este Dicionário e o saco de palavras (Corpus) que são usados como entradas para modelagem de tópicos e outros modelos em que o Gensim é especializado.

Muito bem, que tipo de entradas de texto o Gensim pode manusear? O texto de entrada normalmente vem em 3 formas diferentes:

  1. Como sentenças armazenadas no objeto de lista nativa do python
  2. Como um único arquivo de texto, pequeno ou grande.
  3. Em múltiplos arquivos de texto.

Agora, quando o seu texto é grande, você precisa ser capaz de criar o objeto dicionário sem ter que carregar o arquivo de texto inteiro.

A boa notícia é que o Gensim permite que você leia o texto e atualize o dicionário, uma linha de cada vez, sem carregar o arquivo de texto inteiro na memória do sistema. Vamos ver como fazer isso nas próximas 2 seções.

Mas, antes de entrarmos, vamos entender algum jargão de PNL.

Um ‘token’ tipicamente significa uma ‘palavra’. Um ‘documento’ pode tipicamente referir-se a uma ‘frase’ ou ‘parágrafo’ e um ‘corpus’ é tipicamente um ‘conjunto de documentos como um saco de palavras’. Isto é, para cada documento, um corpus contém o id de cada palavra e a sua frequência de contagem nesse documento. Como resultado, a informação da ordem das palavras é perdida.

Se tudo estiver claro até agora, vamos molhar as mãos e ver como criar o dicionário a partir de uma lista de frases.

Como criar um Dicionário a partir de uma lista de frases?

No gensim, o dicionário contém um mapa de todas as palavras (fichas) para a sua id.

Você pode criar um dicionário a partir de um parágrafo de frases, de um arquivo de texto que contém múltiplas linhas de texto e de múltiplos arquivos de texto contidos em um diretório. Para o segundo e terceiro casos, vamos fazê-lo sem carregar o ficheiro inteiro na memória para que o dicionário seja actualizado à medida que lê o texto linha a linha.

Comecemos com a entrada ‘Lista de frases’.

Quando tiver várias frases, precisa de converter cada frase para uma lista de palavras. A compreensão de listas é uma forma comum de fazer isto.

Como diz o dicionário tem 34 fichas (ou palavras) únicas. Vamos ver os ids únicos para cada um desses tokens.

Criamos com sucesso um objeto de Dicionário. Gensim irá usar este dicionário para criar um corpus de palavras onde as palavras nos documentos são substituídas pelo seu respectivo id fornecido por este dicionário.

Se você conseguir novos documentos no futuro, também é possível atualizar um dicionário existente para incluir as novas palavras.

Como criar um Dicionário a partir de um ou mais arquivos de texto?

Você também pode criar um dicionário a partir de um arquivo de texto ou de um diretório de arquivos de texto.

O exemplo abaixo lê um ficheiro linha a linha e usa o gensim simple_preprocess para processar uma linha do ficheiro de cada vez.

A vantagem aqui é que permite ler um ficheiro de texto inteiro sem carregar o ficheiro na memória tudo de uma vez.

Vamos usar um ficheiro.txt de exemplo para demonstrar isto.

Criámos um dicionário a partir de um único ficheiro de texto. Nice!

Agora, como ler uma linha por vez a partir de vários ficheiros?

Assumindo que tem todos os ficheiros de texto no mesmo directório, precisa de definir uma classe com um método __iter__. O método __iter__() deve iterar através de todos os ficheiros de um determinado directório e produzir a lista processada de fichas de palavras.

Deixe definir uma dessas classes pelo nome ReadTxtFiles, que toma o caminho para o directório que contém os ficheiros de texto. Estou usando este diretório de documentos de alimentação esportiva como entrada.

Este post no blog dá uma boa visão geral para entender o conceito de iteradores e geradores.

Como criar um saco de palavras corpus in gensim?

Agora você sabe como criar um dicionário a partir de uma lista e de um arquivo de texto.

O próximo objeto importante com o qual você precisa se familiarizar para trabalhar no gensim é o Corpus (um saco de palavras). Ou seja, é um objeto de corpus que contém a palavra id e sua freqüência em cada documento. Você pode pensar nele como o equivalente de gensim de uma matriz Document-Term.

Após ter o dicionário atualizado, tudo o que você precisa fazer para criar um corpus de palavras é passar a lista simbólica de palavras para a lista Dictionary.doc2bow()

Corpus para uma lista simples (my_docs) contendo 2 sentenças.

Como interpretar o corpus acima?

O (0, 1) na linha 1 significa que a palavra com id=0 aparece uma vez no primeiro documento.
Likewise, o (4, 4) no item da segunda lista significa que a palavra com id 4 aparece 4 vezes no segundo documento. E assim por diante.

Bem, isto não é legível para humanos. Para converter os id’s para palavras, você precisará do dicionário para fazer a conversão.

Vejamos como recuperar os textos originais.

word_counts = , count) for id, count in line] for line in mycorpus]pprint(word_counts)#> , ]

Notice, a ordem das palavras se perde. Apenas a palavra e sua freqüência é retida.

6. Como criar um saco de palavras corpus a partir de um ficheiro de texto?

Ler palavras de uma lista python é bastante simples porque o texto inteiro já estava in-memory.
No entanto, pode ter um ficheiro grande que não quer carregar o ficheiro inteiro na memória.

Pode importar esses ficheiros uma linha de cada vez definindo uma classe e a função __iter__ que lê iterativamente o ficheiro uma linha de cada vez e produz um objecto corpus. Mas como criar o objeto corpus?

O __iter__() de BoWCorpus lê uma linha do ficheiro, processa-a para uma lista de palavras usando simple_preprocess() e passa-a para o dictionary.doc2bow(). Você pode relacionar como isso é similar e diferente da classe ReadTxtFiles que criamos anteriormente?

Também, note que estou usando o pacote smart_open() de smart_open porque, ele permite que você abra e leia grandes arquivos linha por linha de uma variedade de fontes como S3, HDFS, WebHDFS, HTTP, ou arquivos locais e compactados. A propósito, isso é bastante impressionante!

No entanto, se você tivesse usado open() para um arquivo em seu sistema, ele funcionará perfeitamente também.

Como salvar um dicionário gensim e um corpus em disco e carregá-los de volta?

Isso é bastante simples. Veja os exemplos abaixo.

Salvamos o dicionário e os objetos do corpus. Vamos carregá-los de volta.

Como criar a matriz TFIDF (corpus) em gensim?

O termo Frequency – Inverse Document Frequency(TF-IDF) também é um modelo de saco de palavras, mas ao contrário do corpus normal, TFIDF baixa os tokens de peso (palavras) que aparecem frequentemente nos documentos.

Como TFIDF é computado?

Tf-Idf é calculado multiplicando um componente local como frequência de termo (TF) com um componente global, ou seja, frequência inversa do documento (IDF) e opcionalmente normalizando o resultado para o comprimento da unidade.

Como resultado disto, as palavras que ocorrem frequentemente nos documentos serão menos ponderadas.

Existem múltiplas variações de fórmulas para TF e IDF. Gensim utiliza o sistema SMART Information retrieval que pode ser utilizado para implementar essas variações. Você pode especificar qual fórmula usar especificando o parâmetro smartirs no parâmetro TfidfModel. Veja help(models.TfidfModel) para mais detalhes.

Então, como obter os pesos TFIDF?

Ao treinar o corpus com models.TfidfModel(). Em seguida, aplique o corpus dentro dos parênteses rectos do modelo treinado com tfidf. Veja o exemplo abaixo.

Note a diferença de pesos das palavras entre o corpus original e o corpus com peso tfidf.

As palavras ‘is’ e ‘the’ ocorrem em dois documentos e foram ponderadas para baixo. A palavra ‘isto’ que aparece nos três documentos foi removida ao todo. Em termos simples, palavras que ocorrem mais frequentemente nos documentos recebem pesos menores.

Como usar a API do gensim downloader para carregar conjuntos de dados?

Gensim fornece uma API embutida para baixar conjuntos de dados de texto populares e modelos de incorporação de palavras.

Uma lista abrangente de conjuntos de dados e modelos disponíveis é mantida aqui.

Usar a API para baixar o conjunto de dados é tão simples quanto chamar o método api.load() com os dados certos ou nome do modelo.

O exemplo abaixo mostra como baixar o modelo ‘glove-wiki-gigaword-50’.

Como criar bigramas e trigramas usando modelos Phraser?

Agora você sabe como baixar conjuntos de dados e modelos pré-treinados com gensim.

Deixe baixar o conjunto de dados text8, que não é nada além dos “Primeiros 100.000.000 bytes de texto simples da Wikipedia”. Então, a partir disto, vamos gerar bigramas e trigramas.

Mas o que são bigramas e trigramas? e por que eles importam?

Em parágrafos, certas palavras sempre tendem a ocorrer em pares (bigram) ou em grupos de três (trigramas). Porque as duas palavras combinadas formam a entidade real. Por exemplo: A palavra “francês” refere-se à língua ou região e a palavra “revolução” pode referir-se à revolução planetária. Mas combinando-as, ‘Revolução Francesa’, refere-se a algo completamente diferente.

É bastante importante formar bigramas e trigramas a partir de frases, especialmente quando se trabalha com modelos de sacos de palavras.

Assim como criar os bigramas?

É bastante fácil e eficiente com o modelo gensim’s Phrases. O modelo criado Phrases permite indexação, então, basta passar o texto original (lista) para o modelo construído Phrases para formar os bigrams. Um exemplo é mostrado abaixo:

Os bigrams estão prontos. Você pode adivinhar como criar um trigrama?

Bem, basta enxaguar e repetir o mesmo procedimento para a saída do modelo de bigramas. Depois de gerar os bigrams, você pode passar a saída para treinar um novo modelo Phrases. Depois, aplique o bigrammed corpus no modelo de trigrama treinado. Confuso? Veja o exemplo abaixo.

Como criar modelos tópicos com LDA?

O objectivo dos modelos tópicos é extrair os tópicos subjacentes de uma determinada colecção de documentos de texto. Cada documento no texto é considerado como uma combinação de tópicos e cada tópico é considerado como uma combinação de palavras relacionadas.

A modelagem tópica pode ser feita por algoritmos como Latent Dirichlet Allocation (LDA) e Latent Semantic Indexing (LSI).

Em ambos os casos você precisa fornecer o número de tópicos como entrada. O modelo de tópicos, por sua vez, irá fornecer as palavras-chave de cada tópico e a contribuição percentual de tópicos em cada documento.

A qualidade dos tópicos depende muito da qualidade do processamento de texto e do número de tópicos que você fornecer ao algoritmo. O post anterior sobre como construir os melhores modelos de tópicos explica o procedimento com mais detalhes. Entretanto, eu recomendo entender os passos básicos envolvidos e a interpretação no exemplo abaixo.

Passo 0: Carregar os pacotes necessários e importar as stopwords.

Passo 1: Importar o conjunto de dados. Vou usar o conjunto de dados text8 que pode ser baixado usando o downloader API do gensim.

# Step 1: Import the dataset and get the text and real topic of each news articledataset = api.load("text8")data = 

Passo 2: Prepare os dados baixados removendo as stopwords e lemmatize-os. Para Lemmatização, o gensim requer o pacote pattern. Portanto, certifique-se de fazer pip install pattern no seu terminal ou prompt antes de executar isto. Eu tenho a lemmatização configurada de tal forma que apenas Substantivos (NN), Adjetivos (JJ) e Pronomes (RB) são mantidos. Porque eu prefiro apenas tais palavras para ir como palavras-chave do tópico. Esta é uma escolha pessoal.

O data_processed é agora processado como uma lista de palavras. Agora você pode usar isto para criar os Dictionary e Corpus, que serão então usados como entradas para o modelo LDA.

Temos o Dicionário e Corpus criados. Vamos construir um modelo de tópicos LDA com 7 tópicos, usando LdaMulticore(). 7 tópicos é uma escolha arbitrária por enquanto.

O lda_model.print_topics mostra quais palavras contribuíram para qual dos 7 tópicos, juntamente com o peso da contribuição da palavra para esse tópico.

Você pode ver as palavras como ‘também’, ‘muitos’ que se cruzam com diferentes tópicos. Então eu adicionaria tais palavras à lista stop_words para removê-las e ajustar o modelo de tópicos para um número ideal de tópicos.

LdaMulticore() suporta processamento paralelo. Alternativamente, poderia também tentar ver que tópicos o LdaModel() dá.

Como interpretar a saída do modelo tópico LDA?

O objecto lda_model suporta indexação. Ou seja, se você passar um documento (lista de palavras) para o lda_model, ele fornece 3 coisas:

  1. O(s) tópico(s) a que o documento pertence juntamente com a percentagem.
  2. O(s) tópico(s) a que cada palavra nesse documento pertence.
  3. O(s) tópico(s) a que cada palavra naquele documento pertence E os valores phi.

Então, o que é o valor phi?

O valor phi é a probabilidade da palavra pertencer a esse tópico em particular. E a soma dos valores phi para uma determinada palavra soma o número de vezes que essa palavra ocorreu naquele documento.

Por exemplo, na saída abaixo para o documento 0, a palavra com id=0 pertence ao tópico número 6 e o valor phi é 3,999. Isso significa que a palavra com id=0 apareceu 4 vezes no 0º documento.

Como criar um modelo tópico LSI usando gensim?

A sintaxe para usar um modelo LSI é similar a como construímos o modelo LDA, exceto que vamos usar o LsiModel().

Como treinar o modelo Word2Vec usando gensim?

Um modelo de incorporação de palavras é um modelo que pode fornecer vetores numéricos para uma determinada palavra. Usando a API do Gensim, você pode baixar modelos pré-construídos de incorporação de palavras como word2vec, fasttext, GloVe e ConceptNet. Estes são construídos sobre grandes corpúsculos de dados de texto comumente ocorridos, como wikipedia, google news etc.

No entanto, se você estiver trabalhando em um nicho especializado, como documentos técnicos, você pode não ser capaz de obter incorporações de palavras para todas as palavras. Portanto, nestes casos é desejável treinar o seu próprio modelo.

Gensim’s Word2Vec implementação vamos treinar o seu próprio modelo de incorporação de palavras para um determinado corpus.

Treinámos e guardámos um modelo Word2Vec para o nosso documento. No entanto, quando um novo conjunto de dados chega, você quer atualizar o modelo de modo a contabilizar novas palavras.

Como atualizar um modelo Word2Vec existente com novos dados?

Em um modelo existente Word2Vec, chame o modelo build_vocab() no novo conjunto de dados e depois chame o método train(). build_vocab() é chamado primeiro porque o modelo tem que ser informado do que novas palavras devem esperar no novo corpus.

Como extrair vetores de palavras usando modelos Word2Vec e FastText pré-treinados?

Vemos como obter os vetores de palavras para o modelo Word2Vec que acabamos de treinar. Entretanto, o gensim permite que você baixe modelos pré-treinados de última geração através da API do downloader. Vamos ver como extrair a palavra vectores de um par destes modelos.

Temos 3 modelos de incorporação diferentes. Você pode avaliar qual deles tem melhor desempenho usando o respectivo modelo evaluate_word_analogies() em um conjunto de dados de analogias padrão.

Como criar vetores de documentos usando Doc2Vec?

Unlike Word2Vec, um modelo Doc2Vec fornece uma representação vetorial de um grupo de palavras tomadas coletivamente como uma única unidade. Não é uma simples média dos vectores das palavras na frase.

Vamos usar o conjunto de dados text8 para treinar o conjunto de dados Doc2Vec.

import gensimimport gensim.downloader as api# Download datasetdataset = api.load("text8")data = 

Os dados de treino para Doc2Vec devem ser uma lista de TaggedDocuments. Para criar uma, passamos uma lista de palavras e um inteiro único como entrada para models.doc2vec.TaggedDocument().

A entrada está preparada. Para treinar o modelo, você precisa inicializar o modelo Doc2Vec, construir o vocabulário e então finalmente treinar o modelo.

Para obter o vetor do documento de uma frase, passe-o como uma lista de palavras para o método infer_vector().

Como calcular métricas de similaridade como similaridade cosseno e similaridade cosseno suave?

Sua similaridade cosseno é semelhante à semelhança cosseno, mas além disso considera a relação semântica entre as palavras através da sua representação vectorial.

Para calcular cossenos suaves, necessitará de um modelo de incorporação de palavras como Word2Vec ou FastText. Primeiro, calcule o similarity_matrix. Depois converta as frases de entrada para o corpus bag-of-words e passe-as para softcossim() juntamente com a matriz de similaridade.

Below são algumas similaridades úteis e métricas de distância baseadas nos modelos de incorporação de palavras como fasttext e GloVe. Nós já baixamos esses modelos usando o downloader API.

Como resumir documentos de texto?

Gensim implementa o resumo do textrank usando a função summarize() no módulo summarization. Tudo que você precisa fazer é passar na string tet junto com o resumo de saída ratio ou o máximo count de palavras no resumo de saída.

Não há necessidade de dividir a frase em uma lista simbólica porque gensim faz a divisão usando o método split_sentences() embutido no módulo gensim.summarization.texcleaner.

Vamos resumir o clipping de um novo artigo em sample.txt.

>Para mais informações sobre resumo com gensim, consulte este tutorial.

Conclusion

Cobrimos muito sobre as várias características do gensim e temos uma boa compreensão de como trabalhar e manipular textos. Os exemplos acima devem servir como bons modelos para você começar e construir para várias tarefas de PNL. Espero que você ache útil e se sinta confortável para usar gensim com mais freqüência em seus projetos de PNL.

Deixe uma resposta

O seu endereço de email não será publicado.