前言
上文详细讲解了LDA主题模型,本篇将使用如下几种方式介绍,从整体上了解LDA模型的简单应用
- 采用
lda
库,安装方式:pip install lda
- 采用
gensim
中的模块,安装方式:pip install gensim
- 采用
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_topics | int | 无 | 主题数量 |
n_iter | int | 默认为2000 | 采样迭代次数 |
alpha | float | 默认值为0.1 | 用于分布主题的Dirichlet参数 |
eta | float | 默认值0.01 | 用于分配单词的Dirichlet参数 |
random_state | int或RandomState | None | 用于初始主题的生成器 |
简单使用:
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(w,z)使用的公式是 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(w,z)=logp(w∣z)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'>)
常用参数说明:
参数 | 类型 | 默认值 | 说明 |
---|---|---|---|
corpus | iterable of list of (int,float) | 文档向量 | |
num_topics | int | 100 | 要从训练语料库中提取的请求潜在主题的数量 |
id2word | dict 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一些库的基本使用,一般可归纳为如下基本:
- 数据的获取
- 数据的预处理(使其满足相应的模型)
- 模型训练
- 模型应用