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()))