def gerar_modelo(self, modelo): ''' Treina o modelo selecionado, salvando-o. Após, cria a matrix de similaridade para o corpus transformado. Parâmetros: modelo (str) --> nome do modelo: "tfidf", "tfidf_pivot", "lsi", "lda" ou "doc2vec" Retorno: None ''' # Verifica se o modelo foi implementado if modelo not in self._modelos: print(f'O modelo "{modelo}" não foi implementado.') return # Define os nomes dos arquivos arq_model = os.path.join( self.corpus._pastas['modelos'], f'{self.corpus._link_nome}.{self._exts[modelo]}') arq_index = os.path.join(self.corpus._pastas['indices'], f'{self.corpus._link_nome}_{modelo}.idx') # Gera o modelo solicitado if modelo == 'tfidf': # Inicializa o modelo corpus_train = self.corpus.corpus(tipo='bow') num_features = self.corpus.num_tokens model = TfidfModel(corpus=corpus_train, id2word=self.corpus.dicionario()) elif modelo == 'tfidf_pivot': # Inicializa o modelo corpus_train = self.corpus.corpus(tipo='bow') num_features = self.corpus.num_tokens model = TfidfModel(corpus=corpus_train, id2word=self.corpus.dicionario(), smartirs='nfu', pivot=self.corpus.num_tokens / self.corpus.num_docs) elif modelo == 'lda': # Inicializa o modelo corpus_train = self.corpus.corpus(tipo='bow') num_features = self._modelos[modelo]['num_topics'] model = LdaModel(corpus=corpus_train, id2word=self.corpus.dicionario(), num_topics=num_features) elif modelo == 'lsi': # Inicia o modelo corpus_train = self.corpus.corpus(tipo='tfidf') num_features = self._modelos[modelo]['num_topics'] model = LsiModel(corpus=corpus_train, id2word=self.corpus.dicionario(), num_topics=num_features) elif modelo == 'doc2vec': # Instancia o modelo Doc2Vec corpus_train = self.corpus.corpus(tipo='tagged') num_features = self._modelos[modelo]['vector_size'] model = Doc2Vec(vector_size=num_features, workers=mp.cpu_count() / 2, alpha=self._modelos[modelo]['alpha'], min_alpha=self._modelos[modelo]['min_alpha']) # Obtém o vocabulário do corpus para treinar o modelo Doc2Vec model.build_vocab(corpus_train) # Treina o modelo Doc2Vec model.train(corpus_train, total_examples=model.corpus_count, epochs=model.epochs) else: print(f'O modelo "{modelo}" não foi implementado.') return # Salva o modelo treinado model.save(self._arqs['modelos'][modelo]) # Define o corpus para a matriz de similaridade if modelo == 'doc2vec': corpus = Doc2VecCorpus(model) else: corpus = model[corpus_train] # Gera o index a partir do modelo serializado index = Similarity(output_prefix=self._arqs['indices'][modelo], corpus=corpus, num_features=num_features) # Salva o índice index.save(self._arqs['indices'][modelo])