Ensemble LDA
主要介紹Gensim的EnsembleLda模型
import logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
該教程講解釋如何使用EnsembleLDA模型類。
EnsembleLda是從多個(gè)主題模型的結(jié)果中發(fā)現(xiàn)和生成穩(wěn)定主題的一種方法,它能夠被用于從你的有噪音且不可重現(xiàn)的結(jié)果中移除主題。
語(yǔ)料庫(kù)(Corpus)
我們將使用gensim的下載器api來(lái)獲取訓(xùn)練我們ensemble的小型語(yǔ)料庫(kù)。
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]
訓(xùn)練(Training)
訓(xùn)練ensemble和訓(xùn)練單個(gè)模型非常相似。
你可以使用任何基于LdaModel的模型,如LdaMulticore,來(lái)訓(xùn)練Ensemble。在實(shí)驗(yàn)中,LdaMulticore結(jié)果最好。
from gensim.models import LdaModel
topic_model_class = LdaModel
使用的模型數(shù)量是任意的,但它應(yīng)該是你worker的倍數(shù),以便正確分配加載。在此示例中,4個(gè)進(jìn)程將將訓(xùn)練8個(gè)模型。
ensemble_workers = 4
num_models = 8
在訓(xùn)練完所有模型后,需要一些距離計(jì)算,這也將花費(fèi)一些時(shí)間。你也可以使用worker來(lái)對(duì)此過(guò)程進(jìn)行加速。
distance_workers = 4
EnsembleLda未知的所有其他參數(shù)都將轉(zhuǎn)到每個(gè)LDA模型上,例如
num_topics = 20
passes = 2
現(xiàn)在開始訓(xùn)練
因?yàn)椋?個(gè)模型上的每個(gè)模型將訓(xùn)練20個(gè)主題,我們期望最后的結(jié)果將有160個(gè)不同的主題。從所有這些主題中聚類而成的穩(wěn)定主題的數(shù)量更少。
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()))
微調(diào)(Tuning)
和LdaModel不同的是,生成的主題的數(shù)量因聚類參數(shù)而異。
你可以在recluster()函數(shù)或EnsembleLda構(gòu)造器中提供這些參數(shù)。
一直調(diào)整直到你得到你想要的盡可能多的主題,但這可能會(huì)降低主題的質(zhì)量。你應(yīng)該確保ensemble足夠大,以防它沒(méi)有足夠的主題用于調(diào)整。
比最小距離還小的epsilon(參數(shù)中的eps)是沒(méi)有意義的。確保選擇一個(gè)在asymmetric_distance_matrix數(shù)值范圍內(nèi)的值。
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()))
增加大?。↖ncreasing the Size)
如果你有一些模型是在相同字典的語(yǔ)料庫(kù)上訓(xùn)練的,他們是兼容的,你可以把它們添加到ensemble中。
通過(guò)將EnsembleLda構(gòu)造器的num_models設(shè)置為0,你還可以創(chuàng)建一個(gè)完全由您現(xiàn)有主題模型組成的ensemble,方法如下。
之后,穩(wěn)定主題的數(shù)量和質(zhì)量可能會(huì)因你添加的主題和參數(shù)而異。
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()))