8.2 文本数据主题模型可视化

pyLDAvis 是主题模型交互可视化的 Python 包,移植自 Carson Sievert 和 Kenny Shirley 写的 LDAvis R 包(https://github.com/cpsievert/LDAvis),利用该包可以在 Jupter Notebook 中轻松实现主题模型的可视化。

安装方式如下:

!pip install pyldavis

8.2.1 gensim 模块

pyLDAvis 包下定义了 gensim 模块,通过 gensim 库构建的主题模型利用该模块下定义的 prepare 函数即可实现可视化,调用方式如下:prepare(topic_model, corpus, dictionary, doc_topic_dist=None)

参数说明:

topic_model:训练得到的 gensim LdaModel 对象,不支持其他 gensim 模型类型

corpus:以词袋形式表示的语料(用于训练主题模型的语料)

dictionary:用于构建词袋模型的字典,即 gensim Dictionary 对象

doc_topic_dist:可选参数,用于传入 LDA 模型的文档主题分布,默认取值为 None,当需要多次调用 prepare 函数时,可以传入该参数

第八章已经介绍过利用 gensim 构建 LDA 模型的方式,本节不做过多说明,下例构建一个简单的 LDA 模型,利用该模型演示可视化函数调用

例 1


In [1]:import pyLDAvis
       import pyLDAvis.gensim
       # 导入构建 LDA 模型所需的相关工具
       from gensim import corpora,models
       from gensim.models.ldamodel import LdaModel
       # 读取文本数据
       title = ['Beijing lifts red alert with smog set to disperse',
                'Source of major pollutant in China smog revealed',
                'Xi stresses clean energy use to reduce smoggy days',
                'New Zealand university to open innovation center in China',
                'School combines soccer with kung fu to train players',
                'NASA bets big on private sector to put humans on Mars',
                'Why A Tornado-Damaged Facility In New Orleans Is Critical To NASA',
                'NASA Plans to Send This Robot Lander to Look for Alien Life on Europa']
        # 简单分词处理
        texts = [[word for word in document.lower().split()] for document in title]
        # 构建词典
        dictionary = corpora.Dictionary(texts)
        # 得到词汇词频
        corpus = [dictionary.doc2bow(text) for text in texts]
        # 构建 TF-IDF 矩阵
        tfidf_model = models.TfidfModel(corpus) 
        corpus_tfidf = tfidf_model[corpus]
        # 构建 LDA 模型
        lda = LdaModel(corpus=corpus_tfidf,id2word=dictionary,num_topics=3)
        # 输出各个主题的词汇分布
        lda.show_topics(3)
Out[1]:[(0,
         u'0.024*"innovation" + 0.024*"center" + 0.023*"university" + 0.023*"zealand" + 0.023*"open" + 0.023*"beijing" + 0.023*"disperse" + 0.022*"lifts" + 0.022*"red" + 0.022*"alert"'),
        (1,
         u'0.028*"on" + 0.025*"smoggy" + 0.025*"days" + 0.025*"reduce" + 0.025*"stresses" + 0.025*"clean" + 0.024*"use" + 0.024*"energy" + 0.024*"xi" + 0.024*"bets"'),
        (2,
         u'0.024*"of" + 0.024*"pollutant" + 0.024*"major" + 0.024*"revealed" + 0.024*"source" + 0.023*"in" + 0.023*"orleans" + 0.023*"why" + 0.023*"is" + 0.023*"a"')]
In [2]: # 可视化主题模型
        vis_data = pyLDAvis.gensim.prepare(lda, corpus, dictionary)
        # 在 notebook 中显示可视化结果,需要调用 display 方法,或者执行 “pyLDAvis.enable_notebook()” ,即可在 notebook 中自动展示可视化结果,无需再调用 display
        pyLDAvis.display(vis_data)
Out[2]:@todo 补充截图 9.2.1-1

主题模型的可视化结果给出了包括所有主题在内的全局视图,可以看到,输出结果分为左右两部分,左侧为“主题距离地图”,展示各个主题之间的差异,图中带有数字编号的圆形即代表各个主题,圆形的面积与该主题出现的可能性成正比,并且按照面积大小自动进行编号,右侧为各个主题前 30 个最为相关的词汇,对各个主题进行解释说明,以水平柱状图的形式展示,蓝色表示整体词频,红色表示主题词频,当将鼠标光标移至某个主题圆形上方时,右侧将会显示该主题对应的词汇,也可以在左上角“Selected Topic”输入框中输入主题编号得到同样的效果。

@todo 补充截图 9.2.1-2 此外,某个词语与主题的相关性,可以通过右上方的 λ 参数来调节,λ 越接近1,那么在该主题下出现越频繁的词语,跟主题越相关。想更多的了解算法及可视化系统等相关内容,可以参考深度阅读材料 8.5.1。

8.2.2 sklearn

和 gensim 模块一样,pyLDAvis 包下也定义了 sklearn 模块,来可视化通过 sklearn 库构建的 LDA模型,同样利用该模块下定义的 prepare 函数实现可视化,调用方式如下:prepare(lda_model, dtm, vectorizer, **kwargs)

参数说明:

lda_model:利用参数“dtm”构建的 LDA 模型

dtm:用于构建 LDA 模型的矩阵,可以是 dtm 矩阵,也可以是 tf-idf 矩阵

vectorizer:将原始语料转化为参数“dtm”的对象,即 sklearn.feature_extraction.text 下定义的 CountVectorizer 或 TfIdfVectorizer 实例

例 2


In [3]:import pyLDAvis.sklearn
       # 在 notebook 中自动展示可视化结果
       pyLDAvis.enable_notebook()
       # 导入构建 LDA 模型所需的相关工具
       from sklearn.feature_extraction.text import CountVectorizer
       from sklearn.decomposition import LatentDirichletAllocation
       # 利用 CountVectorizer 计算 dtm 矩阵
       vectorizer = CountVectorizer()
       corpus_dtm=vectorizer.fit_transform(title)
       # 构建三维语义空间
       lda = LatentDirichletAllocation(n_topics=3)
       lda.fit_transform(corpus_dtm)
Out[3]:array([[  0.34782339,   0.35310333,   9.29907328],
              [  0.3410852 ,   8.30516941,   0.35374539],
              [  9.31370592,   0.3427256 ,   0.34356848],
              [  0.34707267,   9.29574632,   0.35718102],
              [  0.34862886,   9.29841902,   0.35295212],
              [  0.35934982,  11.29026163,   0.35038855],
              [  0.35032286,   0.35805016,  11.29162699],
              [ 14.29856804,   0.35289431,   0.34853765]])
In [4]: # 可视化主题模型
       pyLDAvis.sklearn.prepare(lda, corpus_dtm, vectorizer)
Out[4]:@todo 补充截图 9.2.1-3

results matching ""

    No results matching ""