使用 Python 中的 Plotly Express 进行顶级 Spotify 歌曲数据探索
以 Spotify 歌曲数据为例,与 plotly express 取得联系,进行数据探索和可视化。
艾萨克·史密斯在 Unsplash 上拍摄的照片
数据可视化是数据科学的重要方面之一。它既可用于数据探索,也可用于交流分析结果。在数据浏览过程中,可视化可以揭示数据中隐藏的信息。用图表展示你的项目成果是交流你的发现的一个很好的方式。
Python 中有许多数据可视化库可供选择。一个这样的库被 plotly 表示。
Plotly Express 是 Plotly 的一个易于使用的高级界面,它处理“整齐”的数据并生成易于样式化的图形— Plotly
在本文中,我们将使用 plotly express 库探索和可视化来自 Kaggle 的 Spotify 热门歌曲数据集。
导入库
首先,我们需要使用 pip 或 conda 将 plotly 安装到我们的环境中。您可以在 plotly 网站上查看安装该库的完整文档。 Plotly Express 库与 Plotly 库合二为一。
有关静态图像导出的详细信息,请参阅 Python 中的静态图像导出。扩展地理支持有些 plotly.py…
plot.ly](https://plot.ly/python/getting-started/)
一旦安装了库,我们可以将库导入到我们的笔记本中。
import pandas as pd
import numpy as np
import plotly.express as px
数据准备
在本文中,我们使用了 Kaggle 的顶级 Spotify 音乐数据集。为了得到这个数据集,我们可以在这里下载数据集。这个数据集由世界上最受欢迎的 Spotify 歌曲和 2010 年至 2019 年的另外 13 个变量组成。但是,我们将只使用 2015 年开始的数据子集。
# Import Dataset
rawfile = './top10s.csv'#use encoder to avoid utf-8 error
df = pd.read_csv(rawfile,encoding = "ISO-8859-1")#remove id column
df = df.iloc[:,1:15]
df = df.loc[df['year']>=2015]# get 5 year data only
display(df.head())
print('Data frame shape: {}'.format(df.shape))
视觉探索
让我们用 plotly express 创建一个基本的可视化。首先,我们将使用一个条形图来查看在公告牌中出现频率最高的 5 个流派。
famous_genres = df['top genre'].value_counts().head(5).to_frame().reset_index()
famous_genres.columns = ['genre','Count']
famous_genres_list = list(famous_genres['genre'])# Visualize
px.bar(famous_genres,
x = 'genre',
y = 'Count',
title = 'Top 5 Genres',
template = 'plotly_white')
从 2015 年到 2019 年,舞蹈流行音乐是 Spotify billboard 中出现频率更高的流派。
其次,假设我们想知道这些流派每年的平均受欢迎程度。我们可以创建一个折线图来观察这个趋势。
top_5_genre = famous_genres_list
df_top = df.loc[df['top genre'].isin(top_5_genre)]group_by_genre = df_top.groupby(["year","top genre"]).mean().sort_values('year').reset_index()px.line(group_by_genre,
x = 'year',
y ='pop',
line_group = 'top genre',
title = 'Top Genres Average Popularity',
template = 'plotly_white',
color = 'top genre')
通过查看图表,即使流行舞曲风格的歌曲在公告牌上出现的频率最高,它的平均受欢迎程度仍然低于其他五大风格。但是,它总是逐年持续增长。
接下来,我们来看看这一时期最著名的艺术家是谁。我们将用柱形图来回答这个问题。
# Prepare data
famous_artist = df['artist'].value_counts().head(5).to_frame().reset_index()
famous_artist.columns = ['artist','Count']# Visualize
px.bar(famous_artist.sort_values('Count'),
x = 'Count',
y = 'artist',
title = 'Top 5 Artist',
template = 'plotly_white',
orientation = 'h')
与其他人相比,这五位艺术家贡献了 Spotify 中最热门的歌曲。
要看他们唱的每首歌的人气分布,可以用框图。
# Average Popularity of a particular genre over the yearstop_5_artist = famous_artist_list
df_top_artist = df.loc[df['artist'].isin(top_5_artist)]px.box(df_top_artist,
x = 'artist',
y = 'pop',
hover_name = 'title',
title = 'Artist Songs Popularity Distribution',
template = 'plotly_white',
points = 'all')
在其他歌曲中,《魔力红的回忆》最受欢迎。然而,这五位歌手的歌曲受欢迎程度的平均中位数在 70 到 80 之间。
这些歌曲中的每一首都有一个参数,如每分钟节拍数、能量、可跳舞性、响度、可爱度、长度等。我们可以通过制作流行度与每分钟节拍的散点图来检查一个变量与另一个变量之间的相关性。
px.scatter(df_top,
x = 'pop',
y = 'bpm',
color = 'top genre')
我们还可以制作一个散点图,以散点图的形式查看所有变量的相关性。
cols = df_top_artist.select_dtypes(include=['float', 'int']).columns.tolist()[1:]px.scatter_matrix(df_top_artist,
dimensions = cols,width=1400 ,height=1200, color = df_top_artist['top genre'])
最后的想法
通过数据探索,我们知道流行舞蹈是在 billboard 中出现最多的类型。即使这种类型没有显示出最高的人气得分,但从 2015 年到 2019 年,这种类型的人气不断增加。另一方面,最著名的艺术家是贾斯汀比伯。他在广告牌上出现了 12 次。然后最受欢迎的歌曲是《魔力红的回忆》。
使用 plotly express 进行可视化非常简单,尤其是当我们使用 panda 数据框时。我们只需要调用我们想要的图表,选择数据框,选择列,然后配置可定制的项目或让它使用默认值。通过这样做,我们将在一次函数调用中得到我们需要的图表。
参考
Plotly Express 是一个新的高级 Python 可视化库:它是 Plotly.py 的包装器,公开了一个简单的…
medium.com](https://medium.com/plotly/introducing-plotly-express-808df010143d) [## Plotly Express
每行代表一朵花。https://en.wikipedia.org/wiki/Iris_flower_data_set 用 150 英镑返回一个“熊猫. DataFrame”
plot.ly](https://plot.ly/python/plotly-express/)
2020 年你应该知道的 SQL 面试问题
如果你准备从事任何与数据相关的工作,你应该知道的问题
图片由皮克斯拜的 Gerd Altmann 提供
大多数与数据相关的工作需要你了解 SQL,你不应该让 SQL 面试问题成为你找不到工作的理由。尤其是在查询方面,它学起来很快,你应该确保你已经准备好回答一些最常见的与 SQL 相关的面试问题。
就这样,我给你一个 SQL 相关的面试问答列表。尽情享受吧!
注:如果你不知道如何用 SQL 查询,你可以在五分钟内学会 SQL这里 。
什么是 SQL?
SQL 代表结构化查询语言。根据 Wikipedia,SQL 是一种特定于领域的语言,用于编程,设计用于管理关系数据库管理系统中的数据,或用于关系数据流管理系统中的流处理[1]。
什么是主键?
主键是唯一标识表中每一行的一列(或一组列)。通常,ID 列就是为此目的而创建的。
什么是子句?
SQL 子句是 SQL 语句中定义明确的部分,通常用于根据预定义的条件过滤结果,但情况并非总是如此。例如,ORDER BY 是一个子句,但不筛选结果。
五个主要子句是 TOP 子句、WHERE 子句、ORDER BY 子句、GROUP BY 子句和 HAVING 子句。
WHERE 和 HAVING 子句的区别是什么?
WHERE 和 HAVING 都用于筛选表以满足您设置的条件。当它们与 GROUP BY 子句一起使用时,两者之间的区别就显现出来了。WHERE 子句用于在分组之前(GROUP BY 子句之前)过滤行**,HAVING 用于在分组之后过滤行。**
什么是不同类型的连接,并解释每一种?
来自 SQL-Join 的图像
有四种不同类型的连接:
- 内部联接:返回在两个表中都有匹配值的记录
- 左连接:从左表返回所有的记录,从右表返回匹配的记录
- 右连接:返回右表中的所有记录和左表中与匹配的记录
- 完全连接:当左表或右表中有匹配项时,返回所有记录
UNION 和 JOIN 的区别是什么?
两者都用于将一个或多个表中的数据合并成一个结果。区别在于 JOIN 语句将不同表的列组合成一个结果,而 UNION 语句将不同表的行组合成一个结果。
DELETE 和 TRUNCATE 语句有什么区别?
DELETE 用于从表中删除一行或多行。使用 delete 语句后,可以回滚数据。
TRUNCATE 用于删除表中的所有行,并且数据在执行后不能回滚。
什么是视图?
视图也是一个表——它是对另一个表或多个表的查询的一个存储结果集,用户可以像对任何其他表一样对其进行查询。
什么是子查询,子查询有哪两种类型?
子查询(也称为内部查询或嵌套查询)是另一个 SQL 查询中的查询,用于返回将在主查询中作为条件使用的数据,以进一步限制要检索的数据[2]。
有两种类型的子查询:
- **相关子查询:**相关子查询不能独立于外部查询进行评估,因为子查询使用父语句的值。
- **不相关子查询:**不相关子查询可视为独立查询,子查询的输出在主查询中被替代。
你可以在这里了解更多。
聚合函数和标量函数有什么区别?为每一个给出一些例子
一个集合函数对多个值执行操作以返回一个值。聚合函数通常与 GROUP BY 和 HAVING 子句一起使用。聚合函数的一些示例包括:
- AVG() —计算一组值的平均值。
- COUNT() —统计特定表格或视图中的记录总数。
- MIN() —计算值集合的最小值。
- MAX() —计算值集合的最大值。
- SUM() —计算值集合的总和。
- FIRST() —获取值集合中的第一个元素。
- LAST() —获取值集合中的最后一个元素。
一个标量函数基于输入值返回单个值。标量函数的一些示例包括:
- LEN() —计算给定字段(列)的总长度。
- UCASE() —将字符串值的集合转换为大写字符。
- LCASE() —将字符串值的集合转换为小写字符。
- CONCAT() —连接两个或多个字符串。
- ROUND() —计算数值字段的舍入整数值(或小数点值)。
SQL 和 MySQL 有什么区别?
重申一下,SQL 是一种管理、检索和操作结构化数据库的特定领域语言。MySQL 是一个关系数据库管理系统,就像 Oracle 一样。
TLDR: SQL 是一种语言,而 MySQL 是一种数据库。
感谢阅读!
如果你喜欢我的工作,想支持我…
- 支持我的最好方式是在媒体上关注我这里。
- 在 Twitter 这里成为第一批关注我的人之一。我会在这里发布很多更新和有趣的东西!
- 此外,成为第一批订阅我的新 YouTube 频道 这里!
- 在 LinkedIn 上关注我这里。
- 在我的邮箱列表 这里报名。
- 看看我的网站,terenceshin.com。
相关文章
帮助您发展 SQL 技能,在任何面试中胜出
towardsdatascience.com](/5-common-sql-interview-problems-for-data-scientists-1bfa02d8bae6) [## 2020 年 20 分钟数据科学速成班
帮助你在顶尖科技公司找到工作的终极资源
towardsdatascience.com](/20-minute-data-science-crash-course-for-2020-8670ad4f727a) [## 超过 100 个数据科学家面试问题和答案!
来自亚马逊、谷歌、脸书、微软等公司的面试问题!
towardsdatascience.com](/over-100-data-scientist-interview-questions-and-answers-c5a66186769a)
参考
[1]https://en.wikipedia.org/wiki/SQL
https://www.tutorialspoint.com/sql/sql-sub-queries.htm
每个数据科学家都应该加入的顶级子编辑
10 个子编辑如果你是数据科学、机器学习、深度学习或人工智能爱好者,你必须加入 Reddit。
如果你是一名数据科学家,你必须加入 T2 的 Reddit。
作为一名数据科学、机器学习、深度学习和人工智能爱好者,很难及时了解所有新的出版物、研究、教程和工具,尤其是围绕数据科学、人工智能和机器学习的所有宣传。
当然,在这里的 媒体 上,有很多人分享故事和交流想法,也有一些伟大的媒体出版物,如面向数据科学的分析 Vidhya 以及更多(2020 年最佳数据科学出版物),但在本文中,我将谈论 Reddit 。
Reddit 无需介绍,它已经成为几乎任何主题的一站式阅读平台,每天几乎有4000 万 搜索,每月超过4.3 亿活跃用户超过120 万不同的社区/子社区。
关于 Reddit 的完整统计: 109 个可笑的 Reddit 统计&2020 年要知道的事实
对于那些不知道 subreddit 是什么的人来说, Subreddit ,简单来说就是代表了Reddit 上基于主题的群组/社区,由想要发布/讨论与该主题相关的新闻或故事的用户组成。
所以有了这些数据和事实,Reddit 是一个大社区,一个极好的知识来源和资源来源,也是一个保持 DS、ML 和 AI 新闻更新的好方法。
现在让我为您列出,每个数据科学、ML、DL 和 AI 爱好者必须关注和加入的顶级子网站:
r/数据科学
用户数量:213917
一个由数据科学从业者和专业人士组成的有用社区,他们分享想法、建议、项目、讨论工具并建立联系。
r/datascience:数据科学从业者和专业人士讨论和辩论数据科学职业生涯的地方…
www.reddit.com](https://www.reddit.com/r/datascience/)*
r/机器学习
用户数量:100.215 万
Reddit 上最古老的机器学习社区之一。包含分类为讨论、新闻、研究和项目的各种帖子。
它用于发布以下主题的故事:机器学习、数据挖掘、分析、预测统计、学习理论、模式识别。
r/机器学习:
www.reddit.com](https://www.reddit.com/r/MachineLearning/)*
r/learn 机器学习
用户数量:148009
一个致力于学习机器学习的活跃社区,用户在这里分享技巧、窍门、概念,甚至帮助实现机器学习。
r/learnmachinelearning:一个专门学习机器学习的子编辑器
www.reddit.com](https://www.reddit.com/r/learnmachinelearning/)*
语言技术
用户数量:20855 人
这个 subreddit 是一个关于自然语言处理(NLP)的讨论和新闻社区。由于这个利基领域在过去几年中加快了步伐,因此值得关注以了解更多关于自然语言处理(NLP)的信息。
*[## r/语言技术
自然语言处理是计算机科学、人工智能和计算语言学的一个领域
www.reddit.com](https://www.reddit.com/r/LanguageTechnology/)*
r/深度学习
用户数量:47,208
如果你刚刚开始进入深度学习领域,或者前段时间你已经有了一些使用人工神经网络的经验,你会在这个子编辑中找到深度学习的概念、理解和实现它们的资源、研究论文…
r/深度学习:
www.reddit.com](https://www.reddit.com/r/deeplearning/)*
r/数据集
用户数量:107811
在这里,您可以分享、讨论和查找用于数据挖掘、分析和知识发现的数据集
你也可以寻求技巧或建议来改进,并拥有一个与手头问题相关的好的数据集。
r/datasets:一个共享、查找和讨论数据集的地方。
www.reddit.com](https://www.reddit.com/r/datasets/)*
r/可视化
用户数量:55636 人
数据可视化对于数据科学家来说非常重要,是需要培养的最有用的专业技能之一。重要的是使用正确的图表,使用标签,并能够使数据易于理解。
所以这个子编辑是关于信息可视化和图形、图表、地图等设计的主题,所以你会发现关于数据可视化的指南、教程和讨论主题。
r/visualization:针对与信息可视化和图形、图表、地图等设计相关的主题。
www.reddit.com](https://www.reddit.com/r/visualization/)*
r/dataisbeautiful
用户数量:14421454
另一个 subreddit,对我来说,它是最适合数据可视化的一个,不仅因为它比 r/visualization 有更多的订阅者,而且它提供了大量关于数据可视化表示的讨论:图形、图表、地图等等。
r/dataisbeautiful:一个分享和讨论数据可视化表示的地方:图形、图表、地图等。
www.reddit.com](https://www.reddit.com/r/dataisbeautiful/)*
r/learnpython
用户数量:339,352
Python 在很短的时间内已经成为最受欢迎和最重要的编程语言,它有一套丰富的库和工具,可以让数据科学家轻松完成任务,并且它有一个巨大的社区基础,开发人员和数据科学家可以在这里提出他们的问题并回答其他人的问题。
所以这个 subreddit 的初学者可以浏览各种线程,了解 Python 的来龙去脉。另一方面,一个更有经验的程序员可以通过另一个叫做 r/Python 的子编辑器来更深入地研究这种语言。
*[## r/learnpython
r/learnpython: Subreddit,用于发布问题和询问关于 python 代码的一般建议。
www.reddit.com](https://www.reddit.com/r/learnpython/)*
r/rstats
用户数量:37066 人
R 是一个重要的工具,被数据挖掘者和统计学家广泛用于数据分析,它是一种编程语言,为您提供了一个分析、处理、转换和可视化信息的密集环境,因此您应该加入 R 故事、问题和新闻的子编辑…
r/rstat:
www.reddit.com](https://www.reddit.com/r/rstats/)*
如果你喜欢这篇文章,并且你也是 Reddit 的粉丝,请在下面的评论中告诉我们你对你最喜欢的 subreddits 的建议,并与你的朋友分享。
*还有,一定要在 Twitter ,insta gram**,*在Linkedin或者 直接发邮件给我 获取更多有趣的话题。
感谢阅读。
关于 dstack.ai 要知道的七件事
dstack.ai:协作!!创造!!交流!!
你有没有想过数据科学家到底是如何合作的?最好的协作平台应该是什么?
介绍
大多数数据分析师和他们的团队没有有效的协作实践。事实上,数据科学家之间的大多数现有协作流程都是有机发展的,并没有遵循系统化的方法。如果我们遵循某些专门为此目的而设计的实践或工具,我们可以做得更好,并提高生产率。
今年年初,当我的团队开始抱怨协作效率不高时,我意识到是时候寻找一个设计良好的平台来解决这个问题了。令我高兴的是,我发现了
涉及开发的数据科学家协作工具在市场上非常活跃,尤其是在团队环境中,如竞争团体和创业公司。另一方面 dstack.ai 并不要求我们具备开发、CSS、部署技能。使用 dstack.ai,我们可以在几分钟内构建一个仪表板,而不是需要几天时间并需要维护的 Dash 或 Shiny 。
另一个要点是,协作工具大多是特定的,没有一个工具能为企业环境提供完整的解决方案,因为它们有非常特定的用例,例如, Dash 只支持 Python 编程语言,而 Shiny 只支持 R 编程语言。那么,如果个人和初创企业使用多种语言工作,他们会选择什么呢?首选来自 dstack.ai
dstack . ai是其中一个人性化、快速、免费的数据科学协作平台。在我们深入探讨 的细节之前,dstack.ai 让我们快速对比一下下面这三款工具。
Dash Vs 闪亮 Vs dstack.ai
看一下上面的表格,人们可以很容易地说,dstack.ai 将在这个领域占据有利位置。
现在让我们来讨论选择dstack . ai作为我们数据团队首要工具的十大理由。
- 轻松协作
与任何人、任何地方协作是dstack.ai 背后的基本思想。协作至关重要且富有成效,因为它使数据科学家能够解决比单个问题更大的问题。它还通过促进共享上下文来减少依赖性。
dstack.ai 是一个高效的协作工具,有助于数据分析师和分布式团队在数据探索和结果交付期间有效工作。
通过创建一个堆栈,协作可以变得非常容易和有用。栈只不过是一个你想与他人分享的可视化输出。我为我的团队创建了一个受试者工作特征曲线下面积(ROC-AUC)堆栈,如下图所示,并与大家分享。就是这么简单!!
我使用 dstack.ai 的第一个堆栈
2。更少的时间
有没有人不想更快地完成自己的工作?如果我们的团队使用的是 dstack.ai ,我们可以在将近 30%的时间内完成可视化报告的构建并获得利益相关者的反馈。这大大节省了工时。
正如dstack.ai不需要开发、CSS 和部署的技术技能,有了 d stack . ai 我们可以在几分钟内构建一个仪表板。即使一个非技术人员也能轻松做到。****
这是可能的,因为有了 dstack.ai 我们的数据科学团队可以在更短的时间内发送他们的数据结果并交换反馈,因为系统已经设置好了,您只需将它用于您的数据。
3。省力
我再次想知道是否有人愿意为同样的产出付出更多的努力?换句话说,给定一个结果,我们总是想要优化,并最小化所需的努力,以获得一个有效的系统。
有了 dstack.ai ,我们的数据科学团队可以提高他们的数据结果,并以更少的工作量与利益相关方交换反馈。例如,如果您必须使用 markdown 和 latex 创建一份报告,它可以在几分钟内完成。示例在下面的截图中。
4。交互式仪表盘
仪表板是构建迷人的交互式报告的一种行之有效的方法。为了构建一个仪表板,我们只需要使用 Python 或 R 应用程序编程接口来推送我们的数据可视化报告。
一旦有了可视化效果,只需点击几下就可以将它们组合到一个仪表板中,这是一项非常简单的任务!!
使用 dstack.ai 的交互式仪表板
你可以点击查看这个仪表盘的实况。
5。数据集管理
数据科学项目的关键要素之一是数据集的高效协作。dstack.ai 提供了简单的接口和服务来上传和管理数据集。我们还可以管理数据集的修订,并在工作团队中共享这些数据集。
如前所述,将数据集和可视化上传到 dstack.ai 对于 Python 和 R 都是可用的。这些数据集可以在 Jupyter 笔记本和应用程序中的 Python 和 R 脚本中使用。
我们可以向 dstack.ai 推送(上传)和从 dstack . ai 拉取(下载)数据集。
将数据集推送到 dstack.ai
从 dstack.ai 中提取数据集
使用 dstack.ai 创建帐户后,我们可以使用在设置中找到的安全令牌发布数据。
6。共享数据报告
****使用dstack . ai时,共享数据报告非常简单且用户友好。在 dstack.ai 上发布的所有报告和数据集都遵循为注册个人资料指定的隐私设置。
默认情况下,提交给dstack . ai的数据或可视化是公共的。但是,我们也可以通过更改单个数据集和可视化的隐私设置来使它们成为私有的。如果需要,我们也可以只与选定的用户共享它们。我们还可以通过电子邮件邀请合作者加入我们的可视化、数据集或仪表板。
dstack . ai用户界面支持 bot 手机和电脑浏览器。数据报告可通过手机友好型网络应用程序访问。
如果需要,我们甚至可以与非技术用户共享发布的链接,以便他或她可以使用 web 浏览器查看和访问 dstack.ai 托管的前端应用程序上的发布堆栈。
7。Python 和 R
dstack.ai 值得称赞的一个方面是它同时支持 Python 和 R。如果你将它与其他工具如 Shiny 和 Dash 进行比较,你会发现 Shiny 是一个 R 包,用于使用 R 构建交互式 web 应用程序,另一方面 Dash 是一个用于创建 web 应用程序的开源 Python 库。
出色的数据科学面试技巧
我已经参加了几年的面试,你将在这里看到的是我在聪明和有才华的人身上看到的最大错误。这些都是应聘者错过的事情,因为他们忘记了思考面试官在寻找什么。
基本要素——几乎在每一次面试中,候选人都需要在这三个方面获得足够的分数:善于合作,显示出他们了解技术知识,并有动力解决所提出的问题。以下是我实现这一目标的实用技巧:
- **提前思考,提前准备好要谈论的话题。**这可能是学校里的一个项目,可能是你独自完成的,也可能是你以前工作单位的一个项目。你不需要很多,如果你对细节很熟悉,一两个就够了。了解所有技术术语——您使用了什么损失函数、其他指标、超参数优化等。这样做的理由是,你会想在面试时间尽可能多地谈论你熟悉的东西。多次练习面试的这一部分意味着它会变得更容易,因为我们认为这是面试的开始,也有助于缓和面试中的兴奋或紧张情绪。
- 清晰地展示你的作品。人们认为,如果他们用花哨模糊的概念或时髦的词语来描述自己的工作,他们会被视为聪明(或许还很神秘?).在现实中,无法清楚地提出你试图解决的问题,以及解决方案背后的基本想法意味着这个候选人将很难与 DS 部门内外的同事沟通。记住——你也将被测试解释和分享你的想法的能力。如果你来自一个“利基”领域(比如说,一个你的面试官一无所知的生物学博士),这可能会特别困难。
从简单描述任务的输入数据和输出开始,让面试官知道并理解全部细节。你甚至可以有条不紊地停下来,问他们是否有问题。我再怎么强调这一点也不为过——这对你在面试中取得成功至关重要。仅在此之后,继续讨论解决方案和设计考虑事项。在我最好的面试中,我们谈论选择某个模型的原因,出现的问题,测试解决方案的方式等等。这区分了真正理解材料并知道他们在谈论什么的候选人和仅仅下载并运行软件包的候选人。确保你已经准备好回答这样的“设计”问题。 - 提及你使用过的具体技术,尤其是在工作描述中。不要仅仅因为你已经在简历中写了一些东西,就相信面试官会记得。如果你的经验是在 X,而公司与 X 合作,那么培训时间会立即缩短。这些都是简单的要点,你不想错过。
- 对公司表现出真正的兴趣。对雇主来说,最糟糕的情况是不要错过潜在的优秀候选人。最糟糕的情况是招聘人员,投入大量资源进行入职和培训,结果却让他在中短时间内离开。因此,除了寻找有潜力的聪明人,面试官还在寻找一个更重要的信号,那就是与公司和项目的联系。一个候选人表现出真正的动机和兴趣,以真正的奉献精神来解决问题,这比一个有更多经验但没有明显激情的候选人更好。
- 查看该公司的工程/DS 材料。没错,这些并不总是可用的,但如今许多公司都有工程博客,参加会议,录制会议演讲,并使这些材料易于在线获取。你为什么要花时间这样做呢?在某些情况下,如果面试包括一个技术问题,它将围绕公司已经在做的东西,阅读/观看材料就像是瞥见了正确的答案。即使这没有发生,分享你看过的材料也会让你在面试官面前赢得一些轻松的分数(见第四点)。最重要的是,它会让你了解你是否愿意和这个团队一起工作,以及你是否参与这个项目。
- 如果你缺乏经验**,想想能给你加分的事情**。像 Kaggle 比赛,你对阅读报纸的热爱,你订阅的有趣网站/邮件列表,或者公开回购的承诺等事情通常会在面试的流动和兴奋中被错过或忘记,但它们也非常重要。为了避免面试后忘记谈论什么的糟糕感觉,确保你记得(或写下)你的额外课程是什么,然后用“你还有其他问题吗?”做个记号来提醒自己,在面试结束前,你还有一些事情要谈。
就是这样。像所有其他类型的面试一样(不仅仅是 DS 面试),记住要友好——人们不仅仅是在寻找一个交付代码的人,他们还想找一个愿意与之共度相当长时间的人。
如果你还有其他建议,欢迎在下面添加!
祝你好运!
2020 年图形机器学习的主要趋势
2020 年刚刚开始,但我们已经可以在最新的研究论文中看到图机器学习(GML)的趋势。以下是我对 2020 年 GML 将面临的重要问题的看法,以及对这些论文的讨论。
介绍
本文的目标不是介绍 GML 的基本概念,如图形神经网络(GNNs),而是展示我们在顶级科学会议上可以看到的前沿研究。首先,我把作品提交给了 ICLR 2020,这是 GML 最负盛名的提交作品的会议之一。在之前的帖子中,我已经描述了这个领域的一些快速统计数据,但这里有一个简短的版本:
在 GML 有 150 篇投稿,三分之一的论文被接受。这相当于所有被接受论文的大约 10%。
我阅读了大部分 GML 的论文,以下是我列出的 2020 年趋势:
- 对 GNN 的理论理解更加扎实;
- GNN 新酷应用;
- 知识图谱变得更受欢迎;
- 图嵌入的新框架。
让我们来看看这些趋势。
1.对 GNN 的理论理解更加扎实
我特别兴奋地看到这一趋势,因为它表明 GML 地区正在成熟,以前的启发式方法正在被新的理论解决方案所取代。关于图形神经网络还有很多需要理解的地方,但是关于 GNNs 如何工作已经有了相当多的重要结果。
我先说我最喜欢的: 神经网络学不到的图形:深度 vs 宽度 作者 Andreas Loukas。本文在技术简单性、高度的实际影响和深远的理论见解之间取得了惊人的平衡。
它表明,节点嵌入的维数(网络的宽度,
w
)乘以层数(网络的深度,d
)应该与图的大小n
,即dw = O(n)
成比例,如果我们希望 GNN 能够计算出流行的图问题(如循环检测、直径估计、顶点覆盖等)的解决方案。).
因此,GNN 的许多当前实现无法实现这一条件,因为层的数量(在许多实现中约为 2–5)和嵌入的维度(约为 100–1000)与图的大小相比不够大。另一方面,在当前的环境下,更大的网络太令人望而却步,这提出了一个问题,即我们应该如何设计高效的 GNNs 这是我们需要在未来解决的问题。很有说服力的是,这篇论文也从 80 年代的分布式计算模型中得到启发,表明 gnn 本质上做同样的事情。里面有更多的结果,所以我建议看一看。
同样,另外两篇论文,乌诺&铃木和巴塞洛等人,研究了 GNNs 的力量。第一个, 图神经网络指数级地失去对节点分类的表达能力 ,表明:
在某些权重条件下,当层数增加时,除了节点度数和连通分量(由拉普拉斯谱确定)之外,GCNs 不能学习任何东西。
这个结果是众所周知的性质的推广,即 Markov 过程收敛到唯一的平衡点,其中收敛速度由转移矩阵的特征值决定。
在第二篇论文 图神经网络的逻辑表达能力 中,作者展示了 GNNs 和它们可以捕获的节点分类器类型之间的联系。我们已经知道,一些 GNNs 和同构的 WL 测试一样强大,即两个节点被 WL 着色为相同当且仅当它们被 GNNs 分类为相同。但是 GNN 能捕捉到其他分类功能吗?例如,想象一个布尔函数,当且仅当一个图有一个孤立的顶点时,它将 true 赋给所有的节点。GNNs 能抓住这个逻辑吗?直觉上不会,因为 GNN 是一种消息传递机制,如果图的一部分和另一部分(两个相连的组件)之间没有链接,则两者之间不会传递消息。因此,一个简单的解决方案是在邻域聚合后添加一个读出操作,这样当每个节点更新所有要素时,它就拥有了图中所有其他节点的信息。
其他理论方面的工作包括侯等人对的图信息使用的测量以及 Srinivasan & Ribeiro 的基于角色和基于距离的节点嵌入的等价性。
2.GNN 的新酷应用
看到 GNNs 如何应用于现实世界的任务也很棒。今年有一些应用程序可以修复 Javascript 中的错误、玩游戏、回答类似智商的测试、优化 TensorFlow 计算图、分子生成和对话系统中的问题生成。
在 HOPPITY:学习图变换来检测和修复程序中的 bug*Dinella 等人提出了 一种在 Javascript 代码中同时检测和修复 bug 的方法。代码被转换成抽象语法树,然后通过 GNN 预处理以获得代码嵌入。其思想是给定一个处于初始状态的图,通过多轮图编辑操作符(添加或删除节点,替换节点值或类型)来修改它。为了理解图中的哪些节点应该被修改,他们采用了指针网络,该指针网络采用图嵌入和迄今为止的编辑历史,并选择节点。然后,使用 LSTM 网络执行修复,该网络也采用图形嵌入和编辑的上下文。作者在 GitHub 的提交上验证了这种方法,显示了对其他不太通用的基线的显著提升。精神上类似魏等人的工作 LambdaNet:使用图神经网络的概率类型推断 研究**如何为 Python 或 TypeScript 等语言推断变量的类型。*作者提出了一种类型依赖超图,它包含作为节点的程序变量以及它们之间的关系,例如逻辑(例如布尔类型)或上下文(例如相似的变量名)约束。然后,首先训练 GNN 模型,以产生图的变量和可能类型的嵌入,然后使用这些嵌入来预测具有最高可能性的类型。在实验中,LambdaNet 在标准变量类型(例如 boolean)和用户定义的类型上都有较高的性能。
*王等人 的一篇论文用多重图网络 进行抽象图推理,展示了如何在类智商测验 **(瑞文递进矩阵(RPM)和图三段论(DS))中用 GNNs 进行推理。*在 RPM 任务中,为矩阵的每一行组成一个图,对于该图,通过前馈模型获得边缘嵌入,随后是图摘要。由于最后一行有 8 个可能的答案,因此创建了 8 个不同的图表,每个图表都与前两行连接在一起,以获得 ResNet 模型对 IQ 分数的预测。
*DeepMind 的一篇论文 增强遗传算法学习优化计算图 提出**一种 RL 算法优化张量流计算图的代价。*图通过标准的消息传递 GNN 进行处理,产生与图中每个节点的调度优先级相对应的离散嵌入。这些嵌入被送入遗传算法 BRKGA,该算法决定每个节点的设备放置和调度。该模型被训练以优化所获得的张量流图的实际计算成本。
**“用于优化计算图的增强型遗传算法学习”作者 Paliwal 等人
其他有趣的应用包括史等人的分子生成、江等人的游戏、陈等人的对话系统
3.知识图表变得更加流行
今年有不少关于知识图推理的论文。本质上,知识图是一种表示事实的结构化方式。与一般的图不同,在知识图中,节点和边实际上有一些含义,如演员的名字或电影中的表演(见下图)。知识图上的一个常见问题是回答复杂的查询,如“2000 年前史蒂文·斯皮尔伯格的哪些电影获得了奥斯卡奖?”,可以翻译成一个逻辑查询∨ { Win(Oscar, V)
∧ Directed(Spielberg, V)
∧ ProducedBefore(2000, V)
}。
知识图示例。(来源:尼克尔等人)
*在论文 Query2box:使用盒子嵌入对向量空间中的知识图进行推理 中,任等人**提出将查询嵌入到潜在空间中,而不是作为单个点,而是作为矩形盒子。*该方法允许执行自然交集操作,即合取∧,因为它产生新的矩形框。然而,对并集(即析取∨)建模并不那么简单,因为它可能会导致非重叠区域。此外,为了精确地对任何具有嵌入的查询建模,由 VC 维测量的嵌入之间的距离函数的复杂度应该与图中实体的数量成比例。相反,有一个很好的技巧可以将析取查询替换为 DNF 形式,其中联合只发生在计算图的末尾,这有效地简化了每个子查询的简单距离计算。
任等 【查询 2 框:利用框嵌入对向量空间中的知识图进行推理】
在类似的主题中,Wang 等人在标题为 “知识图中数值规则的可微分学习” 的论文中提出了一种处理数值实体和规则的方法。例如,对于一个引用知识图,您可以有一个规则influences(Y,X)
← colleagueOf(Z,Y)
∧ supervisorOf(Z,X)
∧ hasCitation>(Y,Z)
,该规则指出,通常情况下,学生X
受到他们的主管Z
的同事Y
的影响,该同事引用的次数更多。该规则右侧的每个关系可以表示为矩阵,并且寻找缺失链接的过程可以表述为关系与实体向量的连续矩阵乘法,该过程称为规则学习。由于矩阵的构造方式,神经方法只能使用分类规则,如colleagueOf(Z,Y)
。作者的贡献是以一种新的方式有效地使用数字规则,如hasCitation>(Y,Z)
和求反运算符,通过表明在现实中没有必要显式地物化这样的矩阵,这大大减少了运行时间。
另一个在机器学习领域更频繁出现的主题是对现有模型的重新评估,以及它们在公平环境中的表现。像这样的论文 可以教老狗新把戏!Ruffinelli 等人的关于训练知识图嵌入 的研究表明,新模型的性能通常取决于实验训练的“次要”细节,例如损失函数、正则化子和采样方案的形式。在一项大型消融研究中,作者观察到,旧方法(如重新标度模型)仅通过适当调整超参数就可以实现 SOTA 性能。****
在这个领域还有许多其他有趣的作品。 Allen 等人基于单词嵌入的最新见解,了解更多关于关系和实体的学习表征的潜在空间。 Asai et al. 展示了一个模型如何在回答给定查询的维基百科图上检索推理路径。塔巴科夫&科斯塔贝罗触及了图嵌入模型的概率校准这个重要话题。他们表明,通过用 sigmoid 函数变换逻辑来获得概率的流行嵌入模型 TransE 和 ComplEx 校准得很差,即要么低估要么高估事实的存在。他们的方法依赖于生成被破坏的三元组作为负数,这些负数被已知的方法使用,例如 Platt 标度和保序回归来校准概率。
4.图嵌入的新框架
图形嵌入是图形机器学习的一个长期话题,今年有了关于我们应该如何学习图形表示的新观点。
Deng 等人在工作 GraphZoom:一种用于精确和可扩展图嵌入的多级谱方法 中提出了一种在节点分类问题中改进任何无监督嵌入方法的运行时间和准确性的方法。总体思想是首先将原始图缩减为更小的图,这样可以快速计算节点嵌入,然后恢复原始图的嵌入。开始时,基于属性相似性,用对应于节点的 k 个最近邻居之间的链接的附加边来扩充原始图。然后,对图进行粗化:通过局部谱方法将每个节点投影到一个低维空间,并聚集成簇。任何无监督的图嵌入方法,如 DeepWalk 或 Deep Graph Infomax,都可以用来获得小图上的节点嵌入。在最后一步中,所获得的节点嵌入(其本质上代表聚类的嵌入)用平滑算子迭代地广播回来,以防止不同的节点具有相同的嵌入。在实验中,GraphZoom 框架比 node2vec 和 DeepWalk 方法实现了惊人的 40 倍加速,准确率提高了 10%。
“GraphZoom:一种用于精确和可扩展图形嵌入的多级谱方法”,作者邓等人
**一些论文已经仔细研究了图分类问题的先前结果。Errica 等人对用于图形分类的图形神经网络 的公平比较有助于对关于该问题的 GNN 模型的公平重新评估,**表明,不利用图形拓扑的简单基线(即,它在聚集节点特征上工作)的性能与 SOTA GNNs 相当。**这一令人惊讶的现象显然在 2015 年由奥尔洛娃等人发表过,但并未获得大量读者。这项工作的一个很好的结果是在流行的数据集上的公平的 SOTA 结果和 PyTorch-Geometric 中的方便的代码库来运行未来论文的模型比较。在我们的工作 理解图数据集中的同构偏差 ,中,我们还发现,在常用的数据集如 MUTAG 或 IMDB 中,许多图具有同构副本,即使考虑节点属性。此外,在这些同构图中,许多具有不同的目标标签,这自然为分类器引入了标签噪声。 这表明使用网络的所有可用元信息(例如节点或边属性)对于模型的更好性能的重要性。另一部作品 强大的图形神经网络有必要吗?陈等人对图分类 的剖析表明,如果用其线性对应物(包括邻居的度和传播的图属性)替换非线性邻域聚合函数,则模型的性能不会降低,这与先前的陈述一致,即许多图数据集对于分类来说是微不足道的,并且提出了对于该任务的适当验证框架的问题。
结论
随着顶级会议的提交率不断增长,我们可以预计 2020 年 GML 领域将出现许多有趣的结果。我们已经可以看到这个领域的转变,从深度学习在图上的启发式应用到更合理的方法和关于图模型范围的基本问题。GNNs 找到了自己的位置,成为许多可以用图来表达的实际问题的有效解决方案,但我希望总体而言,GML 只是触及了我们在图论和机器学习的交叉点上所能实现的表面,我们应该继续关注即将到来的结果。
P.S .我会继续写关于图机器学习的内容,所以如果你有兴趣,可以在 medium 上关注我或者订阅我的 电报频道 或者 我的 twitter 。
美国顶尖计算机科学学院
基于个人和轶事经验的思考
在这篇文章中,你会发现如果你想获得计算机科学学位,什么学校是最好的选择。
这篇文章的视频版本,如果你更喜欢看而不是读:)
现在,我是一个奇怪的例子,因为在我的一生中,我赢得了在世界上一些最好的大学直接学习或工作的机会。在我的一生中,我跳过了许多学校,包括麻省理工学院、牛津大学、哥伦比亚大学、帝国理工学院、加州理工学院、斯坦福大学和伯克利大学。
因此,根据我的经验,我决定在 2020 年创建一个计算机科学的顶级学校,这样,那些希望获得计算机科学学位的人就可以知道哪些学校值得关注。
我想承认,这是基于我的个人观点,我相信 T2 还有许多其他优秀的计算机科学学校,我不会在这篇文章中提及,因为我没有直接的经验。在下面所有的例子中,我或者学习过,或者工作过,或者和参加过或者帮助教授过提到的课程和项目的人是好朋友。
常春藤联盟
所以我们从常春藤联盟开始吧。常春藤联盟由 8 所学校组成:布朗大学、哥伦比亚大学、康奈尔大学、达特茅斯大学、哈佛大学、普林斯顿大学、宾夕法尼亚大学和耶鲁大学。
常春藤盟校校花,感谢火炬
一般来说,这些学校拥有“最好”的声誉,你通常会发现它们在《美国新闻》、《福布斯》和《商业内幕》上占据了前 10 名“最好的大学”。
根据我朋友的观点,所有这些学校都有很好的计算机科学学位。其中,我认为最好的是哈佛和哥伦比亚之间的决胜局。就时间安排的灵活性而言,布朗大学是最宽松的,而宾夕法尼亚大学和康奈尔大学可以说是“联盟”中规模最大的大学。耶鲁和普林斯顿都有小得多的、紧密团结的社区,与“更大、更大的城市”有些隔离
哥伦比亚大学
哥伦比亚坐落在纽约市的中心,有着曼哈顿的脉搏,有着大城市生活的起伏。
哥伦比亚大学,晨边校区。从东北方向鸟瞰
我只在其中两所大学——哥伦比亚大学和哈佛大学——上过课或学过。这两所学校都有高度结构化的计算机科学项目,我曾与这两所大学的一些极其聪明、敏锐、勤奋的本科生、研究生和教师一起工作过。
随着时间的推移,我观察到,哥伦比亚大学和哈佛大学的特定 CS 课程拥有如此强大的追随者,以至于它们创建了拥有自己内部规范和文化的完整社区。
哈佛的顶级课程是 CS50,由魅力非凡的大卫·马兰教授。据我所知,CS50 让学生们体验了 C、Python、带有 CSS 和 HTML 的 Javascript 以及 SQL。就定制你在哈佛的 CS 教育而言,它非常灵活,可以选择探索独特的“思维和行为轨迹”,以及探索联合浓度。
瑞茜·威瑟斯彭身着《律政俏佳人》,承蒙吉菲
在哥伦比亚大学,计算机科学课程与其他院系紧密结合。大约有 7 个不同的专业,从“智能系统”到“机器人”我注意到,哥伦比亚大学的一门突出的课程给了本科生一个很好的优势,那就是他们可以接触到 C 和 C++。“J”教授曾经教过这门课,作为一项强制性要求,我记得我的许多本科朋友和学生告诉我这门课很残酷。然而,几年后,在工作中,他们对 C、C++和 UNIX shell 脚本的接触使他们受益匪浅。
所以,如果你正在寻找一个计算机科学学位,考虑一下,虽然所有的常春藤联盟学校都可以给你一个坚实可靠的计算机科学教育;首选是哈佛和哥伦比亚。
现在让我们来谈谈在美国提供世界级计算机科学教育的非常春藤联盟的学校。
斯坦福
斯坦福大学,承蒙帕洛阿尔托每日邮报
斯坦福坐落在硅谷的中心,提供了充足的行业学术机会。他们在理论、人机交互、人工智能方面做了很多创新性的研究。他们目前有 17 位诺贝尔奖获得者在校园里教学。我曾经在黄工程与科学中心(以英伟达 CEO 的名字命名)的地下室工作过,我会告诉你——斯坦福大学的拼搏精神很强。
我见过学生在地下室工作到深夜,大约 8-15 名学生挤在巨大的桌子周围,助教不知疲倦地回答他们的所有问题。当我想象 CS 的协作精神时,我总是想象旁观者斯坦福学生所展示的团队精神。从和我一起去麻省理工学院并继续在斯坦福大学攻读硕士学位的朋友那里,一个突出的关键因素是观察到的幸福水平。
有些人可能会将此归因于这样一个事实,即大多数斯坦福计算机科学课程(这肯定不是全部,还有一些很难的课程),大约有 30-50%的学生可以得到 a。这对于我的一个朋友来说是一个巨大的冲击,他也和我一起去了麻省理工学院,因为曲线肯定不是 T2 那么宽。并不是说分数是成为一名优秀工程师的超级准确的指标(他们真的不是),但不必为拥有优秀的 GPA 而紧张的压力一定是一种解脱,是其他不那么宽容的机构欢迎的替代选择。
伯克利
现在我们来讨论一下伯克利。相对于提到的其他学校,伯克利是顶尖的公立学校之一,也是一个更实惠的选择。如果你来自加州,并且预算有限,那么伯克利是一个很好的选择。
伯克利校园,由 brainchildvn 拍摄,在 Flickr 上发布
我个人在伯克利从事区块链工作,有几个朋友在那里学习计算机科学和机器人技术。众所周知,课堂上的空间竞争非常激烈,但这是大多数公立大学的领域。
我记得带着 Denero 的 CS 61A 改变了我朋友群中几个人的生活,为那些在 18 岁之前或开始上大学之前从未编程或编写软件的人打下了坚实的基础。同样,CS 61B,数据结构将是为软件工程面试的技术部分做准备的最重要的课程之一。所以如果你不怕大班,你有竞争力,你又缺钱,那么伯克利是一个极好的选择。
加州理工学院
许多人会认为加州理工学院是西海岸最难的学校之一。这是美国最小的大学之一,每班大约有 200 名学生。他们通常也被视为我们在麻省理工学院的竞争对手。他们的核心课程很激进——所有学生都被要求学习量子力学。
自主系统中心是加州理工学院发起的一项新举措,一些令人难以置信的教师致力于开发机器人探险家、守护者、变形金刚和运输工具。声音科幻?你打赌!我非常自信地说,由于加州理工学院的惊人工作,我们今天对科幻小说的看法将成为明天的科学现实。如果你想有一个挑战,有机会与教师进行充分的一对一指导和交流,并希望距离 La-La Land 半小时的路程,那么就去加州理工学院吧。
卡耐基梅隆大学
最后一所是卡内基梅隆大学。现在,这所学校特别引人入胜,因为它在计算机科学和戏剧方面都名列前茅。这所学校的学生很投入,充满激情,他们对挑战并不陌生。我在这里的一些同事和朋友已经成为不可思议的技术领袖、导演和知识产权律师,他们碰巧在这个过程中制造了一两个英特尔奔腾芯片。在这一类别的学校中,CMU 的录取率最高,2019 年约为 17%。
现在,从我自己被学院本身所影响的角度来看,我认为对计算机科学来说最好的大学是…
麻省理工学院
1056 位教授。90 位诺贝尔奖获得者。59 位国家科学奖章获得者。75 名麦克阿瑟研究员。上午 15 图灵奖获得者。
麻省理工学院的猎豹,由 IEEE 提供
麻省理工学院是美国最难进的学校之一。麻省理工学院的大多数学生学习到深夜,我们遵循努力工作,尽情玩乐的哲学。
麻省理工学院的计算机科学课程,我们称之为“课程 6 ”,过去是,现在可能仍然是,最受欢迎和最常见的三大专业之一。因为你正在和世界上其他一些最聪明的人一起学习,这种经历会让你很快变得谦卑。
人们带着各种各样的经验参加课程 6。当我旁听一些课程时,我的左边会有一位国际化学奥林匹克冠军,还有一位在开始大一/大一之前已经在亚马逊实习过的软件工程师。
麻省理工学院改变生活和范式的最“有价值”的课程是 6.006——算法导论。从我的经验来看,麻省理工学院的课程比其他大学更偏重理论。我认为这是因为该部门强调,如果我们能学会如何学习,如果我们理解了基本原则,我们就能真正解决任何问题,或构建任何应用程序。
在这门课中,你通常必须理解算法背后的基本理论或证明,并且能够用 Python 实现它。麻省理工学院也有在群体中设置 p 的文化。团队合作是必不可少的,深夜,发光二极管的屏幕,以及注意力、压力和心流水平的波动都等同于这种体验。如果你有关于麻省理工学院的其他问题,我很乐意与你分享更多。
众所周知的消防水管,位于麻省理工学院斯塔塔中心(麻省理工学院斯隆)32 号楼
好吧,你可能认为麻省理工学院是最好的学校之一,事实也的确如此。然而,我也想说…在你来这里之前要三思。虽然你将是最聪明的人之一,并从最鼓舞人心和最敏锐的教授那里学习,但我们这里没有分数膨胀。
你会喝消防水管里的水。你还必须为最大的挑战做好准备(技术上和精神上)。自我将被粉碎,你对自己知道和不知道的东西的理解将被戏剧性地改写。这没关系。正是通过不断的自我创造和自我毁灭,人类获得了内在的力量。
另外,我想强调的是,在美国之外还有很多很棒的学校。例如,我也曾在滑铁卢大学、牛津大学和伦敦帝国理工学院学习和工作。那里的学生和他们的美国同学一样有动力,有动力,也一样聪明。
我没有在这里包括对他们的评估,只是因为课程、项目结构和时间表与我们在地球的这一边有很大的不同。这些录取系统与我们在美国的完全不同,但是对于愿意在国外生活的学生来说,有很多很好的选择。我很高兴向你们每个人解释其中的区别,如果你想了解更多美国以外的国际选择,请随时联系我!
TOP2VEC:主题建模的新方式
几年前,从成千上万没有标注的自由文本文档中提取主题/话题/概念是非常困难的。最好和简单的方法是让一些人坐下来,浏览每篇文章,理解和注释主题。事实上,这很费时间,而且容易受到我们人类主观感知的影响。
尽管在过去已经进行了许多尝试,使用像 pLSA 这样的简单算法来处理这种无监督学习问题并提取主题,但是 LDA 彻底改变了该领域,它通过在主题-单词和文档-主题分布之前添加 Dirichlet 来实现这一奇迹。多年来,LDA 曾经是主题建模问题最受欢迎的算法。然而,这些模型的目标是找到可以用来以最小的误差重新创建原始文档的主题。
这两种算法都落后的几个领域:
- 假设主题的数量是已知的,理想情况下是未知的,并且成为模型的超参数,以获得更好的连贯性和迷惑性
- 删除停用词是必要的,否则主题词分布将会受到停用词的高度污染
- 致力于文档的 BOW(单词包)表示,忽略语义。像词汇化、词干化这样的预处理步骤可能有助于但无助于理解边和边的意思相同
那么,Top2Vec 是如何工作的呢??让我们一层一层地解码,并尝试在高层次上构建它的框架
在幕后,Top2Vec 利用 Doc2vec 首先生成一个语义空间(语义空间是一个空间空间,其中向量之间的距离是语义相似性的指标)。
如果你关注 NLP 研究,那么你一定读过 doc2vec 算法,它是对 word2vec 的高级修改,用于创建文档/句子/段落嵌入。与 word2vec 不同,doc2vec 还在训练阶段将段落向量(可以将其视为正在学习的另一个单词向量)与单词向量结合在一起。和 word2vec 一样,do2vec 也有两种训练方式:
- 具有分布式存储器(DM)段落向量:给定段落向量和上下文向量,预测目标单词
- 分布式单词包(DBOW):给定段落向量,预测上下文单词
由于更好的性能和模型的简单性,Top2Vec 使用了 Doc2Vec 的 DBOW 版本。
这个由单词和文档向量组成的语义空间是主题的连续表示,不像 LDA,主题是从离散空间中采样的。现在以这个共同嵌入的单词和文档语义空间为例,文档高度集中的密集区域可以被认为具有相似的主题,并且可以由附近的嵌入单词来最好地表示。
图一。(来源于[1])]具有文档(紫色气泡)和单词(绿色气泡)的联合嵌入的语义空间的图示
为了找到文档向量的密集区域来识别主题向量,首先想到的选择是利用一些基于密度的聚类算法(HDBSCAN 似乎是理想的)。但是直接使用这些算法的问题是,我们处理的不是二维空间,而是它的多维稀疏空间和维数灾难。所以要克服这个问题,可以先进行降维,然后用 HDBSCAN 进行聚类。为了降低文档向量的维数,使用了一致流形逼近和投影降维(UMAP ),因为它在保持局部和全局结构方面是很好的。
图二。(来源于[1])识别文档密集区域
因此,UMAP 和 HDBSCAN 帮助我们识别文档密集的聚类,主题向量可以简单地计算为这些聚类的质心。
图三。(来源于[1])密集文档聚类的质心是主题向量
因为我们已经在单个语义空间中联合训练了文档和词向量。因此,一旦我们确定了主题向量,就很容易找到附近最能代表该主题的词向量,因此我们可以获得每个主题的词分布。这样,我们就可以为 body 中的每个文档生成主题
由于 Top2Vec 给了我们一个语义空间中主题的连续表示,这也允许我们将主题的数量减少到任何期望的数量。这是通过取最小主题的主题向量和它的最近主题向量的加权算术平均值来完成的,每个主题向量都根据它们的主题大小来加权。每次合并后,都会重新计算每个主题的主题大小(即主题所属文档的数量)
在使用 Top2Vec 之前我们需要去掉停用词吗?
不,因为这样的停用词将出现在几乎所有的文档中,因此它们将与所有主题等距,而不会作为离任何主题最近的词出现。
这篇论文的作者也为这个模型提供了开源的 API(【https://github.com/ddangelov/Top2Vec】T2),并且只需要很少的编码工作就可以很好地完成。我不会进入这一部分,让你来做实验
参考资料:
[1]https://arxiv.org/pdf/2008.09470.pdf
[2]https://arxiv.org/pdf/1405.4053.pdf
主题建模文章与 NMF
抽取主题是发现文本之间潜在关系的一种很好的无监督数据挖掘技术。有许多不同的方法,最流行的可能是 LDA,但我将集中讨论 NMF。我在这方面取得了更大的成功,而且它通常比 LDA 更具可扩展性。
本文介绍了如何:
- 为主题建模准备文本
- 从文章中提取主题
- 总结这些主题
- 自动查找用于模型的最佳主题数量
- 在所有主题中找到质量最高的主题
- 预测一篇新文章的主题
和往常一样,所有代码和数据都可以在我的 GitHub 页面的存储库中找到。
数据
我用的是 CNN 的’商业’栏目的全文文章。文章出现在 2020 年 3 月下旬到 2020 年 4 月上旬的那个页面,被刮了。每天早上 8 点运行一次刮刀,刮刀包含在存储库中。“商业”页面上的文章关注几个不同的主题,包括投资、银行、成功、视频游戏、科技、市场等。
让我们做一些快速的探索性数据分析来熟悉数据。共 301 篇,平均字数 732 字,标准差 363 字。这是前五行。
就字数的分布而言,它有点偏正,但总体而言,它是一个非常正常的分布,第 25 百分位为 473 个单词,第 75 百分位为 966 个单词。大约有 4 个异常值(高于第 75 百分位 1.5 倍),最长的文章有 2.5K 个单词。
以下是对文本进行处理后,所有文章中出现频率最高的 20 个词。“公司”、“商业”、“人”、“工作”和“冠状病毒”是前 5 名,考虑到页面的焦点和数据被抓取的时间框架,这是有道理的。
NMF
非负矩阵分解(NMF)是一种无监督的技术,因此没有模型将被训练的主题的标签。它的工作方式是,NMF 将高维向量分解(或因式分解)成一个低维表示。这些低维向量是非负的,这也意味着它们的系数是非负的。
利用原始矩阵(A),NMF 会给你两个矩阵(W 和 H)。w 是它找到的主题,H 是这些主题的系数(权重)。换句话说,A 是按词排序的文章(原创),H 是按主题排序的文章,W 是按词排序的主题。
因此,假设有 301 篇文章、5000 个单词和 30 个主题,我们将得到以下 3 个矩阵:
A = tfidf_vectorizer.transform(texts)
W = nmf.components_
H = nmf.transform(A)A = 301 x 5000
W = 30 x 5000
H = 301 x 30
NMF 将修改 W 和 H 的初始值,使得乘积接近 A,直到逼近误差收敛或者达到最大迭代次数。
在我们的例子中,高维向量将是 tf-idf 权重,但它实际上可以是任何东西,包括单词向量或简单的单词原始计数。
文本处理
这是该过程中最关键的步骤之一。俗话说,“垃圾进来,垃圾出去”。当处理文本作为我们的特征时,尝试减少独特的单词(即特征)的数量是非常关键的,因为会有很多。这是我们对太多特性的第一次防御。
抓取的数据真的很干净(CNN 拥有好的 html,但并不总是如此)。你应该总是手动浏览文本,并确保没有错误的 html 或换行符等。这肯定会出现并伤害模特。
下面是我正在使用的函数:
这是我在文章开始时使用的默认设置(在这种情况下效果很好),但我建议将它修改为您自己的数据集。例如,我在一些数据集中添加了特定的停用词,如“cnn”和“ad ”,所以你应该经常浏览并查找类似的内容。这些是经常出现的词,很可能不会增加模型解释主题的能力。
以下是处理前后的文本示例:
- 在新体制下,“广州变成广州,天津变成天津。”最重要的是,报纸现在将把中国的首都称为北京,而不是北京。对一些美国出版物来说,这一步走得太远了。大约在这个时候,芝加哥论坛报在一篇关于拼音的文章中说,虽然它将对大多数汉字采用拼音,但一些名字已经“根深蒂固”
- 新州变成广州天津变成天津进口报纸西班牙语参考国首都北京北京大步远美国公众文章拼音时代芝加哥论坛报采用中文单词变得根深蒂固
特征创建、选择和更多缩减
既然文本已经被处理了,我们可以用它来创建特征,把它们变成数字。有几种不同的方法可以做到这一点,但总的来说,我发现从文本中创建 tf-idf 权重工作得很好,并且在计算上不是很昂贵(即运行速度快)。
你可以在这里阅读更多关于 tf-idf 的内容。一些其他的文本特征创建技术有单词袋和单词向量,所以你可以随意探索这两种技术。
对于特征选择,我们将“min_df”设置为 3,这将告诉模型忽略出现在少于 3 篇文章中的单词。我们将“max_df”设置为. 85,这将告诉模型忽略出现在超过 85%的文章中的单词。这将帮助我们消除对模型没有积极贡献的单词。
经过处理后,我们有 9K 多一点的唯一单词,因此我们将设置 max_features,以便只包括文章中词频最高的 5K 个单词,以便进一步减少特征。
除了单个单词的 tf-idf 权重,我们还可以为 n-grams (二元模型、三元模型等)创建 tf-idf 权重。).为此,我们将 n_gram 的范围设置为(1,2 ),它将包括一元和二元。
我们还需要使用一个预处理程序来连接标记化的单词,因为默认情况下模型会标记化所有内容。
texts = df['processed_text']tfidf_vectorizer = TfidfVectorizer(
min_df=3,
max_df=0.85,
max_features=5000,
ngram_range=(1, 2),
preprocessor=' '.join
)tfidf = tfidf_vectorizer.fit_transform(texts)
现在我们有了这些特性,我们可以创建一个主题模型。👍
人工主题建模
首先是一个主题模型的例子,我们手动选择主题的数量。之后我将展示如何自动选择最佳数量的主题。艰难的工作已经完成,所以我们需要做的就是运行模型。
nmf = NMF(
n_components=20,
init='nndsvd'
).fit(tfidf)
唯一需要的参数是组件的数量,即我们想要的主题数量。这是整个主题建模过程中最关键的一步,将极大地影响你最终主题的好坏。现在,我们将它设置为 20,稍后我们将使用一致性分数来自动选择最佳数量的主题。
我还用“nndsvd”初始化了模型,它最适合我们这里的稀疏数据。其他一切我们将保留为默认的工作良好。但是,可以随意试验不同的参数。
连贯性得分
为了评估主题的最佳数量,我们可以使用连贯性分数。解释它是如何计算的超出了本文的范围,但一般来说,它测量的是一个主题中单词之间的相对距离。这里的是关于如何在 gensim 中实现它的原文。
有几种不同类型的连贯性评分,其中最受欢迎的是 c_v 和 u_mass 。 c_v 更精确,而 u_mass 更快。我将在这里使用 c_v ,范围从 0 到 1,1 是完全一致的主题。
我喜欢 sklearn 的 NMF 实现,因为它可以使用 tf-idf 权重,我发现这比 gensim 的实现只能使用的原始字数更好(据我所知)。然而,sklearn 的 NMF 实现没有一致性分数,我还没有找到如何使用 c_v 手动计算的示例(有这个使用 TC-W2V )。如果有人知道一个例子,请让我知道!
因此,我们将使用 gensim 获得具有一致性分数的最佳主题数量,然后将该数量的主题用于 NMF 的 sklearn 实现。
自动选择最佳数量的主题
显然,有一种自动选择最佳主题数量的方法是非常关键的,尤其是如果这将进入生产阶段。使用一致性分数,我们可以针对不同数量的主题运行模型,然后使用具有最高一致性分数的主题。这当然不是完美的,但它通常工作得很好。
对于要尝试的主题数量,我选择了 5 到 75 的范围,步长为 5。这只是来自一些试验和错误,文章的数量和文章的平均长度。每个数据集都是不同的,所以你必须手动运行几次来找出你想要搜索的主题号的范围。运行太多的主题会花费很长时间,特别是如果你有很多文章,所以要意识到这一点。
我不打算详细介绍我在这里使用的 NMF 模型的所有参数,但它们确实会影响每个主题的总体得分,所以再次强调,找到适合您数据集的良好参数。你也可以网格搜索不同的参数,但这显然是相当昂贵的计算。
模型运行后,我们可以通过主题直观地检查一致性分数
30 是返回最高一致性分数(. 435)的主题数量,之后它下降得相当快。总的来说,这是一个不错的分数,但我不太关心实际价值。真正的考验是你自己浏览主题,确保它们对文章有意义。
10 topics 在一致性得分(. 432)方面紧随其后,因此您可以看到,它也可以通过一组不同的参数来选择。所以,就像我说的,这不是一个完美的解决方案,因为这是一个相当广泛的范围,但从图表中可以明显看出,10 到 40 个主题将产生良好的结果。也就是说,你可能想要平均前 5 个主题数,取前 5 个中的中间主题数,等等。现在我们只要 30 英镑。
总结主题
另一个挑战是总结主题。这里最好的解决方案是让一个人浏览文本并手动创建主题。这显然不太理想。另一种选择是使用每个主题中得分最高的单词,然后将这些单词映射回特性名称。我用的是前 8 个词。看起来是这样的:
我们可以通过索引将这些主题映射回文章。
比较主题的质量
对于一些主题,发现的潜在因素将很好地接近文本,而对于一些主题,它们可能不是。我们可以计算每篇文章和主题的残差,以判断主题有多好。
残差是数据的观测值和预测值之间的差异。残差为 0 意味着主题与文章的正文非常接近,所以越低越好。
为了计算残差,可以采用 tf-idf 权重(A)的 Frobenius 范数减去主题(H)和主题(W)的系数的点积。然后我们可以得到每个主题的平均残差,看看哪个主题的平均残差最小。
# Get the residuals for each document
r = np.zeros(A.shape[0])for row in range(A.shape[0]):
r[row] = np.linalg.norm(A[row, :] - H[row, :].dot(W), 'fro')# Add the residuals to the df
df_topics['resid'] = r
主题#9 具有最低的残差,因此意味着主题最接近文本,而主题#18 具有最高的残差。
主题#9 的摘要是“insta cart worker shopper custom order gig company”,有 5 篇文章属于该主题。
文章链接:
- 工人称零工公司在冠状病毒爆发期间做得“非常少”
- Instacart 在计划的工人罢工前做出更多改变
- Instacart 购物者计划在疫情罢工
- 这就是为什么亚马逊和 Instacart 的工人在你最需要他们的时候罢工
- 随着食品杂货配送需求激增,Instacart 计划再雇佣 30 万名工人
这是一个非常连贯的话题,所有的文章都是关于 instacart 和 gig workers 的。我们自动创建的摘要也很好地解释了主题本身。
现在我们来看看最糟糕的话题(#18)。总结就是“鸡蛋销售零售价格复活节产品鞋市场”。这个主题总共有 16 篇文章,所以我们只关注残差最高的前 5 篇。
文章链接:
- 鳄鱼向医护人员捐赠鞋子
- 想买金币还是金条?祝你找到任何
- 罗斯对海洋塑料垃圾有了新想法:手袋
- 你真的每个月都需要新衣服吗?订阅盒新鲜感已经消失
- 美国人正在为他们的宠物抢购食物
如你所见,这些文章到处都是。一般来说,它们大多是关于零售产品和购物的(除了关于黄金的文章),crocs 的文章是关于鞋子的,但没有一篇文章与复活节或鸡蛋有关。他们仍然联系在一起,尽管相当松散。
预测新文章的主题
一旦你符合这个模型,你可以给它一篇新文章,让它预测主题。你只需要通过之前安装在原始文章上的 tf-idf 和 NMF 模型来转换新的文本。注意,我在这里只是调用了 transform,而不是 fit 或 fit transform。
# Transform the new data with the fitted models
tfidf_new = tfidf_vectorizer.transform(new_texts)
X_new = nmf.transform(tfidf_new)# Get the top predicted topic
predicted_topics = [np.argsort(each)[::-1][0] for each in X_new]# Add to the df
df_new['pred_topic_num'] = predicted_topics
在我收集了初始集并随机选择了 5 篇文章后,我继续刮文章。所以这些以前从未被模型看到过。总的来说,它在预测主题方面做得很好。
- 美国为这种没有方向盘或踏板的自动驾驶汽车扫清道路 -主题:太阳能计算技术 spacex energi power ibm vehicl
- 如何在这场危机中远程管理一个团队 -主题:工作家庭办公室儿童办公桌人员学校
- 国会将失业援助扩展到临时工。但是他们很难访问它 -主题:优步工人雇佣自治的自由司机
- 斯特尔特:联邦政府对疫情的反应是 9/11 级别的失败 -主题:川普福克斯新闻简报汉尼提·怀特·豪斯总统
- 全球缺货,任天堂暂停任天堂 Switch 对日出货 -主题:游戏 xbox 视频播放图文 nbc olymp doom
自然语言处理中的主题建模
重点是潜在的狄利克雷分配
在自然语言处理中,术语主题是指“组合在一起”的一组单词。这是想到这个话题时想到的词。拿体育来说。一些这样的词是运动员、足球和体育场。
主题模型是自动发现文档集合中出现的主题的模型。然后,可以使用经过训练的模型来辨别这些主题中的哪些出现在新文档中。该模型还可以挑选出文档的哪些部分涵盖了哪些主题。
想想维基百科。它有数百万份文档,涵盖了数十万个主题。如果这些都能被自动发现岂不是很棒?以及哪些文档涵盖了哪些主题的更精细的地图。对于那些试图探索维基百科的人来说,这些将是有用的辅助工具。
我们还可以发现新出现的主题,因为有关于它们的文档。在一些环境中(如新闻),新的文档不断产生,并且新近性很重要,这将有助于我们发现趋势主题。
这篇文章涵盖了一个统计上强大且广泛使用的方法来解决这个问题。
潜在狄利克雷分配
这种方法包括建立主题和文档的显式统计模型。
主题被建模为一组固定单词(词典)的概率分布。这就形式化了“提到这个话题时想到的一组词”。文档被建模为一组固定主题的概率分布。这揭示了文档涵盖的主题。
学习的目的是从文档语料库中发现各种主题的良好单词分布,以及各种文档中的良好主题比例。主题的数量是这种学习的一个参数。
生成单据
在这个阶段,它将有助于描述如何从学习到的模型生成合成文档。这将揭示这个模型如何运作的关键方面,我们还没有深入研究。
首先,我们将选择本文档将涵盖的主题。一种方法是首先从我们的语料库中随机选取一个文档,然后将新文档的主题比例设置为种子文档的主题比例。
接下来,我们将设置文档长度,称之为 n 。
接下来,我们将重复下面的 n 次:
sample a topic from the document’s topic proportions
sample a word from the chosen topic’s words-distribution
这将发出一系列的 n 个字。这些单词将会被标注上它们所来自的主题。
生成的文档是乱码。从混合话题中抽取的一袋单词。这不是问题——它不是用来阅读的。它确实揭示了哪些词是由哪些话题产生的,这可能是有见地的。
举例
**Lexicon**: {athlete, football, soccer, tennis, computer, smartphone, laptop, printer,Intel, Apple, Google}
**Num Topics** : 3
**Topic 1**: {athlete, football, soccer, tennis}
**Topic 2**: {computer, smartphone, laptop, printer}
**Topic 3**: {Intel, Apple, Google}
**Topic proportions in a document**: { 2 ⇒ 70%, 3 ⇒ 30% }
在上面,我们已经用一组单词描述了一个主题。我们将此解释为:集合中的所有单词都是等概率的;词典中剩余的单词概率为零。
让我们看一个 4 个字的生成文档。
Topic: 2 3 2 2
Word: laptop Intel smartphone computer
主题 3 在本文中的比例(25%)接近其在抽样分布中的比例(30%)。
学习
像往常一样,这是事情变得特别有趣的地方。
首先,让我们提醒自己学习的目的。它是从文档语料库中发现各种主题的单词分布,以及各种文档中的主题比例。简而言之,哪些词描述了哪些主题,哪些主题包含在哪些文档中。
我们将要描述的算法被广泛使用。这也不难理解。这是吉布斯采样的一种形式。
该算法的工作原理是,首先以某种方式将主题分配给语料库中的各种单词,然后迭代地改进这些分配。在其操作期间,该算法跟踪当前分配的某些统计数据。这些统计数据有助于算法的后续学习。当算法终止时,很容易从最终的主题分配中“读出”每个主题的单词分布和每个文档的主题比例。
让我们从描述上一段提到的统计数据开始。它们采用两个计数矩阵的形式:topic_word 和 doc_topic。两者都是从语料库中单词的当前主题分配中得到的。topic_word( t , w )统计单词 w 出现 topic t 的次数。doc_topic( d , t )统计主题 t 在文档 d 中出现的次数。
让我们看一个数字例子,以确保我们得到了正确的。下面我们看到一个两个文档的语料库,以及对其单词的主题分配。词典是 A,B,c。
Doc 1’s words: A B A C A Doc 2’s words: B C C B
Doc 1’s topics: 1 1 1 2 2 Doc 2’s topics: 2 2 2 2
实际上,让我们先利用这个机会思考一下我们看到的一些特性。在文档 1 中,注意 A 有时被分配给主题 1,有时被分配给主题 2。如果单词 A 在两个题目中出现的概率都很高,这就说得通了。在文档 2 中,请注意 B 始终被分配给主题 2。如果文档 2 仅涵盖主题 2,并且 B 在主题 2 的分布中具有正概率,则这似乎是合理的。
好,现在来看两个计数矩阵。
**topic_word**: **doc_topic**:
*A B C 1 2*
*1* 2 1 0 *d1* 3 2
*2* 1 2 **3** *d2* 0 **4**
我们加粗了一些有点醒目的条目。也许 doc2 更喜欢主题 2。可能题目 2 更喜欢 c 字。
好了,开始讲解学习吧。第一步是用随机抽样的主题标注语料库中的单词。这听起来很容易。实际上还有更多。与其硬编码这种随机抽样,不如抽取合适的先验分布。这给了我们一个潜在的强大机制来注入领域知识或来自外部文本分析的结果。
这种基于先验的机制工作如下。首先,我们复制前面介绍的两个矩阵。分别叫它们 prior_topic_word 和 prior_doc_topic。如前所述,这些矩阵中的条目是计数。这些计数捕捉了我们先前的信念。
这些先验矩阵影响主题的初始分配。随着学习的进展,这种影响会逐渐减少,尽管不会为零。
我们如何准确地从这些计数中抽取最初分配的题目?首先,我们计算
P(w | t)= prior _ topic _ word(t,w)/sum _ w*'*(prior _ topic _ word(t,w ‘)
P(t | d)= prior _ doc _ topic(t,d)/sum_t’ (prior_doc_topic(t ',d)
P ( w | t )只是题目 t 的赋值的分数,其单词为 w 。P(t|d)只是文档 d 中指定题目为 t 的单词的零头。
接下来,我们从这些作业中抽取样本。更具体地说,我们从分子为P(w|t)P(t|d)的分布中抽取文档 d 中单词 w 的主题。
这可以这样理解。P(w|t)P(t|d)正是我们生成模型中文档 d 中生成单词 w 的概率。作为 t 的一个函数,它记录了在此过程中使用 t 的可能性。
现在让我们讨论在两个先前的矩阵中设置这些计数的值。对于我们在这里的目的,我们所关心的是没有一个主题比另一个更好。这种偏好是不必要的偏见。我们可以通过将每个矩阵中的所有计数设置为相同的正数来实现这一点。1 是最简单的选择。奥卡姆剃刀推理。
prior_topic_word(*t*,*w*)=1 for every topic *t* and word *w*
prior_doc_topic(*d*,*t*)=1 for every document *d* and topic *t*
好的,所以题目分配将会从这些计数中抽样,并且是均匀随机的。
在这个初始任务之后,我们将重复做以下事情,希望改进这个任务,因此,我们的模型从中学习到了:
1\. Pick a word *w* from a document *d* in the corpus
2\. Sample a topic *t*’ from the distribution whose numerator is
*Q*(*w|t*)*Q*(*t*|*d*)
3\. Set *w*’s topic in *d* to *t*’.
什么是 Q ( w|t )?这是我们目前认为的从话题 t 中产生单词 w 的可能性。其实好的Q(w|t)的价值观才是我们所追求的。这些将形成最终的特定主题单词分布。
在开始学习之前,我们将先前对这种分布的信念捕获到P(w|t)中。随着学习的进行,P(w|t)开始被修正为后验信念Q(w|t)。
Q(t|d)的解释也差不多。我们之前对每个文档的主题比例的看法分为P(t|d)。随着学习的进行,这些被修改成Q(t|d)。
Q(w|t)和Q(t|d)是如何计算的?在学习过程中的任何时候,考虑将主题分配给语料库中的各种单词。根据这个主题分配,我们可以计算 topic_word 和 doc_topic 矩阵中的计数。接下来,我们执行以下操作
posterior_topic_word = topic_word + prior_topic_word
posterior_doc_topic = doc_topic + prior_doc_topic
注意’+'是矩阵加法。从计数矩阵的后验版本中,我们可以计算出Q(w|t)和Q(t|d)。正如我们从之前的版本中计算出P(w|t)和P(t|d)。
一些直觉
我们如何知道这个迭代过程实际上改进了主题分配?我们不会给出证明。取而代之的是一些直觉。
首先注意,可以通过将语料库中所有出现的单词 w 乘以各种Q(w|t)Q(t|d)项,来获得语料库中单词的主题分配的总体质量。这里 d 表示 w 出现的文档,而 t 表示分配给该事件的主题。
接下来,我们将揭示分数函数具有某些可取的特征。
该得分函数有利于主题特异性
我们所说的“话题特异性”是指 Q ( w | t )只集中在几个话题上。这是那些与特定主题紧密相关的单词的期望属性。我们来细说一下。考虑一个多样化的语料库,如维基百科。假设我们的目标是发现它所涵盖的各种各样的主题。考虑一下单词 cat 。它的主题特异性很高,也就是说,它只唤起这些主题中的几个。理应如此。因此,分数函数偏向于支持主题特异性是一件好事。
也就是说,不是每个单词都应该是特定主题的。例如中的。稍后我们将讨论在这种情况下抵消主题特异性的独立机制。首先,我们来解释一下主题特异性偏差。我们称特定主题的单词为信息型。
考虑在语料库中同一个单词 w 出现 1 次 n 让 T 1 和 T 2 成为这些 n 事件的两个不同的主题分配。在 T 1 中的所有主题都是不同的。称这个集合为{ 1 、 2 、 3 、…、 n }。 T 2 里的所有题目都一样,最大化Q(w|T)的那个。把这个题目叫做 tmax 。 T 1 在Q(w|T)下的可能性是Q(w|1Q*(w|2)…*Q( *T 2 在 Q 下的可能性( w | t )是q*(w|tmax)^n。当 w 信息丰富且 n 不太小时,TT2 的可能性会远远高于 T 1。**
这一分析可以总结为
The score function encourages informative words to stay on topic
该得分函数有利于文档特异性
我们所说的“文档特异性”是指文档只涵盖几个主题。文件往往是具体的。问题是分数函数(以及随之而来的学习算法)是否利用了这种趋势来做得更好。答案是肯定的。如下所述。
考虑一个有 n 个单词的文档 d。让 T 1 和 T 2 作为两个不同的题目分配给它的单词。 T 1 中的所有主题都是截然不同的。称这个集合为{ 1 , 2 , 3 ,…, n }。 T 2 中的所有题目都一样,这次是 d 中比例最高的一个。称之为 tmax 。 T 1 在Q(T|d)下的可能性是Q(1|dQ(2 |d)…*Q(n|d)。 T 2 在q*(t|d)下的可能性是q(tmax|d)^n。显然,T2 可以高得多,尤其是对于大型文档。
这一分析可以总结为
The score function encourages documents to stay on topic
这些影响有时会相互竞争!
考虑一个特别常见的词: the 。合理假设它出现在几乎所有文档中。主题一致性倾向于为所有这些事件分配相同的主题。文件特异性抗议,因为这将迫使所有这些文件涵盖这一个主题。
让我们想象一下这可能会如何发展。主题一致性可能会让这些词失去吸引力。他们被分配的话题可能只是“随波逐流”,以邻居中任何话题的身份出现。当然,这些作业的可能性的主题一致性组件可能会减少。另一方面,文档特异性部分将会增加。
更多关于学习算法
我们已经看到分数函数有好的偏向。这只有在学习算法很好地利用它们的情况下才有帮助。所以让我们更深入地讨论一下算法。
我们首先注意到,该算法通过局部优化全局主题分配质量分数来工作。仅这一点就表明它正在关注偏见。
接下来,我们将在一个简单的例子中进行一两次迭代。这将帮助读者更好地感受它的“局部优化”行为。这比一些人想象的更加微妙。
例子
我们将词典设置为{A,B}。我们的语料库将有两个文档,AAA (d1)和 BBB (d2)。(虽然这些听起来可能很傻,但这个练习将会很有教育意义。)我们的目标是给语料库添加两个主题。
让我们将所有先前的计数设置为 0.0000001。它仍然会产生均匀随机的初始赋值,尽管简化了我们的数值计算。
假设下面是最初的任务
d1 d2
AAA BBB
121 122
从该作业中学到的模型是
Q(A|1) = ⅔ , Q(B|1) = ⅓ // these sum to 1
Q(A|2) = ⅓ , Q(B|2) = ⅔ // these sum to 1
Q(1|d1) = ⅔ , Q(2|d1)= ⅓ // these sum to 1
Q(1|d2) = ⅓, Q(2|d2) = ⅔ // these sum to 1
现在想象从 d 1 中选取一个单词,并重新采样它的主题。(我们本可以选择 d 2,但理由是相似的。)有三种可能的结果:121 → 121,121 → 1 1 1,121 → 12 2 或 2 21。第三种方法实际上就是我们开始的地方:交换主题名称并重新排列顺序。所以第一个和第三个结果实际上让我们回到了同样的状态。所以我们放大第二个:121 → 111。这种转变的概率是正的。(事实上相当高,因为从 2 → 1 的转换提高了主题可能性分量和文档可能性分量。)因此,如果我们一直重复这个过程,在某一点上,所有 d1 将被分配相同的主题 t (=1 或 2)。
接下来,我们从这个赋值 t 到 d 1 重新估计模型的各种参数。Q(t|d1)现在是 1。Q (A| t )很可能比我们开始这个过程时的 Q (A|1)要高。我们已经达到了一种难以摆脱的“快乐状态”。
变体
现在让我们看看这个算法的一些变体。这些包括修改下面的步骤 2。
1\. Pick a word *w* from a document *d* in the corpus
2\. **Sample a topic *t*’ from the distribution whose numerator is
*Q*(*w|t*)*Q*(*t*|*d*)**
3\. Set *w*’s topic in *d* to *t*’.
我们可以将步骤 2 替换为“将 t’ 设置为最大化Q(w | t)Q(t|d)的主题”。这被称为最大似然估计。在我们的设置中,这产生了一个贪婪的算法。
这种变体因其简单性而吸引人,并且可能收敛得更快。然而,它更容易陷入次优的局部最优。
我们的下一个变体引入了一个称为温度的参数,它可以被改变以跨越从吉布斯采样器到贪婪算法的行为范围。这就是这种算法的吸引力所在。不过,这确实提出了一个新问题:如何设定温度。
撇开温度不谈,让我们看看它是如何工作的。考虑单词 w ,其当前主题 t 正被考虑重新分配。对于我们评估的每个主题
delta(t’) = — [ log *Q*(*w*|*t*’)*Q*(*t*’|*d*) — log *Q*(*w*|*t*)*Q*(*t*|*d*) ]
我们不会在这里解释为什么日志。我们将注意到,delta(t’)小于 0 对应于在这种情况下t’比 t 更适合。从 t 到 t’的转换可以被视为减少能量(或下坡)的移动。
接下来会发生什么?我们会定性描述。所以现在我们知道了 delta( t ')对于 t '的各个值,包括 t 。根据这些增量值,该算法定义了主题上的合适的概率分布。这种分布由温度参数化。
在高温下,甚至允许“上坡移动”,即移动到 delta 值为正的主题。这样的移动,虽然在当前的主题分配上是倒退的,但是可以帮助逃脱局部能量最小值。
在低温下,分布倾向于δ值为负的移动。在零度的极端情况下,这会产生贪婪的行为。
更丰富的前科
到目前为止,我们已经将 prior counts 设置为 1。这里我们考虑更丰富的设定。
之前我们注意到,某些单词最好是特定于主题的。我们能找到这样的单词并把它们的主题特异性偏好记录到先前的计数中吗?这可以加快后续的学习。
这里有一个明智的方法。首先,我们将所有先前的计数设置为 1。接下来,对于每个单词 w,我们将计算 n - n ( w )。这里 n 是语料库中的文档总数, n ( w )是单词 w 出现的文档数。把n-n(w)看成是 w 的某种“逆文档频率”。接下来,我们将对每个单词分别进行以下操作。我们将从众多话题中随机挑选一个话题。我们会把n-n(w)加到前面的 count word_topic( t , w )。
这个想法是把不常见的单词映射到特定的主题。由于主题选择是随机的,不同的单词可能会映射到不同的主题。
这个先验是否过于偏颇?我们可以很容易地软化它,如果我们觉得是这样的话。有很多可能性。一种是将n-n(w)替换为log n-log n(w)。第二种方法是在放大一个单词的先前计数时,对多个主题(尽管不是很多)进行采样。
其他建模增强
改进模型还需要考虑哪些方面?首先,让我们阐明它的假设:
1\. The topics a document covers are sampled independently. They
are not checked for compatibility.
2\. Word proximity in a document is not considered.
3\. The hierarchical structure among topics is not modeled.
让我们分别说一说。主题兼容性可能很重要。一份文件更有可能涵盖科技公司 & 电脑而不是科技公司 & 体育。单词的接近度也很重要。重复出现在彼此附近的两个单词比相隔几千个单词出现的更有可能出现在同一个主题上。主题层次结构更好地模拟了文档。一种常见的写作模式是让文档涵盖一个广泛的主题及其各种子主题。
下面我们描述如何解决这些问题。在某些用例中,放松可能会提高模型的准确性,尽管可能会增加模型的复杂性或可学性。他们也提供了注入领域知识的机会。此外,在某些方面甚至有助于学习!
具体如何进行很大程度上取决于用例。
主题兼容性
这涉及到添加一个马尔可夫模型。它的状态就是主题。它的转换模型语料库中的主题之间的兼容性。
在对文档中的单词主题进行采样时,如何使用这个模型?我们需要适当延长 Q ( t | d )。这个扩展最简单的描述是想象从中抽取主题。
这种抽样可以被看作是在马尔可夫模型上的随机行走,可能偶尔会重新开始。我们首先从Q(t|d)中选择一个主题。接下来,我们执行以下操作。大多数情况下,我们从这个话题的状态开始走一个转换,其概率在那个转换上。偶尔我们会从Q(t|d)重新采样,即跳转到新的话题。
这种随机游走诱导出一种新的分布,称之为Q’(t|d,M)它同时受到马尔可夫模型 M 和Q(t|d)的影响。马尔可夫模型是一个语料库级的结构。使用Q(t|d)将其行为定制为文档 d 。
马尔可夫模型的参数是如何学习的?这个比较好解释。到目前为止,我们的学习算法已经在为语料库文档中的单个单词分配主题的层面上工作。马尔可夫模型的参数完全由这种分配决定。
具体来说,对于文档中每一对主题分配的 s 、 t ,我们对弧 s → t 和 t → s 进行递增计数,除非 s 等于 t ,在这种情况下只递增一次。
因此,随着主题分配的改进,主题兼容性模型的参数也随之改进。两者协同作用。
让我们从更广的范围来看待这种协同作用。随着我们看到越来越多的关于相同两个主题的文档,马尔可夫模型开始了解到这些主题是兼容的。这种改进的学习导致其他地方的主题分配的改进。
字的接近度
这可以通过适当延长Q(w|t来合并。具体来说,让 t 的选择不仅受到 w 的影响,也受到 w 附近的词的影响。
让我们把这个正式化。设W(d)=W(-d),…, w ,…, w (+ d )表示以 w 为中心的长度为 2 d +1 的单词序列。这里 d 是一个非负整数。接下来,我们将Q(W|t)扩展为Q(W(d)|t)。
从学习的角度来看,这是否使我们的模型变得复杂了?有了合适的假设,幸运的是没有。我们假设 W ( d )中的字在给定 t 的情况下是条件独立的。在这种假设下,我们得到
*Q*(*W*(*d*)|*t*) = *Q*(*w*(-*d*)|*t*)*…**Q*(*w*|*t*)*…*Q(*w*(+*d*)|*t*)
涉及 t 的 RHS 术语都是和以前一样的形式。所以学习不需要改变!
尽管有这样的假设,我们还是得到了使用上下文的好处。其中最主要的是,分配给中心词 w 的主题可以更准确地确定,因为现在我们有了更多的上下文。另一个有用的特征,尤其是在学习的早期,是我们得到了一些话题的连续性。当我们一次滑动窗口 W ( d )一个单词时,分配的主题不太可能改变,因为上下文没有太大变化。相比于 W (0)。
主题层次
这是一个高级话题。我们的报道是局部的。
这里是关键的观察。比较两个主题的单词分布有助于评估一个主题是否是另一个主题的后代。后代的关键字将倾向于成为祖先关键字的子集。
使用这个概念,我们可以在学习过程中的任何时候学习主题的层次结构。即使是一个粗略的学习层次也比没有强。
正如我们为主题兼容性所做的那样,我们可以扩展我们的Q(t|d)模型,以将所学的层次结构考虑在内。就像这里一样,描述这个扩展最简单的方法是想象一个特定文档的采样主题。
这种抽样是在层次结构上随机进行的,可能偶尔会重新开始。我们首先从Q(t|d)中选择一个主题。接下来,我们执行以下操作。很多时候我们从这个话题走到一个孩子身上。偶尔我们会从Q(t|d)重新取样,也就是跳到层次结构中其他地方的主题。
这种随机游走导致了一种新的分布,称之为 Q '( t | d ,H),它同时受到主题层次 H 和 Q ( t | d )的影响。主题层次结构是一个语料库级别的结构。使用Q(t|d)将其行为定制为文档 d。
提高可读性的增强功能
文档的可读性不是 LDA 的主要目标。尽管如此,建模框架提供了注入改进它的机制的机会。所以让我们利用这一点。
让我们从提出问题开始。
1\. Topic continuity is not maintained. Neighboring words can jump
from topic to topic.
2\. Topic coherence is not maintained. A topic spews out its words
independently.
话题连续性
我们可以通过添加一个具有两种状态的马尔可夫模型来保持话题的连续性:继续和切换。继续继续当前话题,切换切换到新话题。从延续到自身的弧应该有很大概率。从开关到继续的弧应该有接近 1 的概率,因为我们几乎肯定想要继续跟随开关。
这个模型上的概率很容易从主题作业中学习到。埋在其中的是继续和切换事件。这种学习与主题任务的学习相吻合,相互受益。
在文档中利用词的邻近性也有助于保持主题的连续性。我们选择涵盖本节方法的原因是,它比单词邻近法更容易实现。
这也有利于学习
除了可读性之外,注入主题连续性机制也有可能提高所学作业的质量。实际上,它充当了平滑正则化器,不支持离群值。
这里有一个例子,是我们之前使用的一个例子的扩展。考虑单词*,我们假设它出现在语料库的几乎所有文档中。之前我们解释了为什么我们希望分配给和的特定事件的主题能够在它的邻居中“随波逐流”。主题连续性机制为这种偏好增加了更多权重,因为它明确倾向于“随波逐流”。*
话题连贯性
我们可以通过放松单词袋假设来保持话题的连贯性。相反,使用一阶马尔可夫模型来模拟当前单词对下一个单词的影响。每个主题都有自己的马尔可夫模型。
每个主题的马尔可夫模型很容易从语料库中的当前主题分配中(重新)学习。
延伸阅读
大卫·布雷。概率主题模型。ACM 的通信。2012 年http://www.cs.columbia.edu/~blei/papers/Blei2012.pdf
大卫·布雷,吴恩达,迈克尔·乔丹。潜在狄利克雷分配。JMLR (3) 2003 年第 993-1022 页。
汤姆·格里菲斯。潜在狄利克雷分配生成模型中的吉布斯抽样。https://people . cs . umass . edu/~ wallach/courses/S11/cmpsci 791 ss/readings/griffiths 02 Gibbs . pdf
基于 PyCaret 的 Power BI 主题建模
Power BI 中的 NLP 仪表板
在我们的上一篇文章中,我们展示了如何通过将 Power BI 与 PyCaret 集成来实现聚类分析,从而允许分析师和数据科学家在他们的报告和仪表板中添加一层机器学习,而无需任何额外的许可成本。
在这篇文章中,我们将看到如何使用 PyCaret 在 Power BI 中实现主题建模。如果你以前没有听说过 PyCaret,请阅读这个公告以了解更多信息。
本教程的学习目标
- 什么是自然语言处理?
- 什么是主题建模?
- 在 Power BI 中训练和实现一个潜在的 Dirichlet 分配模型。
- 在仪表板中分析结果和可视化信息。
开始之前
如果您以前使用过 Python,很可能您的计算机上已经安装了 Anaconda 发行版。如果没有,点击这里下载 Python 3.7 或更高版本的 Anaconda 发行版。
https://www.anaconda.com/products/individual
设置环境
在我们开始在 Power BI 中使用 PyCaret 的机器学习功能之前,我们必须创建一个虚拟环境并安装 pycaret。这是一个四步的过程:
✅ 步骤 1——创建一个 anaconda 环境
从开始菜单打开 Anaconda 提示符并执行以下代码:
conda create --name **powerbi** python=3.7
“power bi”是我们选择的环境名称。你可以保留任何你喜欢的名字。
✅ 第二步—安装 PyCaret
在 Anaconda 提示符下执行以下代码:
pip install **pycaret**
安装可能需要 15-20 分钟。如果您在安装时遇到问题,请查看我们的 GitHub 页面,了解已知问题和解决方案。
✅t24】第三步——在 Power BI 中设置 Python 目录
创建的虚拟环境必须与 Power BI 链接。这可以使用 Power BI Desktop 中的全局设置来完成(文件→选项→全局→ Python 脚本)。默认情况下,Anaconda 环境安装在以下位置:
C:\Users\ 用户名 \Anaconda3\envs\
文件→选项→全局→ Python 脚本
✅步骤 4 —安装语言模型
为了执行 NLP 任务,您必须通过在 Anaconda 提示符下执行以下代码来下载语言模型。
首先在 Anaconda 提示符下激活 conda 环境:
conda activate **powerbi**
下载英语语言模型:
python -m spacy download en_core_web_sm
python -m textblob.download_corpora
python -m 空间下载
python-m text blob . download _ 语料库
什么是自然语言处理?
自然语言处理(NLP)是计算机科学和人工智能的一个子领域,涉及计算机和人类语言之间的交互。特别是,NLP 涵盖了关于如何编程计算机来处理和分析大量自然语言数据的广泛技术。
NLP 驱动的软件在日常生活中以各种方式帮助我们,很可能你已经在不知不觉中使用了它。一些例子是:
- 个人助理 : Siri,Cortana,Alexa。
- 自动完成:在搜索引擎中(*例如:*谷歌、必应、百度、雅虎)。
- 拼写检查:几乎无处不在,在你的浏览器,你的 IDE ( 比如: Visual Studio),桌面应用(*比如:*微软 Word)。
- 机器翻译:谷歌翻译。
- **文档摘要软件:**文本压缩器,自动摘要器。
来源:https://clevertap.com/blog/natural-language-processing
主题建模是一种用于在文本数据中发现抽象主题的统计模型。这是 NLP 中的许多实际应用之一。
什么是主题建模?
主题模型是一种属于无监督机器学习的统计模型,用于发现文本数据中的抽象主题。主题建模的目标是在一组文档中自动发现主题。
主题建模的一些常见用例有:
- 通过将文档分类成主题来总结大量文本数据(这个想法与聚类非常相似)。
- 探索性数据分析了解客户反馈表、亚马逊评论、调查结果等数据。
- 特征工程为监督机器学习实验(如分类或回归)创建特征
有几种算法用于主题建模。一些常见的是潜在狄利克雷分配(LDA),潜在语义分析(LSA),和非负矩阵分解(NMF)。每种算法都有自己的数学细节,这将不会在本教程中介绍。我们将使用 PyCaret 的 NLP 模块在 Power BI 中实现一个潜在的 Dirichlet 分配(LDA)模型。
如果你有兴趣学习 LDA 算法的技术细节,可以阅读这篇论文。
来源:https://springer plus . springer open . com/articles/10.1186/s 40064-016-3252-8
主题建模的文本预处理
为了从主题建模中获得有意义的结果,必须在将文本数据馈送给算法之前对其进行处理。这在几乎所有的 NLP 任务中都很常见。在处理结构化数据(行和列中的数据)时,文本的预处理不同于机器学习中经常使用的经典预处理技术。
PyCaret 通过应用超过 15 种技术自动预处理文本数据,如停用词去除、标记化、词条化、二元/三元模型提取等。如果您想了解 PyCaret 中所有可用的文本预处理特性的更多信息,单击此处。
设置业务环境
Kiva 是一个国际非营利组织,于 2005 年在旧金山成立。它的使命是扩大金融服务不足的社区,以帮助他们蓬勃发展。
在本教程中,我们将使用来自 Kiva 的开放数据集,其中包含 6,818 个已批准贷款申请人的贷款信息。数据集包括贷款金额、国家、性别等信息,以及借款人提交的申请中的一些文本数据。
样本数据点
我们的目标是分析’ en '列中的文本数据,以找到抽象主题,然后使用它们来评估某些主题(或某些类型的贷款)对违约率的影响。
👉我们开始吧
现在,您已经设置了 Anaconda 环境,理解了主题建模,并且有了本教程的业务上下文,让我们开始吧。
1.检索数据
第一步是将数据集导入 Power BI Desktop。您可以使用 web 连接器加载数据。(Power BI 桌面→获取数据→来自 Web)。
Power BI 桌面→获取数据→其他→ Web
链接到 csv 文件:
https://raw . githubusercontent . com/py caret/py caret/master/datasets/kiva . CSV
2.模特培训
为了在 Power BI 中训练主题模型,我们必须在 Power Query Editor 中执行 Python 脚本(Power Query Editor→Transform→Run Python script)。将以下代码作为 Python 脚本运行:
from **pycaret.nlp** import *
dataset = **get_topics**(dataset, text='en')
超级查询编辑器(转换→运行 python 脚本)
PyCaret 中有 5 个现成的主题模型。
默认情况下,PyCaret 使用 4 个主题训练一个潜在狄利克雷分配(LDA) 模型。默认值可以很容易地更改:
- 要更改模型类型,使用 get_topics() 中的 模型 参数。
- 要更改主题数量,使用 num_topics 参数。
参见包含 6 个主题的非负矩阵分解模型的示例代码。
from **pycaret.nlp** import *
dataset = **get_topics**(dataset, text='en', model='nmf', num_topics=6)
输出:
主题建模结果(执行 Python 代码后)
最终输出(点击表格后)
包含主题权重的新列被附加到原始数据集。下面是应用查询后 Power BI 的最终输出。
Power BI Desktop 中的结果(应用查询后)
3.仪表盘
一旦您在 Power BI 中有了主题权重,以下是一个如何在 dashboard 中可视化它以生成见解的示例:
仪表板的摘要页面
仪表板的详细信息页面
你可以从我们的 GitHub 下载 PBIX 文件和数据集。
如果您想了解更多关于使用 PyCaret 在 Jupyter 笔记本中实现主题建模的信息,请观看这个 2 分钟的视频教程:
使用 PyCaret 在 Jupyter 笔记本中进行主题建模
如果你有兴趣学习更多关于主题建模的知识,你也可以查看我们为初学者准备的 NLP 101 笔记本教程。
关注我们的 LinkedIn 并订阅我们的 Youtube 频道,了解更多关于 PyCaret 的信息。
重要链接
用户指南/文档
GitHub 资源库 安装 PyCaret
笔记本教程
贡献于 PyCaret
想了解某个特定模块?
从第一个版本 1.0.0 开始,PyCaret 有以下模块可供使用。点击下面的链接,查看 Python 中的文档和工作示例。
另请参见:
笔记本中的 PyCaret 入门教程:
你愿意投稿吗?
PyCaret 是一个开源项目。欢迎每个人都来投稿。如果您愿意投稿,请随意处理未决问题。dev-1.0.1 分支上的单元测试接受拉请求。
如果你喜欢 PyCaret,请给我们 GitHub 回购的⭐️。
中:https://medium.com/@moez_62905/
领英:【https://www.linkedin.com/in/profile-moez/
推特:【https://twitter.com/moezpycaretorg1
电影微博的主题建模——电影销售预测
使用主题建模和时间序列预测分析了社交媒体对电影销售的影响
供稿人:小酒窝·辛哈尼亚、郭尔强、袁丽莎、袁建业·李、杰夫·内尔
Github
【https://github.com/chikorita5/movie-hype
简介
分析师使用不同的社交媒体平台来收集、分析和预测人们的行为。如今,脸书和推特拥有最多的信息。复仇者联盟端游即将上映的时候,人们在推特上疯了。发行后,它获得了有史以来最高的销量。除了这部电影由漫威电影宇宙制作,有小罗伯特·唐尼、克里斯·埃文斯等演员出演,这部电影的成功很大程度上也是普通大众在网上制造的轰动效应。研究表明,除了预算、明星影响力、类型和其他电影特有的因素之外,上映前在互联网上的知名度和反馈也是决定电影首映周末票房收入的重要因素。但是没人知道这两者是什么关系。twitter 上有很多与电影相关的标签和推文。哪些推文和话题真正让人们去看和喜欢一部电影并不像听起来那么容易理解。也就是说,预测电影销售的因素有很大的商业价值,因为它可以帮助营销和公关团队根据特定人群的兴趣来确定提高销售的策略。这就是为什么我们决定建立一个模型来确定电影成功的因素,并在此基础上得出一些重要的见解。
数据收集
我们使用 Twitter API 来访问推文。为了获得相关的推文,我们使用了特定的标签。比如电影《爱尔兰人》,我们用了#TheIrishman。一开始,当我们下载推文时,大多数推文的内容都显示“…”。由于旧的 140 个字符的限制,API 自动忽略超过 140 个字符的单词。因此,我们使用“全文”方法来获取完整的文本。使用这种方法,我们获得了所有相关的数据,但是我们仍然不能从历史中收集完整的数据,因为 twitter API 不允许检索超过 7 天的数据。
数据预处理
在将每部电影的日期和推文内容保存到 CSV 文件后,我们使用 NLTK 库清理文本,删除停用词和无意义的词,如“this”、“here”、“I”等。我们还使用词汇化将单词转换成它们的原始格式。最后,我们构建了 N-gram,这样具有相关意义的重要短语就不会被分割成单个无意义的单词。
题目模型分析
主题模型分析是在一组文档中识别主题的无监督过程。我们使用了潜在的狄利克雷分配(LDA)算法,该算法将一个单词包作为一定比例的主题集合。然后,它“重新安排文档内的主题分布和主题内的关键词分布,以获得主题-关键词分布的良好组合”。主题是典型代表的主导关键词的集合,仅仅通过查看关键词,我们就可以确定主题是关于什么的。
人们认为,人们写的每一篇文章,无论是推特还是研究论文,都是由主题和话题组成的。我们想知道人们在推特上谈论一部电影时到底在谈论什么。例如,一个人可能会发微博说她有多崇拜电影《玛琳菲森》中的安吉丽娜·朱莉,但其他人可能会发微博说特效或音乐如何让他们爱上这部电影。通过进行主题模型分析,目的是找出哪些关键词与每部电影高度相关。本质上,人们谈论的这些特定话题可能会影响电影的销售。
我们使用来自八部电影的干净文本作为输入,并期望在模型中看到 8 个主题,每部电影一个,但我们的结果令人惊讶。许多主题相互重叠,这意味着一些电影分享了一个相似的主题。因为我们的数据集来自战争、历史、动画、爱情等混合类型的电影。有些可能有相同类型的相似主题与之相关,许多关键字是多余的。其他一些关键字与输出主题完全不相关。因此,我们决定减少话题的数量。
图 1 -重叠主题
只有 4 个主题(图 2),我们成功地将每个主题分成一个独特的主题。通过选择某个主题,我们还可以知道哪些关键词与电影最相关。
图 2-主题 4 主要与电影《恶魔》和电影推文中使用的关键词有关
预测
在我们通过主题模型获得相关主题和关联关键词后,我们使用 R 库‘gtrends’收集每个主题中某些关键词的 google 趋势。例如,安吉丽娜·朱莉的谷歌趋势与《玛丽莲·梦露》的销量高度相关(图 3)。我们找到了与电影销售趋势相似的关键词,并使用这些关键词作为我们的 ARIMA 模型的约束。
在构建 ARIMA 模型之前,我们使用 ts()方法将所有变量转换成 R 中的时间序列对象。为了建立一个更好的模型,我们将销售时间序列设为平稳。我们成功地从票房网站上收集了所有电影 30 天的销售额。预测超过 30 天的数据对电影行业毫无用处,因为大多数电影在影院上映的时间只有 2-3 个月。因此,我们使用 12 天的数据作为训练集来构建模型,并预测第 3 周的销售额。为了预测电影《玛琳菲森》的销量,我们使用了关键词“安吉丽娜·朱莉”和“迪士尼”。通过使用这种方法,该模型被证明是相当准确的。
图 3-关键字“安吉丽娜·朱莉”的时间序列图和销售额非常相似
图 4 -预测总销售额-红色:预测,黑色:实际
不幸的是,这个预测模型并不是对所有的电影都非常准确。但是我们仍然可以从主题模型中获得一些见解。因为我们已经知道了每部电影的主题,我们可以很容易地说出哪些关键词是流行的,为什么。例如,从下图可以得出结论,在电影玩火的推文中,“bts”被提到了这么多次。因为 BTS 的音乐出现在电影《T2》的《玩火 T3》中。所有这些见解可以为电影的公关团队提供很好的建议,以提高其流行趋势。
图 5 -主题建模结果
结论&建议
我们的模型非常准确地预测了 Maleficent 的销量。不幸的是,由于我们的模型和电影行业本身的限制,用相同的变量和约束来预测一切是不可能的。然而,我们认为每部电影的相关关键词仍然是决定电影受欢迎程度的一个很好的指标。关键词也是电影受欢迎程度的良好标识。比如从电影中途最相关的关键词——‘老兵’和‘历史’,可以说喜欢战争片的人都喜欢这部电影。制作公司可以利用这些见解将他们的促销活动集中在这些主题上,以吸引最相关的观众到影院,并增加电影销售。
参考文献
PyCaret 上的主题建模
数据科学/ Python NLP 片段
PyCaret 自然语言处理模块初学者指南。
Gabriel Gurrola 在 Unsplash 上拍摄的照片
我记得不久前和我老板的老板的一次简短谈话。他说,如果公司里有人从零开始开发人脸识别工具,他不会感到惊讶,因为,我引用他的话,“你猜怎么着?有一个 API 可以做到这一点。”然后他继续说做已经做过的事情而不是仅仅使用它是徒劳的。
这让我深入了解了一名高管是如何思考的。这并不是说他们不关心项目的酷,而是说到底,他们最关心的是项目如何为企业增加价值,更重要的是,项目能多快完成。
在现实世界中,构建原型所需的时间很重要。我们从数据到见解的速度越快,我们就会变得越好。这些帮助我们保持敏捷。
这让我想到了 PyCaret。
PyCaret 是一个开源的,用 Python 编写的低代码机器学习库,允许您在几秒钟内从准备数据到在您选择的笔记本环境中部署模型。
Pycaret 基本上是一些最流行的机器学习库和框架 scikit-learn 和 spaCy 的包装器。以下是 PyCaret 可以做的事情:
- 分类
- 回归
- 使聚集
- 异常检测
- 自然语言处理
- 关联规则挖掘
如果您有兴趣了解传统的 NLP 方法与 PyCaret 的 NLP 模块之间的区别,请查看 Prateek Baghel 的文章:
传统教学法与 PyCaret 教学法的对比分析
towardsdatascience.com](/nlp-classification-in-python-pycaret-approach-vs-the-traditional-approach-602d38d29f06)
自然语言处理
在短短几行代码中,PyCaret 使自然语言处理变得如此简单,几乎是犯罪。与大多数其他模块一样,PyCaret 的 NLP 模块 streamlined pipeline 将从数据到洞察的时间缩短了一半以上。
例如,只有一行,它自动执行文本处理,具有自定义停用词的能力。再添加一两行代码,您就有了一个语言模型。还有另一行,它给你一个适当格式的 plotly 图。最后,添加另一行可以让您选择评估模型。你甚至可以用一行代码来调整模型。
与其告诉你 PyCaret 的所有精彩特性,不如我们做一点展示和讲述会更好。
管道
在这篇文章中,我们将创建一个 NLP 管道,包括以下 6 个步骤:
- 获取数据
- 设置环境
- 创建模型
- 分配模型
- 绘制模型
- 评估模型
我们将对该管道进行端到端的演示,并简要解释相关的功能及其参数。
让我们开始吧。
家政
让我们从安装 PyCaret 开始。如果这是您第一次安装它,只需在您的终端中键入以下内容:
pip install pycaret
但是,如果您有以前安装的 PyCaret 版本,可以使用以下命令进行升级:
pip install —-upgrade pycaret
注意:PyCaret 是一个很大的库,所以下载和安装需要几分钟时间。
我们还需要下载英语语言模型,因为它不包含在 PyCaret 安装中。
python -m spacy download en_core_web_sm
python -m textblob.download_corpora
接下来,让我们启动 Jupyter 笔记本并导入 PyCaret 的 NLP 模块:
导入pycaret.nlp
会自动设置您的环境,只执行 NLP 任务。
获取数据
在设置之前,我们需要首先决定如何接收数据。将数据放入管道有两种方法。一种是使用 Pandas 数据框架,另一种是使用简单的文本数据列表。
传递数据帧
上面,我们只是将数据加载到一个数据帧中。
传递列表
上面,我们正在打开文件'list.txt'
并读取它。我们将结果列表分配到lines
中。
抽样
在本实验的其余部分,我们将只使用 dataframe 将文本数据传递给 NLP 模块的setup()
函数。为了方便起见,我们将对数据帧进行采样,只选择一千条推文。
让我们快速浏览一下带有df.head()
和df.shape
的数据帧。
设置环境
在下面的代码行中,我们将通过调用setup()
函数来初始化设置,并将其分配给nlp
。
通过data
和target
,我们告诉 PyCaret 我们想要使用df
的'text'
列中的值。此外,我们将session_id
设置为任意的数字493
,这样我们可以一遍又一遍地重复实验,并得到相同的结果。最后,我们添加了custom_stopwords
,这样 PyCaret 将在分析中排除指定的单词列表。
注意,如果我们想使用一个列表,我们可以用lines
替换df
并去掉target = ‘text’
,因为一个列表没有 PyCaret 指向的列!
下面是nlp
的输出:
上面的输出表确认了我们的会话 id、文档数量(行或记录)和词汇表大小。它还会显示我们是否使用了自定义停用词。
创建模型
下面,我们将通过调用create_model()
函数创建模型,并将其分配给lda
。该函数已经知道使用我们在setup()
中指定的数据集。在我们的例子中,PyCaret 知道我们想要基于df
中的'text'
创建一个模型。
在上一行中,注意 w param 使用了'lda'
作为参数。LDA 代表潜在的狄利克雷分配。我们可以很容易地选择其他类型的模型。
以下是 PyCaret 目前支持的型号列表:
- “lda”:潜在的狄利克雷分配
- 潜在语义索引
- “hdp”:分层狄利克雷过程
- rp ':随机投影
- “nmf”:非负矩阵分解
我鼓励你研究以上模型之间的区别,首先,看看 Lettier 的关于 LDA 的令人敬畏的指南。
在我们开始之前,我做了一个工具(这是源代码),可以在你的浏览器中运行 LDA(非常简洁)。是…
medium.com](https://medium.com/@lettier/how-does-lda-work-ill-explain-using-emoji-108abf40fa7d)
我们使用的下一个参数是num_topics = 6
。这告诉 PyCaret 在结果中使用从 0 到 5 的六个主题。如果没有设置 num_topic,缺省值为 4。最后,我们设置multi_core
告诉 PyCaret 使用所有可用的 CPU 进行并行处理。这节省了大量的计算时间。
分配模型
通过调用assign_model()
,我们将标记我们的数据,这样我们将获得一个数据帧(基于我们的原始数据帧:df
),其中包含以下信息的附加列:
- 每个主题的主题百分比值
- 主导话题
- 主导主题的百分比值
让我们来看看df_lda
。
绘制模型
调用plot_model()
函数将会给我们一些关于频率、分布、极性等等的可视化。plot_model()
函数有三个参数:模型、情节和主题数量。model
指示 PyCaret 使用什么模型,并且前面必须有一个create_model()
函数。topic_num
指定可视化将基于哪个主题编号(从 0 到 5)。
PyCarets 提供了各种各样的情节。生成的图形类型将取决于plot
参数。以下是当前可用的可视化列表:
- ‘频率’:单词标记频率(默认)
- “分布”:单词分布图
- “二元模型”:二元模型频率图
- “三元模型”:三元模型频率图
- “情绪”:情绪极性图
- “词性”:词频
- “tsne”:t-SNE(3d)维度图
- “主题模型”:主题模型(pyLDAvis)
- “主题分布”:主题推断分布
- “单词云”:单词云
- “umap”:UMAP 维度图
评估模型
评估模型包括调用evaluate_model()
函数。它只需要一个参数:要使用的模型。在我们的例子中,存储的模型是在前面的步骤中用create_model()
函数创建的lda
。
该函数返回用于绘图的可视化用户界面。
瞧,我们完成了!
结论
使用 PyCaret 的 NLP 模块,我们能够在短短几行代码中快速地从获取数据到评估模型。我们讨论了每个步骤中涉及的函数,并检查了这些函数的参数。
感谢您的阅读!PyCaret 的 NLP 模块有更多的特性,我鼓励你阅读他们的文档来进一步熟悉这个模块,甚至整个库!
在下一篇文章中,我将继续探索 PyCaret 的功能。
如果你想了解更多关于我从懒鬼到数据科学家的旅程,请查看下面的文章:
我的无学位数据科学之旅。
towardsdatascience.com](/from-slacker-to-data-scientist-b4f34aa10ea1)
敬请期待!
你可以通过推特或 T2【LinkedIn】联系我。
[1] PyCaret。(2020 年 6 月 4 日)。为什么 PyCaret 。https://pycaret.org/
主题建模与 LDA 和 Quora 问题
图片来源:Unsplash
潜在狄利克雷分配,非负矩阵分解
Quora 用来给问题分配主题的算法是专有的,所以我们不知道他们是如何做到的。然而,这并不妨碍我们用自己的方式去尝试。
- 问题描述
Quora 有所有这些未标记的现有问题,他们需要对它们进行分类,以适应机器学习管道的下一步。
- 识别问题
这是一个无监督的学习问题,我们在 Quora 问题中发现了各种各样的主题。
- 目标
我们的目标是确定主题的数量,并确定每个主题的主题。此外,我测试了我的模型是否可以预测任何新问题的主题。
- 方法
将一个 LDA 和一个 NMF 模型应用到 Quora 问题数据集上,确定主题数量和每个主题的主题。
我已经在 Github 上加载了一个更小的样本数据集,可以随意使用。
来源:Quora
这是这个话题的一个例子,以及它在 Quora 网站上的样子。
数据预处理
启动. py
在文本预处理之前,问题看起来是这样的:
prior_preprocessing.py
图 1
文本预处理期间我们要做什么:
- 小写字母
- 删除停用字词、括号、标点和数字
- 使用空间然后移除“-PRON-”的词条解释。
在文本预处理过程中我们不打算做什么:
- 堵塞物
词干删除一个单词中的最后几个字符,往往会导致不正确的意思和拼写错误,或者使单词无法识别,例如:business → busi,busy → busi,situation → situ。
我们应该尽量不要做太多的文本预处理,因为大多数问题都很短,删除更多的单词有失去意义的风险。
text _ 预处理 _lda.py
电子设计自动化(Electronic Design Automation)
探究问题一般有多长。
问题 _ 长度. py
图 2
关于什么问题。
word_cloud.py
图 3
Unigrams
unigram.py
图 4
二元组
bigram.py
图 5
三元组
三元模型. py
图 6
观察结果 :
- 很多问题都在问“开始的有用技巧……”(我想是开始一份新的职业或新的工作?)
- 很多问题都是关于学习的好方法。
- 很多问题都是询问短期商务旅客的酒店推荐。
- 许多人在询问好邻居或坏邻居。假设他们想搬到一个新的地方?
- 有些人在考虑写传记。
- 似乎有一些重复的问题,例如:短期商务旅客的酒店。检测重复的问题会很有趣,这是另一个时间的主题。
主题建模
- 做主题建模,我们需要的输入是:文档-术语矩阵。单词的顺序不重要。所以,我们称之为“词汇袋”。
- 我们既可以使用 scikit-learn 也可以使用 Gensim 库,该技术被称为“潜在狄利克雷分配”,简称“LDA”。
- 输出是数据中所有问题的主题数量以及每个主题的主题。
让我们更深入地研究文档术语矩阵到底是什么。假设我们总共有三个问题:
1).足球运动员如何保持安全?
2).最讨厌的 NFL 足球队是哪支?
3).谁是最伟大的政治领袖?
这三个问题的文档术语矩阵是:
表 1
每行是一个问题(或文档),每列是一个术语(或单词),如果该文档不包含该术语,我们标记“0”,如果该文档包含该术语一次,我们标记“1”,如果该文档包含该术语两次,我们标记“2”,依此类推。
潜在狄利克雷分配
潜伏 意为隐藏, 狄利克雷 是一种概率分布类型。 潜在的狄利克雷分配 意味着我们试图找到所有的概率分布,它们是隐藏的。
让我们继续我们的例子。我们有四个问题。作为人类,我们确切地知道每个问题是关于什么的。
图 7
第一个问题是关于足球,第三个问题是关于政治,第四个问题是关于政治和足球。当我们将这 4 个问题与 LDA 相匹配时,它会给我们这样的反馈:
图 8
第一个问题是话题 A 的 100%,第三个问题是话题 B 的 100%,最后一个问题是话题 A 和话题 B 的拆分,解读它们是我们人类的工作。
话题 A 中“足球”一词权重最高,其次是“NFL”,再次是“球员”。所以我们可以推断这个话题是关于体育的。
“政治”一词在 B 题中权重最高,其次是“领袖”,再次是“世界”。所以我们可以推断这个话题是关于政治的。如下图所示:
- 话题 A : 40%足球,30% NFL,10%球员……体育
- 题目 B : 30%政治,20%领袖,10%世界… 政治
然后我们回到原来的问题,下面是题目!
图 9
再深入一点,每个问题都是话题的混合,每个话题都是文字的混合。
图 10
严格来说 :
- 一个问题就是一个话题的概率分布,每个话题就是一个词的概率分布。
- LDA 所做的是,当你用所有这些问题来匹配它时,它会尽力找到最佳的主题组合和最佳的单词组合。
LDA 工作步骤 :
- 我们希望 LDA 学习每个问题中的主题组合以及每个主题中的单词组合。
- 选择我们认为在整个问题数据集中有多少个主题(例如:num_topics = 2)。
- 将每个问题中的每个单词随机分配给两个主题中的一个(例如:上述问题中的单词“足球”被随机分配给类似政治的主题 B)
- 仔细阅读每个问题中的每个单词及其主题。看看 1)该主题在问题中出现的频率,以及 2)该单词在整个主题中出现的频率。根据这些信息,给单词分配一个新的主题(例如:看起来“足球”在主题 B 中不常出现,所以单词“足球”可能应该分配给主题 A)。
- 经历多次这样的迭代。最终,这些主题将开始变得有意义,我们可以解释它们并赋予它们主题。
幸运的是,我们只需要给 LDA 输入,LDA 会为我们做所有这些脏活。
图 11
LDA 关于 983,801 个 Quora 问题
- 我们收到了 983,801 个 Quora 问题。
- 我们希望在整个问题集合中发现隐藏或潜在的主题(例如,技术、政治、科学、体育),并尝试按主题对它们进行分类。
- 选择主题数量(更多主题—更精细)
比如体育,当我们有很多话题的时候,可能会有足球(topic1)、网球(topic2)、曲棍球(topic3)等等。如果我们减少话题的数量,在某个时候,这些与体育相关的话题会自行消失,变成一个话题。像任何无监督学习一样,没有衡量标准,这个比那个好。我们基本上必须为我们自己的用例进行选择。
- 使用各种近似方案运行 LDA,使用不同的方案运行多次,以查看哪种方案最适合特定的用例。
带有 Gensim 的 LDA
我先试了一下 Gensim,有 20 个话题,还有…
图 12
一个好的主题模型很少或者没有重叠,这里绝对不是这样。让我们试试 Scikit-Learn。
带 Scikit 的 LDA 学习
vec_lda.py
图 13
我保留了 LDA 找到的每个主题中出现频率最高的前 20 个单词。这里我们展示的是部分表格:
显示 _ 主题. py
表 2
然后查看每个主题中的热门词汇,手动为每个主题分配主题。这需要一些领域的专业知识和创造力,主要是,我只是用了前 3 或 4 个词作为主题。
topic_theme.py
以下是主题-关键字分配的部分表格。
表 3
要将某个问题归类到某个特定的主题,一个合乎逻辑的方法就是看哪个主题对那个问题的贡献最大,然后分配给它。在下面的过程中,我们将在一系列的数据操作后,为每个问题分配最具主导性的主题。下面的一些代码是从这个教程中借来的。
分配 _ 主题. py
表 4
从上表中可以看出,问题 2、3 和 8 都被分配给了主题 18。让我们目测一下它们是否有意义。
图 14
我们在左边有这 3 个问题,它们被分配给右边的主题,以及该主题中的每个关键词。
我完全同意第一个和第二个问题的作业,不确定第三个问题,可能是因为“穿着谦虚”和“性格”这两个词?
做预测
更准确地说,也许我们应该说一个新问题将如何分配给这 20 个主题中的一个。
我去了 Quora.com的,取了几个流行的问题来测试我们的模型。同样,下面的代码是从这个教程中借来的。
第一个测试问题是“ 你在生活中学到的最重要的经验是什么,你是什么时候学到的 ?”
预测 _ 话题. py
图 15
我们的 LDA 模型能够找到这个新问题中的主题组合,以及每个主题中的单词组合。这个新问题已经被分配到题目中了,题目中最重要的关键词有“ 工作、学习、研究 ”等等,而这个题目的主题是“ 工作/学习/技能提升 ”。我同意。
第二个测试问题是“ 就像拉里·佩奇和谢尔盖·布林用一个更好的搜索引擎取代了他们的现任一样,两个计算机科学博士生创造一个取代谷歌的搜索引擎的可能性有多大?谷歌对这种可能性 有多脆弱?”
图 16
用同样的方法,这个新问题被分配到以“ 国家、学生、计算机、科学 ”等为顶级关键词的题目中。对于这个新问题,“计算机”和“项目”这两个词的权重最高。而题目的主题是“ 学生/互联网/计算机/科学/科研 ”。我也同意。
非负矩阵分解(NMF)
- 一系列线性代数算法,用于识别以非负矩阵表示的数据中的潜在结构。
- NMF 可以应用于主题建模,其中输入是术语-文档矩阵,通常是 TF-IDF 标准化的。
- 输入:术语-文档矩阵,主题数量。
- 输出:原始的 n 个单词乘以 k 个主题以及 m 个原始文档乘以相同的 k 个主题的两个非负矩阵。
- 基本上我们准备用线性代数进行话题建模。
如上所示,我们将术语-文档矩阵分解为两个矩阵,第一个矩阵包含每个主题和其中的术语,第二个矩阵包含每个文档和其中的主题。
再用我们的足球和政治举例:
图 17
左边是 3 个问题,右边是这 3 个问题的术语文档矩阵。我们选择 k=2 个话题。
图 18
经过分解,我们得到了两个非负矩阵,一个由 k 个主题组成,另一个由 m 个原始文档组成。
文本预处理部分与 LDA 模型相似,我只为 NMF 模型保留了名词,只是为了看看是否有什么不同。
我们可以看到,与 LDA 模型相比,每个关键词在每个主题中是如何分配的,主题是如何组织的。
nmf_topic.py
表 5
比如一个题目,通过查看每个题目中的所有关键词,除了都以“ph”开头之外,我似乎找不到彼此之间有什么关系。所以,我把“单词从 ph 开始”作为这个题目的主题。
进行预测
使用同样的问题,我们将会看到 NMF 模型如何将它分配到这 20 个主题中的一个。
问题 1:“你人生中学到的最重要的一课是什么,是什么时候学到的?”
图 19
问题 1 已分配到以“ 人生、变化、瞬间、意义、经历 ”等为顶级关键词的题目,该题目主题为“ 人生/经历/爱情/目的 ”。我同意!
问题 2:“就像拉里·佩奇和谢尔盖·布林用一个更好的搜索引擎推翻了他们的现任一样,两个计算机科学博士生创造一个推翻谷歌的搜索引擎的可能性有多大?谷歌在这种可能性面前有多脆弱?”
图 20
问题 2 已经被分配到具有类似于“ 学校、学生、学院、大学、工程 ”等顶部关键词的主题,并且该主题的主题是“ 学校/学生/学院/大学 ”。我找不到更好的方法。
这个帖子的 Jupyter 笔记本可以在这里找到,在这里找到。享受这周剩下的时光。
参考资料:
* [## LDA -如何网格搜索最佳主题模型?(带有 python 中的示例)
Python 的 Scikit Learn 提供了一个方便的接口,用于使用潜在的 Dirichlet 等算法进行主题建模。
www.machinelearningplus.com](https://www.machinelearningplus.com/nlp/topic-modeling-python-sklearn-examples/)
https://learning . oreilly . com/videos/oreilly-strata-data/9781492050681/9781492050681-video 328137
http://www.cs.columbia.edu/~blei/papers/Blei2012.pdf*
纽约时报文章评论部分的主题建模
使用潜在狄利克雷分配(LDA)和非负矩阵分解(NMF)主题建模方法
每次我读《纽约时报》的文章,我通常喜欢通读一些评论,以便对一个故事有更好的看法。然而,有时有成千上万的评论,我没有时间通读它们,我想知道主要讨论点的要点。
建立一个快速的主题建模脚本可以帮助我抓住人们在文章评论部分讨论的关键主题的要点。
注意:在本教程中,我们将使用潜在狄利克雷分配(LDA)和非负矩阵分解(NMF)方法。我不会深入解释它是如何工作的,因为有许多关于 medium 的优秀文章在讨论这个问题。严格来说,这是一个编程教程,可以帮助您快速设置主题建模代码。
步骤 1:收集意见
我将分析这篇纽约时报文章的评论部分。
我上周发表了一篇关于如何从《纽约时报》的一篇文章中收集评论的中型文章。在继续本教程之前,请先遵循该教程。
[## 如何从《纽约时报》的任何一篇文章中收集对熊猫数据框架的评论
《纽约时报》( NYT)最精彩的部分是他们对文章积极且高度节制的评论部分。
towardsdatascience.com](/how-to-collect-comments-from-any-new-york-times-article-to-a-pandas-dataframe-a595ec6a1ddf)
第二步:设置事物
#Importing Required Plugins
import pandas as pd
import numpy as np#load csv file to Pandas Dataframe
df = pd.read_csv('nyt_comments.csv', index_col = 0)
如果你按照我的教程从这个中型职位,你的数据帧应该看起来像这样。
保存 NYT 评论的数据帧示例
步骤 3:预处理文本数据。
对于主题建模,我们使用的数据类型是文本数据,它需要某种形式的预处理,以使结果更加清晰。
在预处理阶段,通常:
- 将所有单词设为小写
- 删除标点符号
- 删除停用词(and、the 等。)
- 把单词还原成它们的词根形式,这叫做词干化。
注意:我在下面的脚本中使用了 SnowballStemmer,但是你可以使用任何其他的词干分析器。
步骤 4:使用 Sklearn 的 tfidf 矢量器将我们的文本数据转换成词频逆文档矩阵
TF–IDF 值与单词在文档中出现的次数成比例增加,并由语料库中包含该单词的文档数抵消,这有助于调整某些单词通常更频繁出现的事实。——维基百科
注意:您可以在我们的 TfidfVectorizer 上将 min_df 设置为您喜欢的任何值,但是我选择了 0.05,因为它似乎对我的数据运行很有效。
步骤 5:使用 LDA 进行主题建模
LDA 模型生成的 15 个主题的输出。
在这篇文章的评论部分,我们可以清楚地发现一些有趣的话题。
然而,我想知道如果我们采用前 25 个单词而不是前 15 个,我们是否可以获得更多一点的上下文。
输出前 25 个单词的 15 个主题
就我们对各种主题的理解而言,这要好得多。
我们可以采取的另一个步骤是增加或减少我们的模型搜索的主题数量,而不仅仅是增加热门词的显示。
这就是我们需要创造性思维的地方,在分析我们模型结果的输入中。
但是,让我们快速了解一下当我们将生成的主题数量减少到 10 个时会发生什么。
LDA 模型的 10 个主题的输出。
看起来生成的主题越少,在文章评论部分区分不同主题的效果就越好。
然而,有些主题并不真正有意义,或者它告诉我们同样的事情。这可能是因为这些评论已经在讨论一篇特定的文章,可以确定的主题可能有限,并且许多相同的词被重复使用。
步骤 6:用 pyLDAvis 插件可视化 LDA 模型生成的主题
pyLDAvis 插件生成了一个交互式的图,在我看来,这让我更容易分析生成的各种主题以及我的 LDA 模型的表现。
pyLDAvis 的互动情节
第七步:用 NMF 进行主题建模
老实说,设置并没有完全不同,完全一样。但是,这个算法会吐出不同的结果。
NMF 模型的 5 个主题的输出。
进一步减少主题的数量似乎可以更好地区分评论中讨论的各种主题。
注意:不幸的是,您不能使用 pyLDAvis 插件来可视化 NMF 模型的主题。
好了,这就是你如何建立一个主题建模的快速脚本,以确定 NYT 文章评论部分的各种讨论主题。
用 BERT 进行主题建模
图片由作者提供。
利用 BERT 和 TF-IDF 创建易于解释的主题。
当一个产品负责人来找我做一些基于 NLP 的分析时,我通常会被问到以下问题:
“在这些文档中可以经常找到哪个主题?”
由于没有任何类别或标签,我被迫寻找无监督的技术来提取这些主题,即主题建模。
虽然主题模型如 LDA 和 NMF 已经被证明是很好的起点,但我总是觉得通过超参数调整来创建有意义的主题需要相当大的努力。
此外,我想使用基于 transformer 的模型,如 BERT ,因为它们在过去几年的各种 NLP 任务中显示了惊人的结果。预训练模型特别有用,因为它们应该包含更准确的单词和句子的表示。
几周前,我看到了这个名为 Top2Vec *的伟大项目,它利用文档和单词嵌入来创建易于解释的主题。我开始查看代码来概括 Top2Vec,以便它可以用于预先训练的 transformer 模型。
Doc2Vec 的最大优点是,得到的文档和单词嵌入共同嵌入在同一个空间中,这使得文档嵌入可以由邻近的单词嵌入来表示。不幸的是,这被证明是困难的,因为 BERT 嵌入是基于令牌的,不一定占用相同的空间**。
相反,我决定想出一个不同的算法,可以使用伯特和🤗变压器嵌入。结果是 BERTopic,一种使用最先进的嵌入技术生成主题的算法。
这篇文章的主题不是 BERTopic 的使用,而是一个关于如何使用 BERT 创建你自己的主题模型的教程。
论文 *:安杰洛夫 D. (2020)。 Top2Vec:主题的分布式表示。 arXiv 预印本 arXiv:2008.09470 。
注意* *:虽然你可以让它们占据相同的空间,但是由于 BERT 的上下文特性,单词嵌入的结果大小相当大。此外,生成的句子或文档嵌入有可能会降低质量。
1.数据和数据包
对于这个例子,我们使用著名的20 Newsgroups
数据集,它包含大约 18000 篇关于 20 个主题的新闻组帖子。使用 Scikit-Learn,我们可以快速下载和准备数据:
如果你想加速训练,你可以选择子集train
,因为它会减少你提取的文章数量。
注意:如果你想在段落层次而不是在整个文档上应用主题建模,我建议在创建嵌入之前分割你的数据。
2.嵌入
我们要做的第一步是将文档转换成数字数据。我们使用 BERT 来实现这个目的,因为它基于单词的上下文提取不同的嵌入。不仅如此,还有许多预训练的模型可供使用。
如何为文档生成 BERT 嵌入取决于您。然而,我更喜欢使用sentence-transformers
包,因为最终的嵌入已经证明是高质量的,并且通常对于文档级的嵌入工作得很好。
在生成文档嵌入之前,用pip install sentence-transformers
安装包。如果你在安装这个包时遇到问题,那么首先安装 Pytorch 是值得的。
然后,运行以下代码将文档转换为 512 维向量:
我们使用 Distilbert ,因为它在速度和性能之间提供了一个很好的平衡。包装中有几款多语言型号供您使用。
注意:由于 transformer 型号有令牌限制,您在输入大型文档时可能会遇到一些错误。在这种情况下,您可以考虑将文档分成段落。
3.使聚集
我们希望确保具有相似主题的文档被聚集在一起,以便我们可以在这些集群中找到主题。在这样做之前,我们首先需要降低嵌入的维数,因为许多聚类算法处理高维数据的能力很差。
UMAP
在为数不多的降维算法中, UMAP 可以说是性能最好的,因为它在较低的维度中保留了高维局部结构的重要部分。
在我们降低文档嵌入的维度之前,安装带有pip install umap-learn
的包。我们将维数减少到 5,同时保持局部邻域的大小为 15。您可以使用这些值来优化您的主题创建。请注意,过低的维度会导致信息丢失,而过高的维度会导致较差的聚类结果。
HDBSAN
在将文档嵌入的维数减少到 5 后,我们可以用 HDBSCAN 对文档进行聚类。HDBSCAN 是一种基于密度的算法,非常适合 UMAP,因为 UMAP 即使在低维空间中也保留了大量的局部结构。此外,HDBSCAN 不会将数据点强制归类,因为它认为它们是异常值。
用pip install hdbscan
安装软件包,然后创建集群:
太好了!我们现在已经将相似的文档聚集在一起,这些文档应该代表它们所包含的主题。为了可视化得到的聚类,我们可以进一步将维数减少到 2,并将异常值可视化为灰点:
通过将判决嵌入减少到二维空间来可视化主题。图片由作者提供。
由于生成的主题数量众多(约 55 个),很难直观显示各个集群。然而,我们可以看到,即使在二维空间中,一些局部结构仍然存在。
注意:如果你使用的聚类算法可以处理高维数据,比如基于余弦的 k-Means,你可以跳过降维步骤。
4.话题创作
我们想从我们生成的聚类中知道的是,是什么使一个聚类基于它们的内容而不同于另一个?
我们如何从集群文档中获取主题?
为了解决这个问题,我想到了 TF-IDF 的一个基于类的变体( c-TF-IDF ),它允许我提取每组文档与其他文档相比的独特之处。
该方法背后的直觉如下。当您像往常一样对一组文档应用 TF-IDF 时,您基本上是在比较文档之间单词的重要性。
如果我们将单个类别(例如,一个集群)中的所有文档视为单个文档然后应用 TF-IDF 会怎么样?每个类别的结果将是一个非常长的文档,并且产生的 TF-IDF 分数将展示主题中的重要单词。
c-TF-IDF
为了创建这个基于类的 TF-IDF 分数,我们需要首先为每个文档集群创建一个文档:
然后,我们应用基于类的 TF-IDF:
基于类的 TF-IDF,通过连接类内的文档来实现。图片由作者提供。
其中为每个类别**i**
提取每个单词**t**
的频率并除以单词总数**w**
。这个动作可以看作是对课堂上常用词的一种正则化形式。接下来,未连接的文档总数**m**
除以所有类别中单词**t**
的总频率**n**
。
现在,我们对一个聚类中的每个单词都有一个单独的重要性值,它可以用来创建主题。如果我们在每个聚类中取前 10 个最重要的单词,那么我们将得到一个聚类的良好表示,从而得到一个主题。
主题表征
为了创建主题表示,我们根据每个主题的 c-TF-IDF 得分,选取前 20 个单词。分数越高,越能代表其主题,因为分数是信息密度的代表。
我们可以使用topic_sizes
来查看某些主题出现的频率:
图片由作者提供。
主题名-1
指的是没有分配任何主题的所有文档。HDBSCAN 的优点在于,并非所有文档都被强制指向某个集群。如果找不到聚类,那么它就是一个离群值。
我们可以看到,主题 7、43、12 和 41 是我们可以创建的最大集群。要查看属于这些主题的单词,我们可以简单地使用字典top_n_words
来访问这些主题:
图片由作者提供。
看看最大的四个主题,我会说这些似乎很好地代表了容易解释的主题!
我可以把体育、计算机、太空和宗教看作是从数据中提取出来的清晰的主题。
5.话题缩减
根据数据集的不同,您可能会获得数百个已创建的主题!您可以调整 HDBSCAN 的参数,以便通过其min_cluster_size
参数获得更少的主题,但是它不允许您指定集群的确切数量。
Top2Vec 使用的一个巧妙技巧是通过合并彼此最相似的主题向量来减少主题的数量。
我们可以使用类似的技术,通过比较主题间的 c-TF-IDF 向量,合并最相似的向量,最后重新计算c-TF-IDF 向量来更新我们主题的表示:
上面,我们把最不常见的话题和最相似的话题合并。通过重复这 19 次,我们将主题数量从 56 减少到 36 !
注:我们可以跳过这条流水线的重算部分,以加快话题缩减步骤。然而,重新计算 c-TF-IDF 向量更准确,因为这将更好地表示新生成的主题内容。你可以尝试这样做,例如,每 n 步更新一次,这样既能加快进程,又能保持良好的主题表现。
提示:您可以使用本文描述的方法(或者简单地使用 BERTopic )来创建句子级嵌入。这样做的主要优点是可以查看单个文档中主题的分布。
感谢您的阅读!
如果你像我一样,对人工智能、数据科学或心理学充满热情,请随时在 LinkedIn 上添加我,或者在 Twitter 上关注我。
本文中的所有示例和代码都可以在这里找到:
BERTopic 是一种主题建模技术,它利用 BERT 嵌入和 c-TF-IDF 来创建密集的集群,从而允许…
github.com](https://github.com/MaartenGr/BERTopic)