北京体育大学,如何用Python从海量文本抽取主题?,流浪地球

你在作业、学习中是否曾因信息过载叫苦连天?有一种办法能够替你读海量文章,并将不同的主题和对应的要害词抽取出来,让你谈笑间观其大约。本文运用Python对超越1000条文本做主题抽取,一步步带你领会非监督机器学习LDA办法的魅力。想不想试试呢?

吞没

每个现代人,简直都领会过信息过载的苦楚。文章读不过来,音乐听不过来,视频看不过来。可是实际的压力,使你又不能简单抛弃掉。

假定你是个研讨生,教科书和论文便是你不得不读的内容。现在有了各种其他的阅览途径,微信、微博、得到App、多看阅览、豆瓣阅览、Kindle,还有你在RSS上订阅的一大堆博客……状况就变得更严峻了。

由于对数据科学很感爱好,你订阅了许多的数据科学类微信群众号。尽管你很勤勉,但你知道自己仍然遗漏了许多文章。

学习了 Pyt北京体育大学,怎么用Python从海量文本抽取主题?,漂泊地球hon爬虫课 今后,你决议测验一下自己的屠龙之术。依北京体育大学,怎么用Python从海量文本抽取主题?,漂泊地球仗着爬虫的威力,你计划搜集到一切数据科学群众号文章。

你仔细剖析了微信群众号文章的检索办法,拟定了要害词列表。奇妙运用搜狗查找引擎的特性,你编写了自己的爬虫,并且成功地于午夜放到了云端运转。

高兴啊,激动啊……

第二天一早,天光刚亮,睡眠不足的你就兴冲冲地爬北京体育大学,怎么用Python从海量文本抽取主题?,漂泊地球起来去看爬取成果。竟然现已有了1000多条!你欣喜若狂,导出成为csv格局,存储到了本地机器,并且翻开阅览。

振奋了10几分钟之后,你冷却了下来,给自己提出了2个重要的问题。

  • 这些文章都值得读吗?
  • 这些文章我读得过来吗?

一篇数据科学类群众号,你均匀需求5分钟阅览。这1000多篇……你拿出核算器仔细算了一下。

读完这一宿搜集到的文章,你不眠不休的话,也需求85个小时。

在你阅览的这85个小时里边,许许多多的数据科学类群众号新文章还会源源不断涌现出来。

你感觉自己快被文本内容吞没了,底子透不过null是什么意思气……

学了这么长期Python,你应该想到——我能否用自动化东西来剖析它?

好消息,答案是能够的。

可是用什么样的东西呢?

翻了翻你自己的武器库,你发现了词云、情感剖析和决策树。

可是,在帮你应对信息过载这件事儿上,上述武器好像都不大适宜。

词云你计划做几个?悉数文章只做一个的话,就会把一切文章的内容混杂起来,没有含义——由于你知道这些文章谈的便是数据科学啊!假设每一篇文章都别离做词云,1000多张图阅览起来,好像也没有什么好处。

你阅览数据科学类群众号文章是为了取得常识和技能,剖析文字中包括的情感好像杯水车薪。

决策树是能够用来做分类的,没错。可是它要求的输入信息是结构化符号数据,你手里握着的这一大堆文本,却刚好是非结构化符号数据。

悉数武器都哑火了。

没北京体育大学,怎么用Python从海量文本抽取主题?,漂泊地球联系。本文协助你在数据科学武器库中放上一件新式武器。它能够处理的,便是大批量的非结构无符号数据。在机器学习的分类里,它归于非监督学习(unsupervised machine learning)范畴。详细而言,咱们需求用到的办法叫主题建模(topic model)或许主题抽取(topic extraction)。

主题

已然要建模,咱们就需求弄理解树立什么样的模型。

依据维基百科的界说,主题模型是指:

在机器学习和自然语言处理等范畴是用来在一系列文档中发现笼统主题的一种核算模型。

这个界说自身好像就有点儿笼统,咱们举个比如吧。

仍是维基百科上,对一条心爱的小狗有这样一段叙说。

阿博(Bo;2008年10月9日-) 是美国第44任总统巴拉克奥巴马的宠物狗,也是奥巴马宗族的成员之一。阿博是一只已阉割的雄性黑色长毛葡萄牙水犬。奥巴马一家原本没有养狗,由于他的大女儿玛丽亚对狗过敏。但为了连续白宫主人历年均有养狗的传统,榜首家庭在入主白宫后,花了多个月去调查各种犬种,并特别挑选了葡萄牙水犬这一种掉毛少的低敏狗。

咱们来看看这条心爱的小狗相片:

问题来了,这篇文章的主题(topic)是什么?

你或许信口开河,“狗啊!”

且慢,换个问法。假定一个用户读了这篇文章,很感爱好。你想引荐更多他或许感爱好的文章给他,以下2段文字,哪个选项更适宜呢?

选项1:

阿富汗猎狗(Afghan Hound)是一种猎犬,也是最陈旧的狗种类。阿富汗猎狗表面扎实,细腻,柔滑,它的尾巴在最终一环弯曲。阿富汗猎狗生计于伊朗,阿富汗东部的冰冷山上,阿富汗猎狗开端是用来打猎野兔和瞪羚。阿富汗猎狗其他称号包括巴尔赫塔子库奇猎犬,猎犬,俾路支猎犬,喀布尔猎犬,或非洲猎犬。

选项2:

1989年夏天,奥巴马在西德利奥斯汀律师事务所担任暑期工读生期间,结识其时已是律师的米歇尔鲁滨逊。两人于1992年成婚,现有两个女儿——大女儿玛丽亚在1999年于芝加哥芝加哥大学医疗中心出世,而小女儿萨沙在2001年于芝加哥大学医疗中心出世。

给你30秒,考虑一下。

你的答案是什么?

我的答案是——不确认。

人类天然生成喜欢把杂乱问题简单化。咱们恨不得把一切东西区别红详细的、互不搅扰的分类,就好像药铺的一个个抽屉相同。然后需求的时分,从对应的抽屉里边取东西就能够了。

这就像是作业。早年咱们说“三百六十行”。随意拿出某个人来,咱们就把他归入其间某一行。

现在不行了,反例便是所谓的“斜杠青年”。

主题这个作业,也相同不那么爱憎分明。介绍小狗Bo的文章尽管不长,可是任何单一主题都无法彻底包括它。

假设用户是由于对小狗的喜欢,阅览了这篇文章,那么明显你给他引荐选项1会更抱负;可是假设用户重视的是奥巴马的家庭,那么比起选项2来,选项1就显得不是那么适宜了。

咱们有必要抛弃用一个词来描绘主题的测验,转而用一系列要害词来描写某个主题(例如“奥巴马”+“宠物“+”狗“+”榜首家庭“)。

在这种形式下,以下的选项3或许会锋芒毕露:

据英国《每日邮报》报导,美国一名男人近来企图劫持总统奥巴马配偶的宠物狗博(Bo),不吝由二千多公里远的北达科他州驱车往华盛顿,但由于走漏风声,被特勤局人员拘捕。奥巴马配偶现在养有博和阳光(Sunny)两只葡萄牙水犬。

讲到这儿,你大约弄理解了主题抽取的方针了。可是面临汗牛充栋的文章,咱们怎样能够把类似的文章聚合起来,并且提取描绘聚合后主题的重要要害词呢?

主题抽取有若干办法。现在最为盛行的叫做隐含狄利克雷散布(Latent Dirichlet allocation),简称LDA。

LDA相关原理部分,置于本文最终。下面咱们先用Python来测验实践一次主题抽戏精练习营取。假设你对原理感爱好,无妨再做延伸阅览。

预备

预备作业的榜首步,仍是先装置Anaconda套装。详细的流程进程请参阅《 怎么用Python做词云 》一文。

从微信群众渠道爬来的datascience.csv文件,请从 这儿 下载。你能够用Excel翻开,看看下载是否完好和正确。

假设一切正常,请将该csv文件移动到咱们的作业目录demo下。

到你的体系“终端”(macOS, Linux)或许“指令提示符”(Windows)下,进入咱们的作业目录demo,履行以下指令。

pip install jieba
pip install pyldavis

运转环境装备结束。

在终端或许指令提示符下键入:

jupyter not北京体育大学,怎么用Python从海量文本抽取主题?,漂泊地球ebook

Jupyter Notebook现已正确运转。下面咱们就能够正式编写代码了。

代码

咱们在J辽宁石油化工大学upyter Notebook中新建一个Python 2笔记本,起名为topic-model。

为了处理表格数据,咱们仍然运用数据框东西Pandas。先调用它。

import pandas as pd

然后读入咱们的数据文件datascience.csv,留意它的编码是中文GB18030,不是P皮耶拉的故事andas默许设置的编码,所以此处需求显式指定编码类型,避免呈现乱码过错。

df = pd.read_csv天齐网主页("datascience.csv紫菜", encoding='gb18030')

咱们来看看数据框的头几行,以承认读取是否正确。

df.head()

显现成果如下:

没问题,头几行内容一切列都正确读入,文字显式正常。咱们看看数据框青海省的长度,以承认数据是否读取完好。

df.shape

履行的成果为:

(1024, 3)

队伍数都与咱们爬取到的数量共同,经过。

下面咱们需求做一件重要作业——分词。这是由于咱们需求提取每篇文章的要害词。而中文自身并不运用空格在单词间区别。此处咱们选用“结巴分词”东西。这一东西的详细介绍和其他用处请拜见《怎么用Python做中文分词?》一文。

咱们首要调用jieba分词包。

import jieba

咱们此次需求处理的,不是单一文本数据,而是1000多条文本数据,因而咱们需求把这项作业并行化。这就需求首要编写一个函数,处理单一文本的分词。

def chinese_word_cut(mytext):
return " ".join(jieba.cut(mytext))

有了这个函数之后,咱们就能够不断调用它来批量处理数据框里边的悉数文本(正文)信息了。你当然能够自己写个循环来做这项作业。但这儿咱们运用更为高效的apply函数。假设你对这个函数有爱好,能够点击这段教育视频检查详细的介绍。

下面这一段代码履行起来,或许需求一小段时刻。请耐性等候。

df["content_cutted"] = df.content.apply(chinese_word_cut)

履行进程中或许会呈现如下提示。没联系,疏忽就好。

Building prefix dict from the default dictionary ...
Loading model from cache /var/folders/8s/k8yr4zy52q1dh107gjx280mw0000gn/T/jieba.cache
Loa小辛娜娜叶子毛衣视频ding model cost 0.406 seconds.
Prefix dict has been built succesfully.

履行结束之后,咱们需求检查一下,文本是否现已被正确分词。

df.content_cutted.head()

成果如下:

0 大 数据 工业 开展 遭到 国家 重视 , 而 大 数据 现已 上升 为 国家 战略 , 未...
1 点击 上方 “ 硅谷 周边 ” 重视 我 , 收到 最新 的 文章 哦 ! 昨日 , Goo...
2 国务院北京体育大学,怎么用Python从海量文本抽取主题?,漂泊地球 总理 李克强 当地 时刻 20 日 上午 在 纽约 下榻 饭馆 同 美国 经济 、 ...
3 2016 年 , 全峰 集团 持续 发掘 大 数据 、 云 核算 、 “ 互联网 + ” 等...
4 贵州 理工学院 举行 大 数据剖析 与 运用 专题 共享 会 借 “ 创响 我国 ” 贵...
Name: con王卫老婆邓丽贞简历tent_cutted, d张兆艺type: object

单词之间都现已被空格区别开了。下面咱们需求做一项重要作业,叫做文本的向量化。

不要被这个称号吓跑。它的意思其实很简单。由于核算机不光不认识中文,甚至连英文也不认识,它只认得数字。咱们需求做的,是把文章中的要害词转化为一个个特征(列),然后对每一篇文章数要害词呈现个数。

假定这儿有两句话:

I love the game.

I hate the game.

那么咱们就能够抽取出以下特征:

  • I
  • love
  • hate
  • the
  • game

然后上面两句话就转化为以下表格:

榜首句表明为[1, 1, 0, 1, 1],第二句是[1, 0, 1, 1, 1]。这就叫向量化了。机器就能看懂它们了。

原理北京体育大学,怎么用Python从海量文本抽取主题?,漂泊地球弄清楚了,让咱们引进相关软件包吧。

from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer

处理的文本都是微信群众号文章,里边或许会有许多的词汇。咱们不期望处理一切词汇。由于一来处理时刻太长,二来那些很不常用的词汇对咱们的主题抽取含义不大。所以这儿做了个限制,只从文本中提取1000个最重要的特征要害词慕容晓晓,然后中止。

n_features = 1000

下面咱们开端要害词提取和向量转化进程:

tf_vectorizer = CountVectorizer(strip_accents = 'unicode',
max_features=n_features,
stop_words='english',
max_df = 0.5,
min_df = 10)
tf = tf_vectorizer.fit_transform(df.content_cutted)

到这儿,好像什么都没有发作。由于咱们没有要求程序做任何输出。下面咱们就要放出LDA这个大招了。

先引进软件包:

from sklearn.decomposition import LatentDirichletAllocation

然后咱们需求人为设定主题的数量。这个要求让许多人大跌眼镜——我怎样知道这一堆文章里边多少主题?!

别着急。运用LDA办法,指定(或许叫瞎猜)主题个数是有必要的。假设你只需求把文章大略区别红几个大类,就能够把数字设定小一些;相反,假设你期望能够辨认出十分细分的主题,就增大主题个数。

对区别的成果,假设你觉得不行满足,能够经过持续迭代,调整主题数量来优化。

这儿咱们先设定为5个分类试试。

n_春眠不觉晓topics = 5
lda = LatentDirichletAllocation(n_topics=n_topics, max_iter=50,
learning_method='online',
learning_offset=50.,
random_state=0)

把咱们的1000多篇向量化后的文章扔给LD下颚A,让它欢快地找主题吧。

这一部分作业量较大,程序会履行一段时刻,Jupyter Notebook在履行中或许暂时没有响应。等候一瞬间就好,不要着急。

lda.fit(tf)

程序总算跑完了的时分,你会看到如下的提示信息:

LatentDirichletAllocation(batch_size=128, doc_topic_prior=None,
evaluate_every=-1, learning_decay=0.7,
learning_method='online', learning_offset=50.0,
max_doc_update_iter=100, max_iter=50, mean_change_tol=0.001,
n_jobs=1, n_topics=5, perp_tol=0.1, random_state=0,
topic_word_prior=None, total_samples=1000000.0, verbose=0)

可是,这仍是什么输出都没有啊。它终究找了什么样的主题?

主题没有一个确认的称号,而是用一系列要害词描写的。咱们界说以下的函数,把每个主题里边的前若干个要害词显现出来:

def print_top_words(model, feature_names, n_top_words):
for topic_idx, topic in enumerate(model.components_):
print("Topic #%d:" % topic_idx)
print(" ".join([feature_names[i]
for i in topic.argsort()[:-n_top_words - 1:-1]]))
print()

界说好函数之后,咱们暂定每个主题输出前20个要害词。

n_top_words = 20

以下指令会协助咱们顺次输出每个主题的要害词表:

tf_feature_names = tf_vectorizer.get_feature_names()
print_top_words(lda, tf_feature_names, n_top_words)

履行作用如下:

Topic #0:
学习 模型 运用 算法 办法 机器 可视化 神经网络 特征 处理 核算 体系 不同 数据库 练习 分类 依据 东西 一种 深度
Topic #1:
这个 便是 或许 假设 他们 没有 自己 许多 什么 不是 可是 这样 由于 一些 时分 现在 用户 所以 乳酸菌十分 现已
Topic #2:
企业 渠道 效劳 办理 互联网 公司 职业 数据剖析 事务 用户 产品 金融 立异 客户 完结 体系 才能 工业 作业 价值
Topic #3:
我国 2016 电子 增加 10 商场 城市 2015 重视 人口 检索 30 或许 其间 阅览 应当 美国 全国 同比 20
Topic #4:
人工智能 学习 范畴 智能 机器人 机器 人类 公司 深度 研讨 未来 辨认 现已 医疗 体系 核算机 现在 语音 百度 方面
()

在这5个主题里,能够看出主题0首要重视的是数据科学中的算法和技能,而主题4明显更重视数据科学的运用场景。

剩余的几个主题能够怎么概括?作为考虑题,留给你花时刻想一想吧。

到这儿,LDA现已成功帮咱们完结了主题抽取。可是我知道你不是很满足,由于成果不行直观。

那咱们就让它直观一些好了。

履行以下指令,会有风趣的作业发作。

import pyLDAvis
import pyLDAvis.sklearn
pyLDAvis.enable_notebook()
pyLDAvis.sklearn.prepare(lda, tf, tf_vectorizer)

对,你会看到如下的一张图,并且仍是可交互的动态图哦。

需求阐明的是,由于pyLDAv猎户座is这个包兼容性有些问题。因而在某些操作体系和软件环境下,你履行了刚刚的句子后,没有报错,却也没有图形显现出来。

没联系。这时分请你写下以下句子并履行:

data = pyLDAvis.sklearn.prepare(lda, tf, tf_vectorizer)
pyLDAvis.show(data)

Jupyter会给你提示一些正告。不必管它。由于此刻你的阅览器会弹出一个新的标签页,成果图形会在这个标签页里正确显现出来。

假设你看完了图后,需求持续程序,就回到原先的标签页,点击Kernel菜单下的榜首项Interrupt中止绘图,然后往下运转新的句子。

图的左边,用圆圈代表不同的主题,圆圈的巨细代表了每个主题别离包括文章的数量。

图的右侧,列出了最重要(频率最高)的30个要害词列表。留意当你没有把鼠标悬停在任何主题之上的时分,这30个要害词代表悉数文本中提取到的30个最重要要害词。

假设你把鼠标悬停在1号上面:

右侧的要害词列表会当即发作变化,赤色展现了每个要害词在当时主题下的频率。

以上是以为设定主题数为5的状况。可假设咱们把主题数量设定为10呢?

你不需求从头运转一切代码,只需求履行下面这几行就能够了。

这段程序仍是需求运转一段时刻,请耐性等候。

n_topics = 10
lda = LatentDirichletAllocation(n_topics=n_topics, max_iter=50,
learning_method='online',
learning_offset=50.,
random_state=0)
lda.fit(tf)
print_top_words(lda, tf_feature_names, n_top_words)
pyLDAvis.sklearn.prepare(lda, tf, tf_vectorizer)

程序输出给咱们10个主题下最重要的20个要害词。

Topic #0:
这个 便是 假设 或许 用户 一些 什么 许多 没有 这样 时分 可是 由于 不是 所以 不同 怎么 运用 或许 十分
Topic #1:
我国 孩子 增加 商场 2016 学生 10 2015 城市 自己 人口 群众 重视 其间 教育 同比 没有 美国 出资 这个
Topic #2:
data 变量 间隔 http 样本 com www 查验 办法 散布 核算 聚类 如下 分类 之间 两个 一种 差异 表明 序列
Topic #3:
电子 搜集 应当 或许 案子 维护 规则 信用卡 搜集 是否 提取 设备 法令 请求 法院 体系 记载 相关 要求 无法
Topic #4:
体系 检索 交通 渠道 专利 智能 监控 搜集 海量 办理 查找 才智 出行 视频 车辆 核算 完结 依据 数据库 存储
Topic #5:
可视化 运用 东西 数据库 存储 hadoop 处理 图表 数据仓库 支撑 查询 开发 规划 sql 开源 用于 创立 用户 依据 软件
Topic #6:
学习 算法 模型 机器 深度 神经网络 办法 练习 特征 分类 网络 运用 依据 介绍 研讨 猜测 回归 函数 参数 图片
Topic #7:
企业 办理 效劳 互联网 金融 客户 职业 渠道 完结 树立 社会 政府 研讨 资源 安全 年代 运用 传统 价值 医疗
Topic #8:
人工智能 范畴 机器人 智能 公司 人类 机器 学习 未来 现已 研讨 他们 辨认 或许 核算机 现在 语音 作业 现在 能够
Topic #9:
用户 公司 企业 互联网 渠道 我国 数据剖析 职业 工业 产品 立异 项目 2016 效劳 作业 科技 相关 事务 移动 商场
()

顺便的是可视化的输出成果:

假设不能直接输出图形,仍是依照前面的做法,履行:

data = pyLDAvis.sklearn.prepare(lda, tf, tf_vectorizer)
pyLDAvis.show(data)

你立刻会发现当主题设定为10的时分,一些风趣的现象发作了——大部分的文章抱团呈现在右上方,而2个小部落(8和10)好像离群索居。咱们检查一下这儿的8号主题,看看它的要害词构成。

经过高频要害词的描绘,咱们能够猜测到这一主题首要评论的是方针和法令法规问题,难怪它和那些技能、陆子艺算法与运用的主题显得如此方枘圆凿。

阐明

前文协助你一步步运用LDA做了主题抽取。成就感爆棚吧?可是这儿有两点小问题值得阐明。

首要,信息检索的业界专家一木棉袈裟看到方才的要害词列表,就会哈哈大笑——太粗糙了吧!竟然没有做中文停用词(stop words)去除!没错,为了演示的流通,咱们这儿玉屏风散疏忽了许多细节。许多内容运用的是预置默许参数,并且彻底疏忽了中文停用词设置环节,因而“这个”、“假设”、“或许”、“便是”这样的停用词才会大模大样地呈现在成果中。不过没有联系,完结比完美重要得多。知道了问题所在,后边改善起来很简单。有时机我会写文章介绍怎么参加中文停用词的去除环节。

别的,不论是5个仍是10个主题,或许都不是最优的数量挑选。你能够依据程序反应的成果不断测验。实际上,能够调理的参数远不止这一个。假设你想把悉数参数都搞懂,能够持续阅览下面的“原理”部分,按图索骥寻觅相关的阐明和指引。

原理

前文咱们没有介绍原理,而是把LDA当成了一个黑箱。不是我不想介绍原理,而是过于杂乱。

只给你展现其间的一个公式,你就能管窥其杂乱程度了。

泄漏给你一个隐秘:在核算机科学和数据科学的学术讲座中,讲者在介绍到LDA时,都往往会把原理这部分直接跳过去。

好在你不需求把原理彻底搞清楚,再去用LDA抽取主题。

这就像是学开车,你只需懂得怎么加快、刹车、换挡、打方向,就能让车在路上行进了。即使你经过一切考试并取得了驾驶证,你真的了解发动机或电机(假设你开的是纯电车)的结构和作业原理吗?

可是假设你便是期望了解LDA的原理,那么我给你引荐2个学起来不那么苦楚的资源吧。

首要是教程幻灯。slideshare是个寻觅教程的好去处。 这份教程 阅览量超越20000,内容浅显易懂,讲得十分明晰。

但研讨生考试成绩查询假设你跟我相同,是个视觉学习者的话,我更引荐你看 这段 Youtube视频。

讲者是Christine Doig,来自Continuum Analytics。咱们一向用的Python套装Anaconda便是该公司的产品。

Christine运用的LDA原理解说模型,不是这个LDA经典论文中的模型图(大部分人觉得这张图不易懂):

她深化阅览了各种文献后,总结了自己的模型图出来:

用这个模型来解说LDA,你会当即有恍然大悟的感觉。

祝探究旅程愉快!

评论

除了本文说到的LDA算法,你还知道哪几种用于主题抽取的机器学习算法?你觉得主题建模(topic model)在信息检索等范畴还有哪些能够运用的场景?欢迎留言共享给咱们,咱们一同沟通评论。

链接:https://www.jianshu.com/p/fdde9fc03f94