【NLP】LDA主题模型的简单应用

前言

  LDA主题模型详解

  上文详细讲解了LDA主题模型,本篇将使用如下几种方式介绍,从整体上了解LDA模型的简单应用

  1. 采用 lda 库,安装方式:pip install lda
  2. 采用 gensim 中的模块,安装方式:pip install gensim
  3. 采用 scikit-learn 中模块,安装方式:pip install scikit-learn

本篇代码可见:Github

一、lda 库中的 LDA

lda API地址:lda API

class lda.lda.LDA(n_topics, n_iter=2000, alpha=0.1, eta=0.01, random_state=None)

参数说明:

参数类型默认值描述
n_topicsint主题数量
n_iterint默认为2000采样迭代次数
alphafloat默认值为0.1用于分布主题的Dirichlet参数
etafloat默认值0.01用于分配单词的Dirichlet参数
random_stateint或RandomStateNone用于初始主题的生成器

简单使用:

import lda  # lda模块
import numpy  # numpy模块

X = numpy.array([[1,1], [2, 1], [3, 1], [4, 1], [5, 8], [6, 1]])

model = lda.LDA(n_topics=2, random_state=0, n_iter=100)
model.fit(X) 

属性:

属性名描述
components_主题-词分布
topic_word_主题词
nzw_主题 - 词分配的计数矩阵
ndz_文档-主题分配的计数矩阵
doc_topic_文档 - 主题分布
nz_主题分配计数数组

函数:

  • fit(X, y=None):用X调整模型

    X:类似数组,形状(n_samples,n_features),训练数据。

  • fit_transform(X, y=None):在X上应用降维

    返回文档主题分布

  • loglikelihood():计算完整的对数似然, l o g p ( w , z ) log p(w,z) logp(wz)

    使用的公式是 l o g p ( w , z ) = l o g p ( w ∣ z ) z + l o g p ( z ) log p(w,z)= log p(w | z)z+ logp(z) logp(wz)=logp(wz)z+logp(z)

  • transform(X, max_iter=20, tol=1e-16):根据先前安装的模型转换数据X

    返回文档主题分布

实际案例:LDA主题模型初识

在这里插入图片描述

  • 从主题的词分布中我们可以得到,每个主题下每个词出现的概率,词分布
  • 从文档的主题分布中我们可以得到,每个文档属于每个主题的概率,主题分布

代码可见:01_LDA主题模型初识.ipynb

二、gensim 模块中的 LDA

API 地址:gensim API

class gensim.models.ldamodel.LdaModel(corpus=None, num_topics=100, id2word=None, 
	 distributed=False, chunksize=2000, passes=1, update_every=1, alpha='symmetric',
	 eta=None, decay=0.5, offset=1.0, eval_every=10, iterations=50, gamma_threshold=0.001, 
	 minimum_probability=0.01, random_state=None, ns_conf=None, minimum_phi_value=0.01,
 	 per_word_topics=False, callbacks=None, dtype=<type 'numpy.float32'>)

常用参数说明:

参数类型默认值说明
corpusiterable of list of (int,float)文档向量
num_topicsint100要从训练语料库中提取的请求潜在主题的数量
id2worddict of (int,str)None从单词ID到单词的映射,可通过gensim.corpora.dictionary.Dictionary 产生

详细内容可参考API,这里就不一一举出

实际案例:希拉里的邮件

代码可见:02_使用gensim中的LDA模型.ipynb

  • 该案例可以得到,每个主题下最常出现的单词
  • 判断每句话各自属于哪个potic

三、scikit-learn 模块中的 LDA

API地址:API

# 导入方式
from sklearn.decomposition import LatentDirichletAllocation

class sklearn.decomposition.LatentDirichletAllocation(n_components=10, doc_topic_prior=None, 
	topic_word_prior=None, learning_method=’batch’, learning_decay=0.7, learning_offset=10.0, 
	max_iter=10, batch_size=128, evaluate_every=-1, total_samples=1000000.0, perp_tol=0.1, 
	mean_change_tol=0.001, max_doc_update_iter=100, n_jobs=None, verbose=0, random_state=None, 
	n_topics=None)

常用参数说明:

参数描述
n_components主题数量
learning_method用于更新_component的方法,通常,如果数据大小很大,则在线更新将比批量更新快得多
learning_decay在线学习方法中控制学习率的参数
max_iter最大迭代次数
batch_size每次EM迭代中使用的文档数。仅用于在线学习。
random_state如果是int,则random_state是随机数生成器使用的种子; 如果是RandomState实例,则random_state是随机数生成器; 如果没有,随机数生成器所使用的RandomState实例np.random。

详细内容可参考API

实际案例:LDA模型

代码可见:03_scikit-learn中的LDA模型.ipynb

在加载数据后,需要用到 from sklearn.feature_extraction.text import CountVectorizer 将文本数据转换为向量的形式(词袋法) 要求给定的数据中单词是以空格隔开的

四、scikit-learn 模块中的 LDA

API地址:API

# 导入
from sklearn.decomposition import TruncatedSVD
class sklearn.decomposition.TruncatedSVD(n_components=2, algorithm=’randomized’,
										 n_iter=5, random_state=None, tol=0.0)

参数说明:

参数描述
n_components主题数量
algorithm使用SVD求解器
n_iter随机SVD求解器的迭代次数
random_state随机数生成器种子

具体内容可见API

案例代码可见:04_scikit-learn中的LSA模型.ipynb

此案例和上一案例类似,只是使用的模型不一样而已

五、scikit-learn 模块中的 NMF

API地址:API

# 导入
from sklearn.decomposition import NMF

class sklearn.decomposition.NMF(n_components=None, init=None, solver=’cd’, 
				beta_loss=’frobenius’, tol=0.0001, max_iter=200, random_state=None, 
				alpha=0.0, l1_ratio=0.0, verbose=0, shuffle=False)

参数说明:

参数描述
n_components主题数量
init用于初始化过程的方法
solver要使用的数值解算器
tol容忍停止条件
max_iter最大迭代次数

具体相关内容可参考API

代码可见:05_scikit-learn中的NMF模型.ipynb

此案例和上一案例类似,只是使用的模型不一样而已

六、总结

  本篇只是LDA一些库的基本使用,一般可归纳为如下基本:

  • 数据的获取
  • 数据的预处理(使其满足相应的模型)
  • 模型训练
  • 模型应用
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值