主题模型LDA

主题模型,说实话之前学的时候还真没见过,所以看到这一章的时候感觉很是疑惑,不知道主题模型是要干什么。看完后感觉这个主题模型应该是nlp中的一种特殊的聚类方式,可以通过对文档提取主题,然后根据不同的主题进行聚类的方式,他首先肯定不是分类问题,感觉还是可以勉强归为一种聚类吧,这一章给的一个例子感觉特别好,他是将维基百科的今年文档全部拖下来进行主题提取,所以做出这个主题还是很有意义的。

数据集

第一个例子是用的美国联合通讯社(AP)的新闻报道 数据集 ,这个数据集也是一个标准数据集,他在主题模型的一些初始工作中被使用过。另一个数据集是英文版的维基百科数据集比较大,可能需要下一段时间。我们从htto://dumps.wikimedia.org 下载整个维基百科。文中的 下载链接 当然也可以用其他年份的,文中使用扩展名为.xml.bz2的文件,直接使用gensim工具建立了索引:

注意这段代码在bash中执行,而不是python的代码。

> python -m gensim.scripts.make_wiki enwiki-latest-pages-articles.xml.bz2
> wiki_en_output
>

LDA 潜在狄利克雷分配

LDA 缩写可以表示两种机器学习的方法,一种是这里的潜在狄利克雷分配(Latent Dirichlet Allocation),另一个是线性判别式分析(Linear Discriminant Analysis),前者是一种主题模型方法,后者是一种分类方法。scikit-learn中的sklearn.lda可以实现线性判别式分析,但sklearn中并没有潜在狄利克雷分配的实现。我们使用gensim包来实现潜在狄利克雷分配。使用pip可以直接进行安装。使用AP数据,示例如下:

from gensim import corpora, models, similarities
corpus = corpora.BleiCorpus('.data/ap/ap.dat','/data/ap/vocab.txt')
model = models.ldamodel.LdaModel(corpus, num_topics = 100, id2word = corpus.id2word, alpha=1.0/len(corpus)) # 构造LDA模型函数
topics = [model[c] for c in corpus]

对于model的那个构造函数的解释:alpha是一个重要的参数,较大的alpha值会导致每个文档中包含更多的主题,alpha必须是正数,通常很小,一般小于1,默认是1.0/len(corpus)。这时topics就是目前分出来的主题,主题模型是一个稀疏的模型,即便每个文档中有很多潜在主题,也只有一小部分会被用到。

对于整个维基百科的主题建立,通过上面建立索引,我们可以继续进行下面的工作。首先是引入一些程序库,并把预处理的数据读入,然后建立lDA模型:

import logging, gensim
logging.basicConfig(
format='%(asctime)s : %(levelname)s : %(message)s',
level=logging.INFO)
idword =
gensim.corpora.Dictionary.load_from_text('wiki_en_output_wordids.txt')
mm = gensim.corpora.MmCorpus('wiki_en_output_tfidf.mm')
model = gensim.models.ldamodel.LdaModel(corpus=mm,
id2word=id2word, num_topics=100, update_every=1,
chunksize=10000, passes=1)

一旦完成,你可以把结果保存到文件里,时间比较长,但他会在控制台上看到这个过程。

model.save('wiki_ida.pkl') # 保存到文件wiki_ida.pkl中
model = gensim.models.ldamodel.LdaModel.load('wiki_ida.pkl') # 从文件wiki_ida.pkl中读出结果数据

我们可以对其中的主题进行一下分析统计

topics = []
for doc in mm:
  topics.append(model[doc])

import numpy as np
lens = np.array([len(t) for t in topics])
print np.mean(lens) # 查看一下平均每个topic下有多少篇文档
print np.mean(lens <=10) # 查看一下,文档数小于10的topic所占的比例

选择主题个数

之前我们是使用的固定的主题个数(100)来进行的统计,这个数据是随意设定的,很可能跟实际并不相符。我们其实还有一些别的方法来自动的确定主题数目,有一个很流行的模型叫做层次狄利克雷过程(HDP),可以在gensim中使用。同LDA代码很相似,只需要把gensim.models.ldamodel.LdaModel的调用替换成一个对HdpModel 构造函数的调用即可,如下所示,但HDP方法计算时间要比LDA更长。

hdp = gensim.models.hdpmodel.HdpModel(mm,id2word)
### 使用 LDA 构建员工相关主题模型 #### 背景与定义 LDA 是一种基于概率统计的主题模型,用于从大量文本数据中提取潜在的主题结构。在构建员工相关的主题模型时,可以通过分析与员工相关的文档(如绩效评估报告、工作描述、反馈意见等),揭示隐藏在这些文档中的主要话题或趋势[^1]。 #### 数据准备 为了使用 LDA 进行主题建模,首先需要收集并预处理与员工相关的文本数据。这可能包括但不限于以下内容: - 员工的工作日志。 - 绩效考核记录。 - 上级领导的评价和建议。 - 客户或同事的反馈信息。 确保数据质量是成功的关键一步。通常需要执行如下操作: - **去除停用词**:删除常见的无意义词汇(如“的”、“是”、“在”等)。 - **词干提取/词形还原**:将词语转换为其基本形式。 - **向量化表示**:将文本转化为数值矩阵以便后续计算。 #### 模型建立流程 以下是利用 Python 和 `gensim` 库实现 LDA 的具体步骤: ```python import gensim from gensim.utils import simple_preprocess from gensim.parsing.preprocessing import STOPWORDS from nltk.stem import WordNetLemmatizer, SnowballStemmer import numpy as np import pandas as pd # 加载数据集 (假设已有一个包含员工评论的数据框 df_employee_reviews) data = df_employee_reviews['review'].values.tolist() def preprocess(text): result = [] for token in gensim.utils.simple_preprocess(text): if token not in gensim.parsing.preprocessing.STOPWORDS and len(token) > 3: result.append(WordNetLemmatizer().lemmatize(token, pos='v')) return result processed_data = list(map(preprocess, data)) # 创建字典和语料库 dictionary = gensim.corpora.Dictionary(processed_data) corpus = [dictionary.doc2bow(text) for text in processed_data] # 训练 LDA 模型 lda_model = gensim.models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=5, # 设置主题数量 random_state=100, update_every=1, chunksize=100, passes=10, alpha='auto', per_word_topics=True) # 输出主题及其关键词 topics = lda_model.print_topics() for topic in topics: print(topic) ``` 上述代码展示了如何加载数据、预处理文本以及训练 LDA 模型的过程。其中,`num_topics` 参数决定了要提取主题数目,在实际应用中可以根据需求调整此值[^3]。 #### 结果解读 完成模型训练后,可以从输出的结果中看到各个主题的主要组成成分。例如,某个主题可能会由诸如“团队合作”、“项目管理”这样的高频词汇主导,从而反映这一领域内的核心关注点[^4]。 #### 性能优化策略 当面对大规模数据集或者复杂场景时,可考虑采用更高效的推理技术来提升性能表现: - **吉布斯采样**:适用于较小规模的数据集,能够提供较为精确的概率估计。 - **变分推断**:适合于较大规模的数据集,能够在较短时间内获得合理近似的解。 通过选择合适的算法和技术手段,可以使 LDA 更加适应具体的业务环境和资源条件。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值