gensim模型(3)——Ensemble LDA

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()))
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容