Gensim - Transformações
Este capítulo irá ajudá-lo a aprender sobre as várias transformações no Gensim. Vamos começar entendendo os documentos em transformação.
Transformando Documentos
Transformar documentos significa representar o documento de tal forma que o documento possa ser manipulado matematicamente. Além de deduzir a estrutura latente do corpus, a transformação de documentos também atenderá aos seguintes objetivos -
Ele descobre a relação entre as palavras.
Ele traz à tona a estrutura oculta no corpus.
Ele descreve os documentos de uma maneira nova e mais semântica.
Torna a representação dos documentos mais compacta.
Ele melhora a eficiência porque a nova representação consome menos recursos.
Melhora a eficácia porque na nova representação as tendências de dados marginais são ignoradas.
O ruído também é reduzido na nova representação do documento.
Vamos ver as etapas de implementação para transformar os documentos de uma representação de espaço vetorial para outra.
Etapas de Implementação
Para transformar documentos, devemos seguir as seguintes etapas -
Etapa 1: Criação do Corpus
A primeira e básica etapa é criar o corpus dos documentos. Já criamos o corpus em exemplos anteriores. Vamos criar outro com algumas melhorias (removendo palavras comuns e as palavras que aparecem apenas uma vez) -
import gensim
import pprint
from collections import defaultdict
from gensim import corpora
Agora forneça os documentos para criar o corpus -
t_corpus = ["CNTK anteriormente conhecido como Computational Network Toolkit", "é um kit de ferramentas de nível comercial de código aberto gratuito e fácil de usar", "que nos permite treinar algoritmos de aprendizagem profunda para aprender como o cérebro humano.", " Você pode encontrar seu tutorial gratuito em tutorialspoint.com "," Tutorialspoint.com também fornece os melhores tutoriais técnicos sobre tecnologias como aprendizado de máquina de aprendizado profundo de IA gratuitamente "]
Em seguida, precisamos fazer tokenise e junto com ele removeremos também as palavras comuns -
stoplist = set('for a of the and to in'.split(' '))
processed_corpus = [
[
word for word in document.lower().split() if word not in stoplist
]
for document in t_corpus
]
O script a seguir removerá aquelas palavras que aparecem apenas -
frequency = defaultdict(int)
for text in processed_corpus:
for token in text:
frequency[token] += 1
processed_corpus = [
[token for token in text if frequency[token] > 1]
for text in processed_corpus
]
pprint.pprint(processed_corpus)
Resultado
[
['toolkit'],
['free', 'toolkit'],
['deep', 'learning', 'like'],
['free', 'on', 'tutorialspoint.com'],
['tutorialspoint.com', 'on', 'like', 'deep', 'learning', 'learning', 'free']
]
Agora passe para o corpora.dictionary() objeto para obter os objetos únicos em nosso corpus -
dictionary = corpora.Dictionary(processed_corpus)
print(dictionary)
Resultado
Dictionary(7 unique tokens: ['toolkit', 'free', 'deep', 'learning', 'like']...)
Em seguida, a seguinte linha de códigos criará o modelo Bag of Word para nosso corpus -
BoW_corpus = [dictionary.doc2bow(text) for text in processed_corpus]
pprint.pprint(BoW_corpus)
Resultado
[
[(0, 1)],
[(0, 1), (1, 1)],
[(2, 1), (3, 1), (4, 1)],
[(1, 1), (5, 1), (6, 1)],
[(1, 1), (2, 1), (3, 2), (4, 1), (5, 1), (6, 1)]
]
Etapa 2: Criação de uma transformação
As transformações são alguns objetos padrão do Python. Podemos inicializar essas transformações, ou seja, objetos Python usando um corpus treinado. Aqui vamos usartf-idf modelo para criar uma transformação do nosso corpus treinado, ou seja, BoW_corpus.
Primeiro, precisamos importar o pacote de modelos do gensim.
from gensim import models
Agora, precisamos inicializar o modelo da seguinte maneira -
tfidf = models.TfidfModel(BoW_corpus)
Etapa 3: Transformando Vetores
Agora, nesta última etapa, os vetores serão convertidos da representação antiga para a nova representação. Como inicializamos o modelo tfidf na etapa acima, o tfidf agora será tratado como um objeto somente leitura. Aqui, usando este objeto tfidf, converteremos nosso vetor de representação do pacote de palavras (representação antiga) para pesos de valor real Tfidf (nova representação).
doc_BoW = [(1,1),(3,1)]
print(tfidf[doc_BoW]
Resultado
[(1, 0.4869354917707381), (3, 0.8734379353188121)]
Aplicamos a transformação em dois valores do corpus, mas também podemos aplicá-la a todo o corpus da seguinte forma -
corpus_tfidf = tfidf[BoW_corpus]
for doc in corpus_tfidf:
print(doc)
Resultado
[(0, 1.0)]
[(0, 0.8734379353188121), (1, 0.4869354917707381)]
[(2, 0.5773502691896257), (3, 0.5773502691896257), (4, 0.5773502691896257)]
[(1, 0.3667400603126873), (5, 0.657838022678017), (6, 0.657838022678017)]
[
(1, 0.19338287240886842), (2, 0.34687949360312714), (3, 0.6937589872062543),
(4, 0.34687949360312714), (5, 0.34687949360312714), (6, 0.34687949360312714)
]
Exemplo de implementação completo
import gensim
import pprint
from collections import defaultdict
from gensim import corpora
t_corpus = [
"CNTK formerly known as Computational Network Toolkit",
"is a free easy-to-use open-source commercial-grade toolkit",
"that enable us to train deep learning algorithms to learn like the human brain.",
"You can find its free tutorial on tutorialspoint.com",
"Tutorialspoint.com also provide best technical tutorials on
technologies like AI deep learning machine learning for free"
]
stoplist = set('for a of the and to in'.split(' '))
processed_corpus = [
[word for word in document.lower().split() if word not in stoplist]
for document in t_corpus
]
frequency = defaultdict(int)
for text in processed_corpus:
for token in text:
frequency[token] += 1
processed_corpus = [
[token for token in text if frequency[token] > 1]
for text in processed_corpus
]
pprint.pprint(processed_corpus)
dictionary = corpora.Dictionary(processed_corpus)
print(dictionary)
BoW_corpus = [dictionary.doc2bow(text) for text in processed_corpus]
pprint.pprint(BoW_corpus)
from gensim import models
tfidf = models.TfidfModel(BoW_corpus)
doc_BoW = [(1,1),(3,1)]
print(tfidf[doc_BoW])
corpus_tfidf = tfidf[BoW_corpus]
for doc in corpus_tfidf:
print(doc)
Várias transformações em Gensim
Usando Gensim, podemos implementar várias transformações populares, ou seja, algoritmos de modelo de espaço vetorial. Alguns deles são os seguintes -
Tf-Idf (Frequência do termo-frequência inversa do documento)
Durante a inicialização, este algoritmo de modelo tf-idf espera um corpus de treinamento com valores inteiros (como o modelo Bag-of-Words). Depois disso, no momento da transformação, ele pega uma representação vetorial e retorna outra representação vetorial.
O vetor de saída terá a mesma dimensionalidade, mas o valor dos recursos raros (no momento do treinamento) será aumentado. Ele basicamente converte vetores de valor inteiro em vetores de valor real. A seguir está a sintaxe da transformação Tf-idf -
Model=models.TfidfModel(corpus, normalize=True)
LSI (Indexação Semântica Latente)
O algoritmo do modelo LSI pode transformar documentos de qualquer modelo vetorial com valor inteiro (como o modelo Bag-of-Words) ou espaço ponderado Tf-Idf em espaço latente. O vetor de saída será de menor dimensionalidade. A seguir está a sintaxe da transformação LSI -
Model=models.LsiModel(tfidf_corpus, id2word=dictionary, num_topics=300)
LDA (alocação de Dirichlet latente)
O algoritmo do modelo LDA é outro algoritmo que transforma o documento do espaço do modelo Bag-of-Words em um espaço de tópico. O vetor de saída será de menor dimensionalidade. A seguir está a sintaxe da transformação LSI -
Model=models.LdaModel(corpus, id2word=dictionary, num_topics=100)
Projeções Aleatórias (RP)
RP, uma abordagem muito eficiente, visa reduzir a dimensionalidade do espaço vetorial. Essa abordagem é basicamente aproximada das distâncias Tf-Idf entre os documentos. Ele faz isso acrescentando um pouco de aleatoriedade.
Model=models.RpModel(tfidf_corpus, num_topics=500)
Processo Hierárquico de Dirichlet (HDP)
HDP é um método Bayesiano não paramétrico que é uma nova adição ao Gensim. Devemos ter cuidado ao usá-lo.
Model=models.HdpModel(corpus, id2word=dictionary