前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >主题模型LDA

主题模型LDA

作者头像
润森
发布2019-11-07 13:57:46
1.8K1
发布2019-11-07 13:57:46
举报
文章被收录于专栏:毛利学Python毛利学Python

学习一时爽,一直学习一直爽

  Hello,大家好,我是 もうり,一个从无到有的技术+语言小白。

记录于5月,于11.6回顾学习

主题模型

主题模型(topic model)是以非监督学习的方式对文集的隐含语义结构(latent semantic structure)进行聚类(clustering)的统计模型。

主题模型主要被用于自然语言处理(Natural language processing)中的语义分析(semantic analysis)和文本挖掘(text mining)问题,例如按主题对文本进行收集、分类和降维;也被用于生物信息学(bioinfomatics)研究 。隐含狄利克雷分布Latent Dirichlet Allocation, LDA)是常见的主题模型

LDA

2003年,David M.Blei、Andrew Ng和Jordan I. Michael提出了隐含狄利克雷分布(Latent Dirichlet Allocation, LDA) 。LDA得到了广泛使用

举例而言,在“狗”主题中,与该主题有关的字符,例如“狗”、“骨头”等词会频繁出现;在“猫”主题中,“猫”、“鱼”等词会频繁出现。若主题模型在分析一篇文章后得到10%的“猫”主题和“90%”的狗主题,那意味着字符“狗”和“骨头”的出现频率大约是字符“猫”和“鱼”的9倍。

该案例使用主题分析LDA模型将文章分成不同的主题

载入数据
代码语言:javascript
复制
import pandas as pd
df = pd.read_csv("datascience.csv", encoding='gbk')

打印数据的头几行

代码语言:javascript
复制
df.head()

title

author

content

0

大数据产业迎政策暖风 最新大数据概念股一览

财经热点扒客

大数据产业发展受到国家重视,而大数据已经上升为国家战略,未来发展前景很广阔。大数据产业“十三...

1

Google发布机器学习平台Tensorflow游乐场~带你一起玩神经网络!

硅谷周边

点击上方“硅谷周边”关注我,收到最新的文章哦!昨天,Google发布了Tensorflow游...

2

李克强:中国大数据和云计算产业是开放的

苏州高新区金融办

国务院总理李克强当地时间20日上午在纽约下榻饭店同美国经济、金融、智库、媒体等各界人士座谈,...

3

全峰集团持续挖掘大数据

快递物流网

2016年,全峰集团持续挖掘大数据、云计算、“互联网+”等前沿技术和物流快递的融合,并通过优...

4

第366期【微理工】贵州理工学院召开大数据分析与应用专题分享会

贵州理工学院

贵州理工学院召开大数据分析与应用专题分享会 借“创响中国”贵安站巡回接力活动暨2016贵安大...

打印数据框的大小

代码语言:javascript
复制
df.shape
代码语言:javascript
复制
(1024, 3)

数据框一共有1024行,共3列

分词

载入结巴分词,并定义分词函数

代码语言:javascript
复制
import jieba
def chinese_word_cut(mytext):
    '''
    分词函数:将分词后的结果串用空格拼接
    '''
    return " ".join(jieba.cut(mytext))

pandas的apply函数对训练语料进行分词

代码语言:javascript
复制
df["content_cutted"] = df.content.apply(chinese_word_cut)
代码语言:javascript
复制
Building prefix dict from the default dictionary ...
Loading model from cache /var/folders/z9/gmjx7g0x72d_yy6m48nhvdtm0000gn/T/jieba.cache
Loading model cost 0.420 seconds.
Prefix dict has been built succesfully.

执行完毕之后,我们需要查看一下,文本是否已经被正确分词。

代码语言:javascript
复制
df.content_cutted.head()
代码语言:javascript
复制
0    大 数据 产业 发展 受到 国家 重视 , 而 大 数据 已经 上升 为 国家 战略 , 未...
1    点击 上方 “ 硅谷 周边 ” 关注 我 , 收到 最新 的 文章 哦 ! 昨天 , Goo...
2    国务院 总理 李克强 当地 时间 20 日 上午 在 纽约 下榻 饭店 同 美国 经济 、 ...
3    2016 年 , 全峰 集团 持续 挖掘 大 数据 、 云 计算 、 “ 互联网 + ” 等...
4    贵州 理工学院 召开 大 数据分析 与 应用 专题 分享 会   借 “ 创响 中国 ” 贵...
Name: content_cutted, dtype: object
用gensim训练主题模型
清洗标点、停用词
代码语言:javascript
复制
import re
from nltk.corpus import stopwords

def load_punctuations():
    pun_list = []
    with open('./pun_list.txt') as fr:
        for line in fr:
            line = line.strip().decode('utf8')
            pun_list.append(line)
    return pun_list

# 英文停用词
english_stopwords = stopwords.words('english')
chinese_stopwords = {}.fromkeys([line.rstrip().decode('gbk') for line in open('chinese_stopwords.txt')])
# 标点
pun_list = load_punctuations()
def clean_text(text):
    text = text.strip()
    # 去除标点
    for pun in pun_list:
        text = text.replace(pun, ' ')
    new_text = ' '.join([w for w in text.split() if w not in english_stopwords and w not in chinese_stopwords and len(w)>1])
    return new_text
切词
代码语言:javascript
复制
import gensim
from gensim.models.ldamodel import LdaModel
from gensim import corpora
from nltk import wordpunct_tokenize

class Token_Corpus(object):
    def __init__(self,corpus):
        self.corpus = corpus

    def __iter__(self):
        for text in self.corpus:
            text = text.strip()
            text = clean_text(text)
            yield self.tokenize(text)

    def tokenize(self, text):
        token = wordpunct_tokenize(text)
        return token

documents = list(df["content_cutted"])
tokenized_corpus = Token_Corpus(documents)
代码语言:javascript
复制
# 测试文本清洗
doc = documents[1]
print clean_text(doc)
代码语言:javascript
复制
点击 上方 硅谷 周边 关注 收到 最新 文章 昨天 Google 发布 Tensorflow 游乐场 Tensorflow Google 今年 推出 机器 学习 开源 平台 Tensorflow 游乐场 浏览器 训练 神经网络 酷酷 图像 直观 了解 神经网络 工作 原理 今天 就让 硅谷 周边 一起 Tensorflow 游乐场 快乐 玩耍 昨天 Google 深度 学习 部门 Google Brain 掌门人 Google 万众 景仰 级别 工程师 Jeff Dean Google Plus 发布 Tensorflow 游乐场 消息 小伙伴 十分 激动 地去 Tensorflow 网站 神经网络 游乐场 地址 http playground tensorflow org 快点 一起 看看 游乐场 好玩 东东 打开 网站 看见 上面 标语 浏览器 神经网络 不用 担心 不坏 令人振奋 面对 随便 按钮 看看 数据 游乐场 形态 数据 每组 数据 形态 分布 一群 一个点 与生俱来 特征 x1 x2 表示 位置 数据 橙色 蓝色 神经网络 目标 训练 知道 位置 橙色 位置 蓝色 橙色 橙子 蓝色 蓝莓 假设 2000 散落 各处 橙子 蓝莓 1000 知道 坐标 蓝莓 橙子 蓝莓 信息 训练 神经网络 能够 准确 预测出 1000 橙子 蓝莓 上面 数据 发现 相对 简单 地区 分开 最后 一组 螺旋 数据 最难 Tensorflow 游乐场 数据 十分 灵活 调整 noise 干扰 大小 改变 训练 数据 测试数据 比例 下图 noise 数据分布 一个 数据 信息 喂给 机器 学习 系统 需要 feature extraction 特征提取 真的 区分 蓝莓 橙子 大小 颜色 特征 一个点 x1 x2 两个 特征 两个 特征 衍生 许多 特征 抽象 来说 机器 学习 classifier 分类器 试图 一条 多条 能够 100 正确 地区 蓝色 橙色 蓝色 点会 在线 一边 橙色 另一边 上面 直观 第一张 图中 x1 唯一 特征 一条 x1 垂直 改变 参数 条线 左右 移动 特征 容易 看出 需要 智能 结合 一种 多种 特征 能够 成功 蓝色 橙色 分类 feature extraction 往往 机器 学习 应用 最难 部分 神经网络 能够 完成 大部分 任务 选定 x1 x2 特征 神经网络 一层 每个 神经元 进行 组合 来算出 一层 神经网络 神经元 一层 输出 进行 组合 组合 一次 预测 准确性 back propogation 每个 组合 weights 比重 表示 比重 越大 下面 就让 最难 螺旋形 数据 试试 神经网络 表现 神经网络 出现 往往 竭尽所能 地想 特征 喂给 系统 系统 十分 系统 往往 一层 方法 完成 分类 实验 传统 方法 所有 能够 想到 特征 输入 系统 选择 神经网络 最后 看出 单层 神经系统 完美 分离 橙色 蓝色 体验 神经网络 真正 魔法 神经网络 最大 魔力 在于 根本 需要 各种各样 特征 用来 输入 机器 学习 系统 需要 输入 特征 x1 x2 给予 足够 多层 神经网络 神经元 神经网络 组合 有用 特征 这次 试验 输入 x1 x2 选择 每层 神经元 神经网络 最后 发现 增加 神经元 神经网络 层数 输入 许多 特征 能够 成功 分类 神经网络 伟大 之处 在于 解决 分类 橙色 蓝色 简单 问题 额外 特征 似乎 难事 处理 问题 越来越 复杂 有用 特征 变成 最最 困难 需要 识别 哪张 图片 哪张 图片 特征 真正 有效 神经网络 系统 学习 特征 有效 无效 大大提高 解决 复杂 机器 学习 问题 能力 太酷 以上 文章 是不是 神经网络 直观 认识 好奇 小伙伴 欢迎 http playground tensorflow org 试试看 真的 好玩 作者简介 硅谷 周边 本科毕业 Carnegie Mellon University 卡耐基 梅隆 大学 主修 电子 计算机 工程 机器人 先后 苹果 Macintosh Systems iPod Google Android Google Glass 工作 现在 Google 一名 软件 工程师 之前 好玩 走进 Tesla 工厂 探究 硅谷 最热 电动汽车 制造 最新 可爱 机器人 搜集 一边 做事 一边 卖萌 VC VC 史上 第一个 各大 GP 投出 VC 同行 排名 公布 内有 完整 统计分析 盘点 五年 Google 有趣 愚人节 玩笑 里面 彩蛋 硅谷 周边 听听 故事 硅谷 时尚 尖端 Google 免费 tshirt 现在 AI 打败 世界围棋 冠军 无法 进行 分钟 正常 对话 硅谷 周边 2016 第一季度 新进 独角兽 完整 分析 报告 点击 阅读 原文 Read More 二维码 关注
生成字典
代码语言:javascript
复制
dictionary = corpora.Dictionary(tokenized_corpus)
# 过滤掉出现次数少于20或在不超过10%的文档中出现的词
dictionary.filter_extremes(no_below=20, no_above=0.1)
print(dictionary)
代码语言:javascript
复制
Dictionary(2402 unique tokens: [u'\u91d1\u878d\u673a\u6784', u'\u5982\u540c', u'\u8fd8\u8981', u'\u7f16\u8bd1', u'\u4e3a\u4e3b']...)
生成稀疏矩阵
代码语言:javascript
复制
class MyCorpus(object):
    def __init__(self, token_list, dictionary):
        self.token_list = token_list
        self.dictionary = dictionary

    def __iter__(self):
        for tokens in self.token_list:
            yield self.dictionary.doc2bow(tokens)

corpus = MyCorpus(tokenized_corpus,dictionary)
%time gensim.corpora.MmCorpus.serialize('data_science.mm', corpus)


mm_corpus = gensim.corpora.MmCorpus('data_science.mm')
print(mm_corpus)
代码语言:javascript
复制
CPU times: user 5.58 s, sys: 82.1 ms, total: 5.66 s
Wall time: 5.89 s
MmCorpus(1024 documents, 2402 features, 103771 non-zero entries)
训练LDA模型
代码语言:javascript
复制
num_topics = 20
%time lda_model = LdaModel(mm_corpus, num_topics=num_topics, id2word=dictionary, passes=20)
代码语言:javascript
复制
CPU times: user 2min 34s, sys: 2.06 s, total: 2min 36s
Wall time: 2min 44s
预测给定文档的主题概率分布
代码语言:javascript
复制
doc_num = 45

# Returns Topic + Probability of Topic
lda_vector = lda_model[mm_corpus[doc_num]]
# Prints the most likely Topic. Performs Max based on the 2nd element in the tuple
print(max(lda_vector, key=lambda item: item[1]))
print(lda_model.print_topic(max(lda_vector, key=lambda item: item[1])[0]))
print(documents[doc_num])
代码语言:javascript
复制
(4, 0.36161469088467285)
0.037*"信用卡" + 0.035*"案件" + 0.023*"亚马逊" + 0.020*"有限公司" + 0.016*"法律" + 0.013*"物流" + 0.013*"犯罪" + 0.012*"贵州" + 0.012*"申请" + 0.011*"保障"
学 法网 APP , 法律 人 必备 ! ( 司考 交流 , 法律 路上 , 法律 求职 ) 长 按 识别 二维码 下载 学 法网 APP2016 年 国家 司法考试 已 于 今天 ( 9 月 25 日 ) 落下 帷幕 , 学 法网 ( xuefa . com ) 迎来 了 访问 高峰 , 学 法网 APP 的 打开 率 也 急剧 上升 ( 打开 学 法网 缓慢 的 童鞋 , 请 耐心 等待 一下 哦 ) 。 在 学 法网 APP 上 , 有吐槽 2016 年司 考真题 的 、 有司 考 难易度 的 投票 、 有 总结 自己 考试 经历 的 等等 。 考虑 到 大家 刚考 完 不想 看太多 文字 , 于是 本小 编特 将 学法 网上 一些 热门 投票 以 “ 数据 ” 为 核心 , 并 以 图片 形式 展现 给 大家 , 以 让 大家 能 更 宏观 的 了解 2016 年 司法考试 。 一 、 2016 年司 考 各卷 难度 排行 : 卷 四 > 卷 二 > 卷 三 > 卷 一 25 日 下午 考试 结束 以后 , 学 法网 第一 时间 就 在 网上 对 参加 了 当天 考试 的 考生 进行 了 《 2016 年 司法考试 , 哪卷 最难 ? 》 的 投票 , 被 吐 槽 最 多 的 是 卷 二 和 卷 四 ( 觉得 卷 四 最难 的 占 38.42% , 觉得 卷二 最难 的 占 34.48% ) 、 其次 是 卷 三 , 最后 是 卷 一 , 数据 如下 图 : 投票 地址 :http : / / bbs . xuefa . com / thread - 540535 - 1 - 1 . html 二 、 2016 年 司考考 场 缺考 情况 : 司考 人数 很多 , 打 酱油 的 也 很多 通过 分析 学法 网上 的 投票 贴 《 2016 年司 考 , 还记 的 您 的 考场 上 缺考 几人 吗 ? 》 得出结论 , 考场 缺考 人数 达到 6 人 以上 竟然 达到 近 70% , 所以 , 司考 人数 虽然 很多 ( 据 不 完全 统计 , 2016 年司 考 人数 创 历史 之 最 ) , 但是 同样 的 打 酱油 的 人 也 很多 。 各地 考场 缺考 情况 如下 图 : 投票 地址 :http : / / bbs . xuefa . com / thread - 540064 - 1 - 1 . html 三 、 2016 年司 考 次数 统计 : 近一半 的 考生 为 司考考 了 3 次 以上 通过 分析 学 法网 的 投票 贴 《 大家 今年 【 2016 年 】 是 第几次 参加 司法考试 啊 ? 》 得出结论 , 竟然 只有 32.97% 是 第一次 参加 司法考试 , 也 就是 有近 70% 的 考生 都 是 2 战司 考 了 , 其中 有近 30% 的 考生 是 考 了 3 次 以上 , 这 充分说明 了 学 法律 的 考生 都 有 一股 坚韧不拔 的 精神 。 详细 数据 如下 : 投票 地址 :http : / / bbs . xuefa . com / thread - 540065 - 1 - 1 . html 四 、 2016 年 司考考 完 最 想 说 的话 : 明年 继续 小编 统计 了 《 2016 年司 考 终于 结束 了 , 大家 现在 最想 说 的 一句 话 是 ? 》 里面 的 跟贴 内容 , 竟然 大部分 都 与 “ 明年 继续 努力 ” 有关 , 比如 “ 明年 继续 吧 ” 、 “ 距 2017 年司 考 还有 365 天 ” 、 “ 明年 又 要 开始 了 ” “ 明年 不见 看来 是 不 可能 的 了 ” 等 , 难道 学 法律 的 人 都 普遍 谦虚 吗 ? 哈哈 , 除此外 , 还有 “ 明年 不见 ” “ 没脸 回去 见 爹娘 啦 “ 考试 侵犯 了 生命权 ” 等 , 除此之外 就是 吐槽 今年 考试 难 , 吐槽 司考 出题 人 的 ! 更 多 评论 可以 参阅 :http : / / bbs . xuefa . com / thread - 540525 - 1 - 1 . html 五 、 2016 年 司考考 完 最 想 做 的 事 : 睡醒 以后 继续 准备 2017 司考 根据 学法 网上 的 投票 数据 《 2016 年 司考考 后 , 大家 最想 做 的 事情 》 的 投票 数据 , 其中 得票 最高 的 就是 “ 准备 2017 年司 考 ” , 其次 就是 “ 睡 到 天昏地暗 ” , 再次 就是 “ 来学 法网 闲聊 、 发牢骚 ” , 接着就是 “ 来学 法网 核对 答案 ” , 难道 大家 的 意思 是 : 睡觉 睡醒 以后 继续 准备 2017 年司 考 ? 学法 的 , 怎么 都 这么 谦虚 ? 详细 数据 如下 : 投票 地址 :http : / / bbs . xuefa . com / thread - 540528 - 1 - 1 . html 好 了 , 今年 的 司考 数据 统计 就 暂时 统计 到 这里 , 本 宝宝 也 累 了 , 等 会 打算 躺 在 床上 刷学 法网 , 哈哈 ! 点 阅读 原文 快速 查看 以上 统计数据 ↓

主题分析

代码语言:javascript
复制
for i in range(num_topics):
    print ('主题:',i)
    for word, prob in lda_model.show_topic(i, 10):
        print (word, prob)
代码语言:javascript
复制
主题: 0
检索 0.0527524391955
专利 0.031551076106
信用 0.024616220332
保护 0.0227458187498
评分 0.0172172459105
征信 0.0168344542381
申请 0.012125020056
id 0.0089064639305
文献 0.00889650519672
法律 0.0088057430596
主题: 1
阿里 0.0114336424424
游戏 0.0107874357185
员工 0.00974455163699
付费 0.00927909442845
腾讯 0.00900040162823
新闻 0.00859241639632
顾客 0.00763218486202
大脑 0.00759843992203
受众 0.00644905502718
故事 0.00540966174524
   ……
主题: 19
孩子 0.085158066742
老师 0.0226770079845
投资者 0.0202564343332
家长 0.0196101249911
学校 0.0144804660258
家庭 0.0116211934006
概率 0.0112310689324
成绩 0.00999057993994
房价 0.00795824498818
涨幅 0.0075817851943

用HDP确定主题数

代码语言:javascript
复制
from gensim import models
# 最大主题数为50
hdp = models.hdpmodel.HdpModel(mm_corpus, dictionary, T=50)

打印主题数

代码语言:javascript
复制
num_hdp_topics = len(hdp.print_topics(num_topics=-1, num_words=20))
print( num_hdp_topics)
代码语言:javascript
复制
50
代码语言:javascript
复制
for i in range(num_hdp_topics):
    print '主题:',i
    for word, prob in hdp.show_topic(i, topn=20):
        print (word, prob)
代码语言:javascript
复制
主题: 0
大众 0.00350751711697
人口 0.00288858498672
工程 0.00240553091894
保护 0.00233686650757
资产 0.00215212953802
实验室 0.00187455212937
游戏 0.00184934218615
集团 0.0017692770693
AI 0.00171163931979
感知 0.00165077090976
回复 0.00159472291475
农业 0.00157917020373
亚马逊 0.00151858676786
亿元 0.00150623627139
智能化 0.00149905425278
加强 0.00147643587031
监管 0.00147057873197
旅游 0.00146754389235
信息技术 0.00145205512329
治理 0.00145157703188
 ……
李世石 0.00202229306612
顺序 0.00201218200172
掀起 0.00196848439331

用HDP预测给定文章的主题分布

代码语言:javascript
复制
lda_vector = hdp[mm_corpus[doc_num]]
# Prints the most likely Topic. Performs Max based on the 2nd element in the tuple
print(max(lda_vector, key=lambda item: item[1]))
print(hdp.print_topic(max(lda_vector, key=lambda item: item[1])[0]))
print(documents[doc_num])
代码语言:javascript
复制
(47, 0.38146775736441951)
0.003*"经理" + 0.003*"研究所" + 0.002*"预见" + 0.002*"为例" + 0.002*"尚未" + 0.002*"360" + 0.002*"顺利" + 0.002*"宇宙" + 0.002*"两倍" + 0.002*"几年"
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小刘IT教程 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 主题模型
  • LDA
  • 主题分析
  • 用HDP确定主题数
    • 用HDP预测给定文章的主题分布
    相关产品与服务
    大数据
    全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档