主题模型LDA

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

  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模型将文章分成不同的主题

载入数据

import pandas as pd
df = pd.read_csv("datascience.csv", encoding='gbk')

打印数据的头几行

df.head()

title

author

content

0

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

财经热点扒客

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

1

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

硅谷周边

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

2

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

苏州高新区金融办

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

3

全峰集团持续挖掘大数据

快递物流网

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

4

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

贵州理工学院

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

打印数据框的大小

df.shape
(1024, 3)

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

分词

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

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

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

df["content_cutted"] = df.content.apply(chinese_word_cut)
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.

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

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

用gensim训练主题模型

清洗标点、停用词

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

切词

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)
# 测试文本清洗
doc = documents[1]
print clean_text(doc)
点击 上方 硅谷 周边 关注 收到 最新 文章 昨天 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 二维码 关注

生成字典

dictionary = corpora.Dictionary(tokenized_corpus)
# 过滤掉出现次数少于20或在不超过10%的文档中出现的词
dictionary.filter_extremes(no_below=20, no_above=0.1)
print(dictionary)
Dictionary(2402 unique tokens: [u'\u91d1\u878d\u673a\u6784', u'\u5982\u540c', u'\u8fd8\u8981', u'\u7f16\u8bd1', u'\u4e3a\u4e3b']...)

生成稀疏矩阵

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)
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模型

num_topics = 20
%time lda_model = LdaModel(mm_corpus, num_topics=num_topics, id2word=dictionary, passes=20)
CPU times: user 2min 34s, sys: 2.06 s, total: 2min 36s
Wall time: 2min 44s

预测给定文档的主题概率分布

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])
(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 好 了 , 今年 的 司考 数据 统计 就 暂时 统计 到 这里 , 本 宝宝 也 累 了 , 等 会 打算 躺 在 床上 刷学 法网 , 哈哈 ! 点 阅读 原文 快速 查看 以上 统计数据 ↓

主题分析

for i in range(num_topics):
    print ('主题:',i)
    for word, prob in lda_model.show_topic(i, 10):
        print (word, prob)
主题: 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确定主题数

from gensim import models
# 最大主题数为50
hdp = models.hdpmodel.HdpModel(mm_corpus, dictionary, T=50)

打印主题数

num_hdp_topics = len(hdp.print_topics(num_topics=-1, num_words=20))
print( num_hdp_topics)
50
for i in range(num_hdp_topics):
    print '主题:',i
    for word, prob in hdp.show_topic(i, topn=20):
        print (word, prob)
主题: 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预测给定文章的主题分布

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])
(47, 0.38146775736441951)
0.003*"经理" + 0.003*"研究所" + 0.002*"预见" + 0.002*"为例" + 0.002*"尚未" + 0.002*"360" + 0.002*"顺利" + 0.002*"宇宙" + 0.002*"两倍" + 0.002*"几年"

本文分享自微信公众号 - 毛利学Python(sen13717378202)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏AI科技大本营的专栏

实战:基于tensorflow 的中文语音识别模型 | CSDN博文精选

目前网上关于tensorflow 的中文语音识别实现较少,而且结构功能较为简单。而百度在PaddlePaddle上的 Deepspeech2 实现功能却很强大,...

35910
来自专栏机器之心

AI当自强:独家揭秘旷视自研人工智能算法平台Brain++

如果说算法模型是果实,那么开发它的环境和框架就是培育果树的土壤。尽管平时在开发中,框架和底层环境没有那么引人瞩目,但没有这些底层技术的支持,优秀的思路和创意也就...

11820
来自专栏CDA数据分析师

PyTorch VS TensorFlow谁最强?这是标星15000+ Transformers库的运行结果

自然语言处理预训练模型库 Transformers 实现了几种用于 NLP 任务的最先进的 Transformer 架构,如文本分类、信息提取、问题解答和文本生...

14110
来自专栏机器学习与统计学

PyTorch称霸学界,TensorFlow固守业界,ML框架之争将走向何方?

自 2012 年深度学习再度成为焦点以来,很多机器学习框架成为研究者和业界工作者的新宠。从早期的学术框架 Caffe、Theano 到如今有业界背景的大规模框架...

6210
来自专栏中科院渣渣博肆僧一枚

tf.compat

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

4830
来自专栏量子位

PyTorch&TensorFlow跑分对决:哪个平台运行NLP模型推理更快

开源社区的支持度、上手的难易度都是重要的参考。还有人说:学术界用PyTorch,工业界用TensorFlow。

5310
来自专栏深度应用

『TensorFlow2.0正式版』TF2.0+Keras速成教程·零:开篇简介与环境准备

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

12330
来自专栏磐创AI技术团队的专栏

PyTorch&TensorFlow跑分对决:哪个平台运行NLP模型推理更快

开源社区的支持度、上手的难易度都是重要的参考。还有人说:学术界用PyTorch,工业界用TensorFlow。

7020
来自专栏锦小年的博客

TensorFlow v2.x使用说明[1]-概要与更新

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

11930
来自专栏青笔原创

Keras 从零开始构建深度神经网络

Keras 是一个用于定义和训练神经网络的高阶API。简单的说,Keras 是对 TensorFlow 等深度学习框架的更高一层的封装,以提供更加优雅,用户友好...

7320

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励