首发于 NLP成长路
gensim LDA模型的优劣评估

gensim LDA模型的优劣评估

LDA因为是种无监督的算法,如何对其效果进行评估是个大难题。而因为在gensim库中集成有LDA模型,可以方便调用,所以我之前都直接调用API,参数按默认的来。那么,接下来最重要的一个问题是,topic数该如何确定?训练出来的LDA模型该如何评估?尽管原论文有定义困惑度(perplexity)来评估,但是,

gensim库的log_perplexity()函数不能直接用于计算困惑度!

gensim库的log_perplexity()函数不能直接用于计算困惑度!

gensim库的log_perplexity()函数不能直接用于计算困惑度!

(重要事情说三遍并加粗)

去年上半年因为别人求助的原因稍微看过log_perplexity函数的源码,那时就感觉这函数不对,与原论文好像不符,但那时我也没其他好的方法来评估,只好让她将就用着log_perplexity函数。半年过去gensim也升级了,现在这函数是不是我半年前看的那个我也不清楚,不过可以肯定的是,新版的gensim的log_perplexity也依旧不能用于计算困惑度,详情请见 zhihu.com/question/3228 下@ ocsponge 答主的回答。半年后因为自己也需要用到gensim的Lda模型,所以还是费了一番心思去找评估方法。同样是从上面这位答主的链接下找到的 America’s Next Topic Model ,这个链接提供了三种评估LDA模型的方法,为gensim的作者所写。下面我将用我自己的理解简单介绍一下:


方法一:颜色可视化

简单来说,就是为文档里的词,根据它所属于的主题进行上色。举个例子,“bank”有“银行”和“河岸”的意思,很明显是属于两个不同的主题的。那么,一个好的LDA模型应该能识别到这种区别。那用九个文档来训练两个LDA模型来看看效果(一个文档是一句话):

texts = [['bank','river','shore','water'],
        ['river','water','flow','fast','tree'],
        ['bank','water','fall','flow'],
        ['bank','bank','water','rain','river'],
        ['river','water','mud','tree'],
        ['money','transaction','bank','finance'],
        ['bank','borrow','money'], 
        ['bank','finance'],
        ['finance','money','sell','bank'],
        ['borrow','sell'],
        ['bank','loan','sell']]
dictionary = Dictionary(texts)
corpus = [dictionary.doc2bow(text) for text in texts]
#假设模型训练时间越长效果越好
goodLdaModel = LdaModel(corpus, id2word=dictionary, iterations=50, num_topics=2)
badLdaModel = LdaModel(corpus, id2word=dictionary, iterations=1, num_topics=2)

结果:

bow_water = ['bank', 'water', 'river', 'tree']
color_words(goodLdaModel, bow_water)
color_words(badLdaModel, bow_water)

设想好的模型应该能把"bank"识别成自然景象并正确地标为蓝色。从上面两张图可以看出goodModel正确地聚类了,而badModel无法正确聚类。

(详细及完整教程见: RaRe-Technologies/gensim


方法二:使用PyLDAvis可视化

这是R语言的LDAvis库的python版。可以通过pip安装。可以交互式观察模型效果

可以很方便看出每个主题包含单词数的多少,以及从各个圆的距离看出主题之间的距离。

(这个由于是动图,直接点进原链接会更直观。我不懂知乎怎么上传动图。。。)

(完整教程: Jupyter Notebook Viewer


方法三:定量探讨

gensim 0.13.1版提供了一个数值定量评估的方法,称“主题相干性”(topic coherence,详情见论文 Exploring the Space of Topic Coherence Measures )。人们对于主题模型的理解更倾向于属于同一主题的单词在语料库中共同出现的频率。“C_v topic coherence”做的就是这样的工作。gensim提供了几种不同的主题相干性测量方法,其主要的不同在于“共现”的定义不同。 Palmetto Online Demo 这里定义了几种不同的共现定义,其中C_v,C_UCI,C_NPMI为gensim所采取的可选方法。

goodcm = CoherenceModel(model=goodLdaModel, texts=texts, dictionary=dictionary, coherence='c_v')
print goodcm.get_coherence()