gensim模型(3)——Ensemble LDA

Ensemble LDA

主要介绍Gensim的EnsembleLda模型

import logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

该教程讲解释如何使用EnsembleLDA模型类。

EnsembleLda是从多个主题模型的结果中发现和生成稳定主题的一种方法,它能够被用于从你的有噪音且不可重现的结果中移除主题。

语料库(Corpus)

我们将使用gensim的下载器api来获取训练我们ensemble的小型语料库。

import gensim.downloader as api
from gensim.corpora import Dictionary
from nltk.stem.wordnet import WordNetLemmatizer

lemmatizer = WordNetLemmatizer()
docs = api.load('text8')

dictionary = Dictionary()
for doc in docs:
    dictionary.add_documents([[lemmatizer.lemmatize(token) for token in doc]])
dictionary.filter_extremes(no_below=20, no_above=0.5)

corpus = [dictionary.doc2bow(doc) for doc in docs]

训练(Training)

训练ensemble和训练单个模型非常相似。

你可以使用任何基于LdaModel的模型,如LdaMulticore,来训练Ensemble。在实验中,LdaMulticore结果最好。

from gensim.models import LdaModel
topic_model_class = LdaModel

使用的模型数量是任意的,但它应该是你worker的倍数,以便正确分配加载。在此示例中,4个进程将将训练8个模型。

ensemble_workers = 4
num_models = 8

在训练完所有模型后,需要一些距离计算,这也将花费一些时间。你也可以使用worker来对此过程进行加速。

distance_workers = 4

EnsembleLda未知的所有其他参数都将转到每个LDA模型上,例如

num_topics = 20
passes = 2

现在开始训练

因为,8个模型上的每个模型将训练20个主题,我们期望最后的结果将有160个不同的主题。从所有这些主题中聚类而成的稳定主题的数量更少。

from gensim.models import EnsembleLda
ensemble = EnsembleLda(
    corpus=corpus,
    id2word=dictionary,
    num_topics=num_topics,
    passes=passes,
    num_models=num_models,
    topic_model_class=LdaModel,
    ensemble_workers=ensemble_workers,
    distance_workers=distance_workers
)

print(len(ensemble.ttda))
print(len(ensemble.get_topics()))

微调(Tuning)

和LdaModel不同的是,生成的主题的数量因聚类参数而异。

你可以在recluster()函数或EnsembleLda构造器中提供这些参数。

一直调整直到你得到你想要的尽可能多的主题,但这可能会降低主题的质量。你应该确保ensemble足够大,以防它没有足够的主题用于调整。

比最小距离还小的epsilon(参数中的eps)是没有意义的。确保选择一个在asymmetric_distance_matrix数值范围内的值。

import numpy as np
shape = ensemble.asymmetric_distance_matrix.shape
without_diagonal = ensemble.asymmetric_distance_matrix[~np.eye(shape[0], dtype=bool)].reshape(shape[0], -1)
print(without_diagonal.min(), without_diagonal.mean(), without_diagonal.max())

ensemble.recluster(eps=0.09, min_samples=2, min_cores=2)

print(len(ensemble.get_topics()))

增加大小(Increasing the Size)

如果你有一些模型是在相同字典的语料库上训练的,他们是兼容的,你可以把它们添加到ensemble中。

通过将EnsembleLda构造器的num_models设置为0,你还可以创建一个完全由您现有主题模型组成的ensemble,方法如下。

之后,稳定主题的数量和质量可能会因你添加的主题和参数而异。

from gensim.models import LdaMulticore

model1 = LdaMulticore(
    corpus=corpus,
    id2word=dictionary,
    num_topics=9,
    passes=4,
)

model2 = LdaModel(
    corpus=corpus,
    id2word=dictionary,
    num_topics=11,
    passes=2,
)

# add_model supports various types of input, check out its docstring
ensemble.add_model(model1)
ensemble.add_model(model2)

ensemble.recluster()

print(len(ensemble.ttda))
print(len(ensemble.get_topics()))
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容