前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于LDA的文本主题聚类Python实现

基于LDA的文本主题聚类Python实现

作者头像
里克贝斯
发布2021-05-21 10:46:56
3.6K0
发布2021-05-21 10:46:56
举报
文章被收录于专栏:图灵技术域图灵技术域

LDA简介

LDA(Latent Dirichlet Allocation)是一种文档主题生成模型,也称为一个三层贝叶斯概率模型,包含词、主题和文档三层结构。所谓生成模型,就是说,我们认为一篇文章的每个词都是通过“以一定概率选择了某个主题,并从这个主题中以一定概率选择某个词语”这样一个过程得到。文档到主题服从多项式分布,主题到词服从多项式分布。

LDA是一种非监督机器学习技术,可以用来识别大规模文档集(document collection)或语料库(corpus)中潜藏的主题信息。它采用了词袋(bag of words)的方法,这种方法将每一篇文档视为一个词频向量,从而将文本信息转化为了易于建模的数字信息。但是词袋方法没有考虑词与词之间的顺序,这简化了问题的复杂性,同时也为模型的改进提供了契机。每一篇文档代表了一些主题所构成的一个概率分布,而每一个主题又代表了很多单词所构成的一个概率分布。

关键词:文档主题生成模型,无监督学习,概率模型,NLP

生成过程

对于语料库中的每篇文档,LDA定义了如下生成过程(generativeprocess):

1.对每一篇文档,从主题分布中抽取一个主题;

2.从上述被抽到的主题所对应的单词分布中抽取一个单词;

3.重复上述过程直至遍历文档中的每一个单词。

语料库中的每一篇文档与T(通过反复试验等方法事先给定)个主题的一个多项分布 (multinomialdistribution)相对应,将该多项分布记为θ。每个主题又与词汇表(vocabulary)中的V个单词的一个多项分布相对应,将这个多项分布记为φ。

具体推导可以参考:https://zhuanlan.zhihu.com/p/31470216

Python范例

使用到的库:jieba, gensim

为了使生成结果更精确,需要构造新词,停用词和同义词词典。

Python

代码语言:javascript
复制
import jieba
import jieba.posseg as jp
from gensim import corpora, models
 
# Global Dictionary
new_words = ['奥预赛', '折叠屏']  # 新词
stopwords = {' ', '再', '的', '们', '为', '时', ':'}  # 停用词
synonyms = {'韩国': '南朝鲜', '传言': '流言'}  # 同义词
words_nature = ('n', 'nr', 'ns', 'nt', 'eng', 'v', 'd')  # 可用的词性
 
 
def add_new_words():  # 增加新词
    for i in new_words:
        jieba.add_word(i)
 
 
def remove_stopwords(ls):  # 去除停用词
    return [word for word in ls if word not in stopwords]
 
 
def replace_synonyms(ls):  # 替换同义词
    return [synonyms[i] if i in synonyms else i for i in ls]
 
 
documents = [
    '足协申请取消女足奥预赛韩国主场比赛 公平原则保障安全',
    '芬森发声再回应传言:想念辽宁队友 为中国的球迷们祈福',
    '电商围剿涉疫商家进行时:哄抬物价,就这么罚你',
    '今晚视频直播华为新品发布会:全新折叠屏手机亮相']
add_new_words()
words_ls = []
for text in documents:
    words = replace_synonyms(remove_stopwords([w.word for w in jp.cut(text)]))
    words_ls.append(words)
 
# 生成语料词典
dictionary = corpora.Dictionary(words_ls)
# 生成稀疏向量集
corpus = [dictionary.doc2bow(words) for words in words_ls]
# LDA模型,num_topics设置聚类数,即最终主题的数量
lda = models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=2)
# 展示每个主题的前5的词语
for topic in lda.print_topics(num_words=5):
    print(topic)
# 推断每个语料库中的主题类别
print('推断:')
for e, values in enumerate(lda.inference(corpus)[0]):
    topic_val = 0
    topic_id = 0
    for tid, val in enumerate(values):
        if val > topic_val:
            topic_val = val
            topic_id = tid
    print(topic_id, '->', documents[e])

结果:

可以看到,一共分成了两类,文本库中的标题分别分成了0,1两类,即一个是体育类,一个是科技类。

需要注意的是,LDA模型是个无监督的聚类,每次生成的结果可能不同。

参考

  • https://www.jianshu.com/p/fa97454c9ffd
  • https://zhuanlan.zhihu.com/p/31470216
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-02-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • LDA简介
  • 生成过程
  • Python范例
  • 参考
相关产品与服务
云直播
云直播(Cloud Streaming Services,CSS)为您提供极速、稳定、专业的云端直播处理服务,根据业务的不同直播场景需求,云直播提供了标准直播、快直播、云导播台三种服务,分别针对大规模实时观看、超低延时直播、便捷云端导播的场景,配合腾讯云视立方·直播 SDK,为您提供一站式的音视频直播解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档