TowardsDataScience 博客中文翻译 2020(六百五十六)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

为 nanoHUB.org 构建一个混合推荐系统

原文:https://towardsdatascience.com/nanohub-rec-b91e1a0beb06?source=collection_archive---------23-----------------------

为访问者和贡献者定制在线教育平台推荐器原型的案例研究

本文记录了我在 洞察数据科学 担任研究员期间(1 月-3 月)项目的构思、思考过程和结果。2020).

背景

nanoHUB.org(www.nanohub.org)是一个纳米技术教育/研究的在线平台。该网站的年访问量超过 140 万,是最大、最活跃的纳米技术在线社区之一。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图一:nanoHUB.org 主页(2020/2/10 快照)

“我们的使命是通过以用户为中心的科学工程来加速创新。我们的愿景是让科学工程产品对学习者、教育工作者、研究人员和商业人士来说是可用的、可发现的、可复制的和易于创造的。”—nanoHUB.org 使命宣言,https://nanohub.org/about

当深入研究这 140 万访问者的用户行为时,我对高流失率感到惊讶。如下图所示,大约 73%的访问者在离开网站前只访问了一个项目。换句话说,跳出率很高,这不是一个好消息。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 2:2004 年至 2020 年数据的访客跳出率。

此外,这些反弹并不都发生在主页上,而是分散在整个网站的各个项目中。大多数流量来自搜索引擎——例如,当一名学生在谷歌上搜索一个纳米技术术语时,可能会出现几个 nanoHUB 项目。因此,这不是主页设计的 UX 问题,而是访问者在查看一个项目后失去兴趣的普遍问题。

“消费者研究表明,典型的网络会员在做出选择大约 60 至 90 秒后会失去兴趣……”卡洛斯·戈麦斯·乌里韦和尼尔·亨特。2016.网飞推荐系统:算法、商业价值和创新。ACM Trans 管理。Inf。系统。6、4、第十三条(2016 年 12 月),DOI:https://DOI . org/10.1145/2843948

推荐系统的主要目标是通过将相关商品放在点击可及的范围内来吸引访问者,看起来这正是 nanoHUB 所需要的。

提高访客留存率有利于 nanoHUB 的商业模式。作为一个内容依赖于社区贡献者自愿贡献的在线平台,贡献者群体与访问者群体相比同样重要。所以在设计推荐人制度的时候,不能忘记投稿人的利益。

一般来说,贡献者希望他们的内容被使用和认可。新内容尤其难以吸引注意力。如果一个推荐系统建立的不小心,那么受欢迎的项目会获得更多的推荐流量,在推荐系统中这个所谓的“富人越来越富”的问题上变得更加受欢迎(详见下面 Baptiste Rocca 的精彩文章)。显然,在设计有效的推荐系统时,还必须考虑贡献者的利益,即公平地重新分配推荐者流量,以推广新的和未充分使用的项目。

[## 推荐系统简介

几种主要推荐算法综述。

towardsdatascience.com](/introduction-to-recommender-systems-6c66cf15ada)

最后,与贡献者的兴趣相似,nanoHUB 的商业模式更喜欢推广一种特殊的项目——在线模拟工具(https://nanohub.org/resources/tools)。这些工具是 nanoHUB 的明星产品,具有长期的商业重要性和影响。只要有可能,我想把它们推荐给用户来推广它们。

业务 KPI

综上所述,本项目追求三个业务 KPI:
1 .推荐器有效性:该 KPI 可以基于 ML 模型的准确性进行评估。
2。覆盖率:这个 KPI 被定义为推荐者流量覆盖项目的均匀程度。
3。特殊产品促销:该 KPI 定义为特殊种类物品——模拟工具——的预期流量增加量。

我想花点时间来回答这个问题“人为地保持所有项目的覆盖范围一致真的公平吗?”在我看来,不是的。项目的质量当然各不相同,高质量的内容自然会吸引更多的访问者。人为地保持所有项目接收相同的流量将冲淡用户观看的内容质量。因此,从长远来看,这样做会损害业务。然而,策略是最初提供统一的覆盖作为起点,低质量的内容将获得低评级。在未来的某一点上,项目的评级将成为推荐系统的一个特征,并且覆盖范围将根据项目的评级进行相应的调整。这超出了为期 3 周的洞察项目的范围,将在下一阶段实施。

数据准备和设置

为了建立推荐系统,需要访问者-项目交互数据。这些数据告诉我们哪个访问者在什么时间查看了哪个项目。由于 nanoHUB 不需要注册就可以查看除模拟工具之外的项目,所以我不能依靠注册用户的网络数据来形成训练集。这样形成的数据集是不完整的,并且严重偏向模拟工具,因为访问者需要注册和登录才能使用模拟工具。此外,网络 cookie 的使用是最近为 nanoHUB 添加的,仍处于实验阶段,所以我不能依赖 cookie 来形成用户活动会话。因此,需要一种特别的方法。

为了简单起见,我决定使用 nanoHUB OLAP 数据库中的 web 日志表。这个 web 日志表是原始 Apache web 日志的过滤版本,由跨越 17 年的 4 亿行组成。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3:数据清理过程和访问者会话形成的总结。

在检查了 web 日志之后,我意识到在这个数据清理过程中有两个挑战。如何有效聚合日志形成用户会话?
2。移除 bot/crawler 流量

用户会话被定义为访问者连续活动的一部分。比如 IP 123.456.789.11 在特定时间访问了 A 项、B 项、C 项。这些形成了构建推荐系统所需的用户-项目交互矩阵。具有少于 2 个项目的任何会话对于形成用户-项目交互矩阵是无用的,因此被移除。为了防止共享相同 IP 地址的两个访问者的错误加入(这种情况可能发生在例如大学实验室中),当 IP 地址在 12 小时后变为非活动时,会话结束。

为了处理大量数据,SQLAlchemy 用于将数据从 OLAP 数据库虹吸到本地 HPC 环境中,Spark 用于将日志映射到会话中。在具有 20 个核心和 64 GB RAM 的单个节点下,这个 mapreduce 过程可以在 8 小时内完成。

数据探索过程中的一个观察结果是发现了剩余的 bot/crawler 流量。SQL 中过滤后的 web 日志应该会删除所有 bot/crawler 流量。然而,发现事实并非如此。从原始的 Apache web 日志到 SQL,这个过程主要依赖于 bot/crawler 的自我识别。例如,来自 Bing bot 和 Knowledge AI 的两个日志如下图所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 4:(左上)一个可疑机器人从主页爬行的网络日志。(右)可疑机器人的访问次数与在每个页面上花费的秒数。显然,在 2300 页上花 1 秒钟很可能是非人类行为。(左下)来自 Bing 和 Knowledge AI 的自识别爬虫流量。

并非所有的机器人/爬虫都能自我识别。在上图中,检测到一个可疑 bot 行为的实例,显示从主页开始的周期性(大约 1 秒)爬行行为。这种记录必须被识别和删除,因为它们是非人类的,并且使结果偏向网络图的连通性。部署了两种策略来对抗这些非自我识别的机器人/爬虫:1 .基于聚类的僵尸检测技术;2 .使用用户项目协同过滤技术。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 5:(左)散点图和(右)KDE 图,显示了已访问的项目数与活动(> 200 个已访问项目)人群的平均时间。每个点都是一个独立的 IP 地址。

为了获得可疑 bot/crawler 流量的概览,我绘制了每个 IP 地址访问的项目数与平均花费时间的关系。这些聚集的度量是 IP 地址行为的相当粗糙的表示。可以使用会话来代替,但是如果检测到某个 IP 地址有 bot/crawler 行为,它的所有会话都会被丢弃。选择这些指标也是为了避免大量的数据点。总体而言,散点图和 KDE 图中的已访问项目数与平均花费时间图如上所示,其中仅显示了已访问项目数> 100 的部分,从现在开始,我将称之为“高使用率人群”。从 KDE 图中,可以看到两个不同的高使用率人群。一个是用红色虚线标记的,圈出了平均每项花费时间低而使用率高的人群。这对应于 IP 是爬虫的高可能性。另一方面,用蓝色虚线标记的另一条曲线,圈出了显示每个项目平均花费时间高和使用率高的人群。这可能是一个正常的活跃用户。

在没有进行详细的聚类分析的情况下,我应用了一个简单的截止方法,从数据集中删除大于 200 个项目并且平均花费时间少于 40 秒的 IP。

总体而言,与总体会话相比,可疑的 bot/crawler 数量较少。此外,用户-项目协同过滤技术具有一定的防范爬虫的能力。直觉是,机器人/爬虫的行为方式类似,查看大量与 web 图形空间密切相关的项目,并且很可能集中在主页周围。这导致内容相似的大型会话。普通访客的会话要小得多,内容也多样化。在用户项目协同过滤下,当寻找与普通访问者行为相似的访问者时,机器人/爬虫因此被过滤掉。

由于 bot 检测不是这个项目的主要主题,我不会进一步复杂化这项工作,而是使用清理后的数据集(总共约 200 万个会话)来构建 nanoHUB 的推荐系统。

注意:小型数据集可能面临许多独特的挑战。我最近了解到一个有趣的项目,该项目通过 Minting 预测了加州附属住宅单元的采用,Minting 遇到了一个小数据集问题,并使用各种 ML 技术解决了该问题。

[## 甜蜜的家!

预测加州附属住宅单元的采用情况

medium.com](https://medium.com/@mintingye_43620/home-sweet-home-747df73d8808)

EDA:基础

进行基本的 EDA 是为了理解数据、获得洞察力、确认直觉和发现异常。其中包括以下:
1。每次会话查看的项目数量直方图:如图 2 所示,证实了高跳出率的用户行为。
2。跟踪已知用户以验证会话形成:我检查已知用户(包括我自己)的会话,并直观地检查活动。这些行为可以被直观地解释,并且从这种观察来看,会话被认为是准确的。
3。特性探索,会话长度:项目之间的持续时间可以解释为用户在该项目上花费的时间。这可能与用户对该项目的情感相关,因为被吸引的用户更关注该项,导致更长的会话。然而,这取决于各种因素,包括项目内容长度、假设用户没有停止另一个活动(午休、访问一些其他网站等)。).因此,该特征不包括在研究中。
4。特征探索、内容相似度:当按时间顺序(项目+下一个查看的项目)检查相邻活动时,发现内容相似度很高。这将在后面的章节中讨论,并成为提高推荐器准确性的重要特征。

EDA:覆盖率

网站流量常见的一个关键问题是“长尾”问题:很少有高访问量的热门项目,而很多访问量低的项目。这也发生在 nanoHUB 上,如图 6 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 6:(左)nanoHUB.org 项目(资源)的“长尾”。(右图)在未优化推荐流量的情况下实施标准推荐系统时,“越富越富”问题的图示。

这种“长尾”问题对 nanoHUB 的贡献者来说是不可取的,并伤害了他们贡献内容的动机,这对 nanoHUB 依赖自愿贡献者的内容来繁荣的商业模式产生了负面影响。贡献者更喜欢他们自己内容被广泛快速的曝光。“广泛”曝光是指浏览该项目的访问者数量。这是一个长期的指标,也是基于项目的优点-如果项目是低质量的,这是可以理解的,也是合理的低流量。这种基于价值的度量是项目的评级,并且由于时间限制,在推荐系统中没有实现。“快速”曝光意味着新发布的内容需要以主动的方式“推”给相关受众,而不是被动地等待被发现。通过修改覆盖范围并积极地推广未被访问的和新的项目,推荐系统可以给贡献者快速展示他们的新内容。

模型

推荐系统有多种模型,从协同过滤技术到神经网络。对于这些技术的回顾,我推荐 Pavel 的关于推荐系统的机器学习系列。为了演示基于神经网络的推荐系统如何为用户提供有效和定制的体验,我想向您介绍我的朋友 Sid Wang 博士最近的项目:commaful 的故事推荐系统。

[## 面向商业的故事推荐系统;

你读故事,我们读你

medium.com](https://medium.com/@yuwang2020/a-story-recommender-system-for-commaful-c9fd08045aaf)

对于这项工作,我选择了用户项目协作过滤技术,因为它的简单性和可解释性。此外,正如附录中所讨论的,它提供了一定程度的抵御 bot/crawler 流量的健壮性,我只是以一种非常简单和特别的方式删除了它。

用户项目协同过滤技术的基本原理如图 7 所示。为了向访问者(“A”)推荐下一个项目,只需找到最相似的访问者(“B”),并向访问者 A 推荐访问者 B 的项目。这是通过 kNN 搜索完成的,每个项目是一个特征(维度),每个用户是一个数据点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 7:用户项目协同过滤技术的图示。

整个流程如图 8 所示。大约 200 万个会话被分成 85%-15%的训练测试部分。训练数据集用于构建用于协同过滤的用户-项目交互矩阵。测试数据集从每个会话中移除 1 个项目,并等待测试。对于测试数据集中的每个会话,推荐器给出 5 个推荐项目。将这些推荐项目与延期结果进行比较,如果延期结果与 5 个推荐项目中的任何一个匹配,则得分为 1,否则为 0。最终,标准的用户项目协同过滤技术给出了大约 15%的准确率,推荐了 5 个项目。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8:采用标准用户项目协同过滤技术的推荐系统的整体流程。

不算太坏。让我们花点时间研究一下这个误差,看看这个误差是否可以减小。因此,该策略是混合推荐系统的策略。对于标准用户项目协同过滤所缺乏的各个方面,我用来自更强预测器的另一个项目替换最不相似的项目。因此,混合推荐系统应该优于标准的用户-项目协同过滤。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9:这项工作的一般策略:用来自更强预测器的另一个项目替换最不相似的项目。这就是混合推荐系统的本质。

错误减少:关联规则挖掘

关联规则挖掘,也称为购物篮分析或 apriori 算法,是一种发现项目之间关联的技术。我推荐 Surya 的文章关联规则挖掘来回顾这个概念。本质上,从用户-项目交互矩阵中,它能够说出诸如“如果访问者选择了项目 A 和 B,根据我对这种情况的观察,我非常确定项目 C 也被选择了”这样的陈述(规则)直观上,这种陈述的确定性称为“置信度”,这种规则的观察次数称为“支持度”。图 10 显示了挖掘出的强关联规则及其分布的例子。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10:(左)从训练数据集中挖掘强关联规则的例子。显示置信度和支持度(以计数为单位,而不是通常的百分比)。(右)所有挖掘出的关联规则的置信度分布显示出包含高置信度规则的递减尾部。

为什么要在用户项目协同过滤中挖掘关联规则?用户-项目协同过滤依赖于用户相似性进行推荐。另一方面,关联规则挖掘依赖于项目间的相关性来进行推荐。有了以上的理解,另一个奇怪的问题出现了:“关联规则挖掘比传统的项目-项目协同过滤有什么优势?”

事实上,关联规则挖掘和项目-项目协同过滤之间的差异很小,而且经常讨论不足。到目前为止,我发现的最好的讨论之一来自一个交叉验证的帖子这里。另外我想提供一些我的看法:
1。关联规则挖掘给出了两个直观的度量:置信度和支持度。这些度量标准,由于其直观的本质,在选择包含什么规则时是非常好的处理方法。例如,在这项工作中,我选择置信下限为 85%,支持值为 200。这直观地解释为“任何具有 85%正确率并在我的数据集中出现超过 200 次的关联规则,我将直接应用它们,而不管其他条件。”
2。关联规则挖掘对于流行项目的优势是健壮的。例如,如果项目 A & B 作为一个事实总是一起出现,但是访问者使用了项目(A,X,Y,Z)。(X,Y,Z)可以是非常受欢迎的项目,并且用户-项目或项目-项目协同过滤技术可以基于(X,Y,Z)推荐而忽略(A)。因为我们在 200 个计数上应用了支持截止,所以关联规则加强了对中等流行项目的预测。

减少错误:基于内容的建模

对我来说,在 EDA 过程中出现了一个“啊哈”时刻:如果没有有效的推荐系统,访问者如何从一个项目跳到下一个项目?无论答案是什么,都应该是一个需要考虑的重要特征。

为了发现项目之间的关联活动,我查看网络活动日志寻找答案。这一次,项目访问之间的事件掌握着线索。通过对一个月(2019/3/1–2019/4/1)的网络日志进行子采样,约 60%的关联事件是文本搜索、作者姓名 URL 点击或内容标签点击。因此,我决定使用标题文本相似性作为构建基于内容的模型的关键特征。由于时间限制,也为了避免受欢迎的作者占主导地位,作者姓名作为一个功能被放弃了——“富人越来越富”的问题,但就作者而言。由于 nanoHUB 计划对标签进行彻底检查,因此放弃了将标签作为一项功能。标签的质量也很低 nanoHUB 上的标签数量比商品总数还多,许多作者疯狂地将从“yoga”到自己名字的任何东西都贴上标签。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 11:EDA 过程中的“啊哈”时刻。游客如何从一个项目转移到下一个项目?

标准的自然语言处理过程被应用于将标题转化为可用特征的准备工作中。使用 SpaCy,停用词首先被删除,但是词干化和词条化没有被应用,因为许多词是高度技术性的。比如“隧穿”是一个物理学术语,简化为“隧道”可能不太合适。在停用词被删除后,词频被绘制出来,如图 12 中左图所示。项目标题的词频,不出所料,大多遵循 Zipf 定律。最常见的词出现违规,这些词大多是与纳米技术相关的领域关键词。换句话说,这些包含的信息很少,在将一个项目与另一个项目分开时帮助很小。

为了加快速度,我决定去掉流行的词,只保留不常用的词,但是我还需要确保不常用的词能够覆盖所有的条目。图 12 的右侧显示了项目覆盖率与应用文档频率截止的关系。通过包含仅在所有标题中出现约 1%的罕见词,几乎所有条目都可以被表示。这样做可以减少词汇量,提高计算速度。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 12:(左)去除停用词后的词频图。(右)涵盖的项目数与文档频率截止值

在将完整的标题简化为用生僻字表示的形式后,我准备分析它们的相似性。在两个标题之间,相似性被定义为(共享单词的数量)/(较短标题中的单词的数量)。这是相似性的一个相当粗略但快速的定义。

进行 t 检验:1 .训练集中每个会话中按时间顺序相邻的项目对,以及 2。来自所有标题的随机项目对。结果分布如图 13 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 13 :(左)随机配对抽样与(右)相邻配对抽样的相似性得分分布。

很明显,两个抽样分布偶然出现的零假设可以被拒绝。访问者选择的项目和下一个项目具有相似的标题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 14:在线和离线评估标题相似性的内容建模管道。左下角显示了两个相似性得分示例。

因此,从现在开始,推荐者的任务是琐碎的。给定前一个项目,推荐器在所有项目中搜索并找到一个具有最相似标题的项目。如果相似性得分高于临界值(在本工作中,相似性临界值= 0.75),则该项目被接受为推荐。否则,不进行基于内容相似性的推荐。这遵循混合推荐系统的一般策略:尝试用来自更强预测器的项目替换最不相似的项目,如果这样的预测器存在的话。

寻找具有最相似标题的项目可能是一项计算量很大的任务。例如,对于 8000 个项目的总体而言,(8000 * 8000/2–8000)=必须进行超过 3100 万次评估。这对于并行处理来说还是可以管理的,但是随着项目数量的成倍增长,这很快就会变成一项不可能完成的任务。使用这种预先生成的表的优点是速度,因为它有效地减轻了离线计算标题相似性的负担,即每周重新计算相似性表。在在线评估中,计算标题相似性的任务是即时完成的。然而,这并不意味着需要评估(1 * 8000–1)= 7999 次,因为不是与一般项目群体进行比较,而是可以将其与来自用户项目协同过滤的候选项目进行比较,这减少了所需的评估数量。在这个项目中,我选择在线评估。

注意,通过以这种方式引入基于内容的建模,解决了标准协作过滤技术的另一个弱点:缺少项目的时间顺序作为特征。事实上,访问者所访问的项目的特定顺序对于协同过滤技术没有价值,因为用户-项目交互矩阵去除了任何时间顺序和重复。事实上,访问者决定下一步要看的内容,从邻居抽样项目对中可以明显看出,在内容相似性方面是高度相关的。因此,基于内容的建模的引入解决了标准用户-项目协同过滤技术的缺点,并增强了推荐系统。

减少错误:基于规则的建模

另一个观察结果来自前面的标题相似性方面:标题相似的一个主要原因是它们中的很大一部分是讲座。图 15 显示了在测试数据集中正确和错误推荐的情况下相邻对的项目类型。讲座与讲座之间的差异是误差的重要组成部分。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 15:在测试数据集中正确和错误推荐的情况下,来自相邻对的不同类型的项目

访问者与讲座相关的行为是相当可预测的:访问者倾向于观看系列中的下一个讲座。这可以简单地通过观察相邻项目对中的项目来得出结论,这具有直观的意义。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 16:基于内容的建模管道。如果时间上的前一个项目是一个讲座,则推荐系列的下一个讲座。

为了捕捉访问者可能观看系列中的下一个讲座的趋势,我实现了检测讲座并找到系列中的下一个讲座的函数。该功能扫描所有项目,以“ABC 123 讲座 09…”的形式捕获标题,“XYZ 123:标题”等。对于讲座编号不存在的情况,例如“XYZ 123:标题”,讲座按照访问者数量降序排序。这是基于一个假设,即随着讲座系列的继续,观众的数量会减少。

覆盖范围-准确性权衡

除了提高推荐准确率,还必须满足业务 KPIs)和(3):
2。覆盖率:这个 KPI 被定义为推荐者流量覆盖项目的均匀程度。
3。特殊产品推广:该 KPI 定义为特殊种类物品——模拟工具的预期流量增加量。

如果推荐系统按原样部署,也就是说,在不考虑其他因素的情况下被调整到最大的准确性,则所得到的流量模式被标记为“之前”,如图 17 所示。图 17 中显示的每个点都是一个单独的项目。“当前流量”是该项目从网络活动日志中收到的访问者数量。然后,每个项目的“当前流量”被平均分成 5 份,并分配给 5 个推荐项目中的每一个。这是一个非常理想的情况,假设访问者会点击推荐者。这样一来,原来的流量被重新分配,被贴上了“来自推荐者的流量”的标签。显然,存在“富人越来越富”的问题——已经受欢迎的项目也从推荐者那里获得更多的重定向流量。

为了提升较少访问的项目,使用先前的替换方法,除了不是用来自更强预测器的项目替换最不相似的项目,而是现在用较少访问的项目替换它。当然,就推荐器性能而言,这个较少访问的项目将不如它所替代的项目好。希望是,通过替换 5 个推荐项目列表中最不相似的项目,准确度损失的量将很小,而覆盖增益的量将很大。换句话说,我愿意用精确度的小幅度下降来换取覆盖范围的大幅度增加。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 17:(左)推荐较少访问项目的策略。通过将每个较少访问的项目与 5 个推荐反向配对,并随后根据可见性(访问者数量/天)对它们进行排名,覆盖范围和相关性得到了平衡。(右)覆盖优化前后访客流量与推荐者重定向流量的对比。

当选择这种较少访问的项目时,必须在相关性和覆盖范围之间保持微妙的平衡。为了选择较少被访问但也相关的项目,首先基于项目的可见性对其进行排序,可见性被定义为每天的平均访问者数量。这为项目建立了一个优先级队列——当被选择推荐时,较稀有的项目将具有优先级。每个项目通过推荐系统运行,以获得 5 个最相关的项目。这是一个单项建议,如图 17 所示。为了不与主推荐者混淆,我将这个表称为“较少访问的项目推荐者列表”。当向访问者发布推荐时,从最少访问的项目开始遍历“较少访问的项目推荐者列表”,并且如果任何推荐的项目与访问者在会话日志中查看的任何项目相匹配,则选择较少访问的项目来替换推荐者列表中最不相似的项目。

由此产生的覆盖率改进如图 17 所示。在覆盖优化之前(标为“之前”),存在“富者愈富”的问题。优化后(标记为“After”),所有项目的推荐流量更加平衡,确保所有项目通过推荐系统对访问者具有良好的可见性。

另一个重要的商业指标是模拟工具的推广。为了保持管道简单,模拟工具,不管受欢迎程度如何,都被放在“较少访问的项目推荐列表”的顶部。这给了他们被选中的最高优先权。

结果

对于上面描述的所有模型例程,整个管道如图 18 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 18:整个推荐系统管道。

在引入基于规则的建模、基于内容的建模和关联规则挖掘之后,整个混合推荐系统达到了 32%的准确率,相比之下,标准协同过滤技术的初始准确率为 13%。在将最不相似的项目替换为较少访问的项目后,准确率略微损失到 29%,但覆盖率显著增加到 85%。这就是上一节提到的“精确度-覆盖率”的折衷。

关于管道的一个细节是模型的排列(用黑色标记),遵循标准的协同过滤。没有直接的比较来定量地衡量从各种技术中选取的项目之间的相似性得分。一个假设是,随后的模型是比标准的协同过滤技术更强的预测器。因此,插入总是出现在队列的开头,而移除总是在末尾。

生产实施计划

由于时间限制,推荐系统是在 Jupyter 笔记本环境中原型化的,不适合生产。然而,这并不意味着推荐系统的设计没有考虑产品。我想在这里简单地谈谈我将这个模型投入生产的计划,这是这个项目的下一阶段。

为了使其适合于生产,推荐系统是用流线型的、更简单的模型而不是计算昂贵的、高级的模型如神经网络来构建的。正如前面所讨论的,这个决定对我们的模型施加了一些限制:协同过滤不考虑事件的特定时间顺序,但是像 LSTM 和马尔可夫链模型这样的高级技术可以。访问者查看的项目已被证明在时间顺序上是相关的,这一缺失的特征可能有助于进一步提高模型的准确性。模型复杂性、可解释性和产品可部署性之间的权衡是一个重要的优化,需要进一步的工作。目前,我坚持使用不太复杂的模型,以获得更好的可解释性和可部署性。

生产的另一个重要方面是计算成本。如果建议是基于访问者的会话日志,那么这个建议是在线的,这意味着根据访问者的当前会话数据实时计算接下来的 5 个项目。这可能是一项计算量很大的任务。当我以稍微不同的方式对模型进行训练测试时,发生了一些奇怪的事情。不是使用每个访问者的完整会话日志,而是将会话分成 2 个一组的元组。例如,如果访问者以时间顺序(1,2,3,4)查看项目,则结果元组是(1,2),(2,3),(3,4)。每个元组可以被视为一个新的小型会话。测试集以相同的方式形成,并且元组中的第二项(时间上较晚的项)被保留。如果用这样的二元组训练推荐系统,得到的准确度大约是 19%。

这是一个奇怪的观察,因为它表明了访问者的项目偏好的马尔可夫属性,也就是说,访问者的下一个项目很可能依赖于并且仅依赖于之前查看的项目。访问者行为的马尔可夫性假设可以将推荐计算的负担从在线转移到离线,代价是准确率下降约 10%。如果我愿意做出这样的折衷,生产的解决方案就会变得简单得多。推荐器离线基于从 web 日志生成的访问者会话的二元组为每个项目计算 5 个项目。例如,这种刷新可以由 cron 调用,并且每周执行一次。
2。产生的推荐可以存储在 SQL 表中,主键是项目 ID,一列包含 5 个推荐的项目。
3。推荐 SQL 表可以由前端拉,并显示在现场网站。

结论

在这个项目中,一个混合推荐系统的原型是 nanoHUB.org,一个每年有超过 140 万访问者的在线教育和研究平台。混合推荐系统由用户-项目协同过滤、基于内容的模型、基于规则的模型和关联规则挖掘组成。附加模块修改最终建议,以优化覆盖范围和模拟工具推广。总体而言,推荐系统实现了 29%的准确率和 85%的覆盖率。推荐系统满足目标业务 KPI,包括推荐准确性、覆盖范围和特殊内容推广。我希望这个新功能可以增强每年 140 万用户的 nanoHUB 浏览体验,并了解更多关于纳米技术的知识!

缩小数据范围

原文:https://towardsdatascience.com/narrowing-the-data-3adeb6e04b02?source=collection_archive---------41-----------------------

缩小大型数据集范围的技术探索。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

阿什利·朱利斯在 Unsplash 上拍摄的照片

最近,我完成了一个项目,预测美国面临粮食不安全风险的社区。你可以在这里找到关于那个项目的信息,包括代码和一个 PowerPoint 演示。在那个项目中,我使用了美国农业部的政府数据集,名为 SNAP QC 数据。这些是超过 40k 条记录和 800 多个特性的大规模数据集,并附有解释特性的技术文档。我将对我如何缩小数据集进行技术分析。

什么是 QC 数据集?

美国农业部的 SNAP 程序使用“质量控制”数据。这些是质量控制数据集,这意味着它们已经以某种方式被手工挑选出来,以纳入最终的数据集。不幸的是,这些精挑细选的标准每年都在变化,尽管变化并不剧烈。由于政府数据对于这些项目来说是如此庞大,统计学家们正试图实现一些“特征”,这些特征代表了对那些参与项目的人的外部影响。对于 SNAP 参与者,大量不完整的申请被排除在外,这导致这些数据集更能代表受益者,而不是所有申请该计划的人。此外,这些数据集是加权的。这些权重是由对各州的经济影响决定的。例如,如果一个州宣布进入紧急状态,参与者的权重就会降低,以减少异常值对整个数据集的影响。

缩小数据范围:GIS

对 2007-2008 年数据的空间分析显示,与邻近县相比,这些县是异常值。这是在 ESRI 空间数据科学 MOOC 期间完成的。首先,构建了一个 2D 模型,它可以直观地显示一个县一年到下一年的变化。这是用 ESRI 的“2D 时间序列分析”工具建立的。接下来,使用他们的“新兴热点分析”工具来显示从 2007 年到 2008 年在统计上与其周围邻居有显著差异的县。

它通过“使用您提供的空间关系的概念化值来计算每个条柱的 Getis-Ord Gi*统计 ( 热点分析)来实现这一点。时空热点分析完成后,输入 NetCDF 立方体中的每个条柱都会添加相关的 z 值、p 值和热点条柱分类。接下来,使用 Mann-Kendall 趋势测试评估这些热点和冷点趋势。使用数据得到的每个位置的趋势 z 值和 p 值,以及每个条柱的热点 z 值和 p 值,新兴热点分析工具对每个研究区域位置进行分类。—摘自工具上的 ArcGIS Pro 文档

结果突出了新墨西哥州圣胡安的一个使用增加的热点。以及内布拉斯加州樱桃县的一个新兴冷点,那里的参与者减少了。由于 QC 快照数据来自州一级,无法按县过滤,我选择比较内布拉斯加州和新墨西哥州,以突出极端情况。我还想做一个 10 年的缺口分析,以反映 2008 年危机对面临粮食不安全风险的社区的影响。所以我最终得到了 4 个数据集:2007 年新墨西哥州和内布拉斯加州,2017 年新墨西哥州和内布拉斯加州。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由此产生的“新兴热点分析”图。(图片由作者提供)

缩小数据范围:高无效性

为了进一步缩小数据范围,我选择移除 100%为空的列,这意味着它们是不包含数据的要素。这些功能可能是为了在全国范围内使用而添加的,根本不符合内布拉斯加州或新墨西哥州申请人的任何用例。对于内布拉斯加州和新墨西哥州来说,这些列是不同的,从 2007 年到 2017 年,它们也是不同的列。简单地说,每个数据集中所有空值的列都被删除。

接下来,我发现了一篇名为“缺失数据的比例不应用于指导多重插补的决策”的论文,该论文讨论了高无效性的潜在概念。这篇论文得出的结论是,如果没有足够的信息来真实地表现这些特征,从这些栏目中收集的信息的完整性就会受到威胁。作者测试并得出结论,数据的价值比缺失的信息量更重要。因此,我决定将这些数据集中的高空性定义为超过 50%的记录被标记为空值的列。我做出这个假设是基于这样一个事实,即我在每个数据集中有大量的记录,这些记录至少有 50%或更多的数据是原始的。然后我删除了那些高无效列。

最后,在使用预测模型之前,我必须考虑数据集中剩余的空值。因此,我使用 sklearn 的简单估算器来输入其余值的平均值。使用平均值是因为一旦去除了高无效性特征,它是原始数据的合理表示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

移除高 nullity 值的列后剩余的列数。(图片由作者提供)

缩小数据范围:相关性

我选择将我的模型作为监督模型运行,目标变量为“猫 _ELIG”。这是一个将每个应用程序标记为“是”或“否”的字段,表示它们有资格获得 SNAP 优势。这在 2007 年还好,但在 2017 年,内布拉斯加州和新墨西哥州的所有申请都被接受。因此,与目标变量的相关性仅在使用 2007 年数据集时有效。为了进一步增加相关性的维度,我可以使用 PCA(主成分分析)来运行 2017 年的数据,PCA 最适合推断无监督数据之间的相关性(这意味着不定义目标变量,因为所有应用程序在 2017 年对“CAT_ELIG”都标记为“是”)。不过,我在这里的目的是在 2007 年,即最初的 GIS 热点分析年,找到统计上显著的相关性,并看看它们在 2017 年如何变化。

技术文件包括 6 个观察部分。我的最终数据集是每个部分的前 5 个相关特征,作为最终的列集。每个数据集都有非常相似的前 5 个相关要素,从新墨西哥州到内布拉斯加州只有一些差异。最终结果是 32 个特性+目标列。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 2007 年新墨西哥州数据集的每个类别的前 5 个相关性的示例。(图片由作者提供)

缩小数据:型号

对于这一分析,我想要一个可解释的模型,以便更准确地描述是什么影响了粮食不安全。由于高度多重共线性的内在可能性,我需要在最终模型中降低这种风险。一篇名为“支持向量机与随机森林用于遥感图像分类:元分析和系统综述的论文讨论了 SVM 自 70 年代以来一直存在,是机器学习的真正进步,但它受到相关特征的高度影响。然而,兰登森林在一些情况下胜过了 SVM。由于随机森林使用 bootstrap 和要素采样,因此它可以同时处理行和列级别的数据集,从而大大降低多重共线性对结果的影响。最终,我选择了 Random Forest 来:

  1. 帮助缓冲与其他功能相关的功能的影响。
  2. 这给了我一个更高的精度和更少的超参数调整,从而通过不使其成为“黑盒”模型来增加其系数的可解释性。

最终找到正确模型的一个好方法是对数据进行几次初始测试,并比较分数。这可以告诉你哪些数据处理得很好。在测试和训练集上比较交叉验证的分数,以查看数据中有多少差异。对于这个项目来说,重要的是在正面预测方面出错,不管它们是否正确。这是因为,低估有需要的领域比担心被标记为需要更多支持但并不需要支持的领域更危险。因此,回忆被用来显示做出了多少正面预测,而精确则显示了多少正面预测是正确的。数字越接近,预测模型就越准确。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片作者。

我使用带有随机森林、梯度推进和 Bagging 分类器的投票分类器来给出 95%的交叉验证分数。

  • 出于上面给出的原因,我使用了随机森林。
  • 通过平衡正精度来提高精度的梯度增强。
  • 和精度分数的 bagging 分类器。

最后的想法

每个项目都是独一无二的。虽然在这种情况下选择可解释的模型减少了可以设置的超参数,但这使得特征选择成为提高准确性的少数方法之一。数据科学家是数据将讲述什么故事的最终决定者。有很多方法可以微调我用来缩小数据的步骤,但缩小特征的数量是至关重要的,因为高方差对准确性和解释非常不利。最终,数据科学家必须根据数据和手头项目的最佳表现做出决策。

使用贝叶斯状态空间模型的预测

原文:https://towardsdatascience.com/natural-gas-price-prediction-using-bayesian-state-space-model-for-time-series-forecasting-f630dda1c808?source=collection_archive---------14-----------------------

基于单变量时间序列的价格预测

随机和季节性时间序列预测

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

ime 序列观测值被假定为线性依赖于一个未被观测的状态向量,该状态向量是由状态空间分析中的随机动态过程产生的。进一步假设观测值受测量误差的影响,并且与状态向量无关。因此,构成状态空间模型的两个主要部分是观察到的数据和未观察到的状态。

时间序列由随机过程(Yt;t = 1,2,.。。),即由索引为 t(时间)的随机向量的有序序列。为简单起见,我们将考虑等距的时间点(每日数据、每月数据等等)。目标是预测下一个观测值[yn+1]的值,该值具有直到时间 n 的观测数据,(y1 = y1,.。。,yn)]。

数据加载和可视化:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

barChart(NG)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这一系列看起来显然是非平稳的,实际上是非常不规则和不稳定的。从 2007 年至今,该数据处于日常水平。我们可以看到,在 2008/2009 年期间,价格从近 20 美元大幅下跌至近 1 美元,然后在 2010/2011 年期间上涨至约 15 美元;然而,一个高度动荡的状态,因为可以看到所有的日期和最后的价格记录为 8.61 美元。

  • 从这个时间序列中我们可以看出,价格肯定有一些季节性变化;每年冬天都有一个高峰,几乎每年冬天都有一个低谷的转折点。
  • 同样,这似乎可以用一个加法模型来描述,因为季节性波动的大小在一段时间内大致恒定,似乎不取决于时间序列的水平,而随机波动似乎在一段时间内恒定。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们将进行单变量分析;因此,让我们从数据集中提取每月的“接近”价格。月度数据是为了便于计算。根据可用的计算能力,可以每小时、每天或每周采集数据。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

后续数据处理对于将数据转换为数据框架和进一步的时间序列以供未来分析非常重要。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这里,我们的数据集现在已被处理,我们准备好执行进一步的分析。

概率分布:

大多数统计模型依赖于正态分布,这种分布是对称的,具有典型的钟形。概率分布通常(不完全)用图表来表示,图表的横轴表示变量的可能值,纵轴表示发生的概率。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上面包括密度和正态 Q-Q 图的分布图清楚地表明,数据分布不是正态的,反映了非高斯特征。

平稳性测试:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上述平稳性测试的输出显示了数据的非平稳特征。

标准化:

由于随机行为的值,我们将股票预测场景中的数据规范化。这里,不建议最小-最大归一化,因为股票值不限于某个价格范围;价格具有布朗运动,可以剧烈变化。因此,建议用初等标准化函数来标准化股票价格:

z =(X-平均值(X))/标准差(X)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们在这里看到:

  • 稳定信号几乎没有超过 ACF CI 的滞后。
  • 这种趋势导致几乎所有的滞后都超过了置信区间。

因此,可以断定 ACF 信号是平稳的。但是,趋势信号不是静止的。平稳序列在平均水平附近具有更好的方差,峰值是原始序列中干预的证据。我们将进一步分解时间序列,包括水平、趋势、季节性和噪声成分的组合。分解有助于在分析和预测过程中更好地理解问题。

分解:

分解一个时间序列意味着把它分成它的组成部分,这些组成部分通常是一个趋势部分和一个随机部分,如果数据是季节性的,则是一个季节性部分。

分解非季节性数据:

非季节性时间序列由趋势成分和随机成分组成。分解时间序列包括试图将时间序列分成这些单独的部分。一个季节性时间序列,除了趋势和随机成分外,还具有季节性成分。分解季节性时间序列意味着将时间序列分成这三个部分。让我们估计天然气 ts 的趋势、季节性和随机成分。

plot(decompose(df1), yax.flip=TRUE) # Decompose time-series

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上面的图清楚地显示了趋势是不稳定的,我们可以从标准化部分的趋势信号图中看到这一点。季节性因素每年都存在一小段时间,最有可能是在冬季。总的来说,随着随机游走,价格波动很大。

单变量线性高斯状态空间模型的滤波、平滑和预测

不幸的是,状态空间模型没有普遍接受的符号。然而,在统计学和计量经济学应用中最常用的符号可以在 Harrison & Stevens (1976)和 West & Harrison (1997)的工作中找到。贝叶斯分析的主要焦点是未知参数的最大似然估计。我们将从一个局部模型开始介绍这种方法。

我们将使用一个基本水平模型进行预测,然后使用 ARIMA 和动态线性模型来比较预测结果。

状态空间模型:

状态空间模型基于这样的想法,即时间序列(Yt)是一些潜在的不可观测过程(θt,t = 1,2,.。。),称为状态过程。

结构时间序列:

状态空间框架促进了时间序列分析的结构方法。在这种方法中,不同的未观察到的成分负责系列的动态。这些是趋势变量、季节性变量、周期变量,解释变量和干预变量的影响在被放入状态空间模型之前被分别识别。让我们理解局部水平模型的数学直觉。

时间序列通常被认为是一组按时间顺序排列的观察值 y1,…,yn。这里,表示时间序列的基本模型是加法模型。该公式可以写成:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • μt 是一个缓慢变化的分量,称为趋势;
  • ϒt 是固定周期的周期性成分,称为季节性;
  • εt 是随机噪声或称为误差的不规则分量;

为了开发合适的模型以及μt 和ϒt,我们需要随机游动的概念。我们可以考虑一个简单形式的模型,其中μt = αt,其中αt 是随机游走,不存在季节性,所有随机变量都是正态分布。我们假设εt 具有恒定方差σ2ε。这给出了模型:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于 t = 1,……,n,其中εt 和ηt 相互独立,独立于α1。有两个参数,σ2η。这是一个 ARIMA(0,1,1)模型,但对参数集有限制。这被称为局部水平模型,为我们的分析提供了基础。它展示了状态空间模型的特征结构,其中有一系列不可观测值α1,…,αn,它们是状态,代表所研究系统随时间的发展以及一组观察值 y1,…,yn,它们通过状态空间模型与αt 相关。这适用于经典分析和贝叶斯分析。在εt 和ηt 不是正态分布的情况下,我们从最小方差线性无偏估计的角度得到了等价的结果。

最初我们假设,α1 ~ N(α1,P1),其中α1 和 P1 已知,σ2ε和σ2η已知。因为随机行走是非平稳的,所以模型是非平稳的,并且随机变量 yt 和αt 的分布依赖于时间 t。

局部线性趋势模型,type = "trend ",具有相同的测量方程,但是在动态中具有时变斜率。基本结构模型 type = "BSM ",是一个带有额外季节性成分的局部趋势模型。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Call:
StructTS(x = df1, type = "level")

Variances:
  level  epsilon  
   1.26     0.00

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

线性高斯状态空间模型中的所有显著性检验(以及置信区间的构建)都基于关于分析残差的假设。残差应该满足独立性、同方差性和正态性。残差的独立性和正态性可以使用 Box-Ljung 检验统计量进行诊断。可以通过检验标准化预测误差的方差来检查同方差性。

结构时间序列的预测;

下图显示了 12 个月的预测收盘价数据,以及 50%和 90%的概率区间。

plot(forecast::forecast(fit_level, level = c(50, 90), h = 12), xlim = c(2016, 2021))

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

预测输出(结构局部水平):

pred <- predict(fit_level, n.ahead = 12)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ARIMA 模式:

自回归综合移动平均(ARIMA)模型可以转化为状态空间形式。

在 auto 中,arima 能够决定是否使用季节性 arima (SARIMA)模型。

auto.arima(df1, trace = T, stepwise = F, approximation = F)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

# Arima 
arima <- Arima(df1, order = c(0,1,0))
checkresiduals(arima)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以从第一个和最后一个图中看到,残差似乎不是白噪声。ACF 图显示残差之间不存在显著的相关性。

# Forecast of 12 months
pred_arima <- forecast::forecast(arima, h=12)
plot(pred_arima)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

预测产量(ARIMA):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这种预测类似于结构时间序列。然而,我们将在下一节进一步检查动态线性模型。

动态线性模型(DLM):

动态线性模型是状态空间模型的特殊情况,其中状态和观察分量的误差是正态分布的。DLM 可以用两个方程来表示

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里,Gt 和 Ft 是已知的矩阵,而(vt)和(wt)是两个独立的白噪声序列(即,它们是独立的,在它们之间和它们的每一个内),分别具有均值为零和已知的协方差矩阵 Vt 和 Wt。

单变量时间序列(Yt,t = 1,2,.。。)是所谓的随机游走加噪声模型,定义如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

具有任意功能 gt 和 ht,更加灵活。误差序列(vt)和(wt)是独立的。线性状态空间模型将 gt 和 ht 指定为线性函数,而高斯线性模型添加了高斯分布的假设。

随机水平和确定性季节性:

多项式 DLM(局部水平模型是一阶多项式 DLM),局部线性趋势是二阶多项式 DLM)。你可以在这里 找到更多 dlm 型号 的细节。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

自变量 dV 和 dW 分别用于指定观测和演化协方差矩阵的对角线。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

卡尔曼滤波器:

卡尔曼滤波器的主要目的是仅考虑观测值{y1,y2,.。。,yt1 }。因此,预测状态及其相关估计的关键属性是它们仅基于序列的历史值。过滤的目的是在每次引入新的观察值 yt 时更新我们对系统的了解。

# applying kalman filter
model_filter <- dlmFilter(df1, modelfit)
plot(residuals(model_filter, sd = FALSE), type = “o”, ylab = “Standardized prediction error”)
abline(h = 0)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

卡尔曼平滑器:

卡尔曼平滑器允许计算θt|DT 的密度,从 T = t1 开始,在这种情况下,θT|DT ~ N(sT = mT,ST = CT),然后向后计算 T = T2、T = T3 等情况下的θT|DT 的密度。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

随机水平和确定性季节模型的随机水平及其 90%置信区间:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

预测产量(DLM):

*forecast$f*

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这里,我们可以从上面的图中看到,该模型已经能够很好地捕捉趋势。经过过滤和平滑的线条在序列中一起移动,彼此没有太大差异。未来 12 个月的预测系列线是从原始系列结束的地方选取的

如果我们比较三种预测结果,我们发现,DLM 模型能够更好地捕捉趋势。

结论:

类似的方法可以用于分析和预测单变量和多变量时间序列。这里,结构时间序列计算基本结构模型的方差参数和状态向量的滤波均值的最大似然估计,即由随机游走加噪声组成的常数 DLM,局部线性趋势。为了保持一致性,我们在所有三个模型中使用了相同的数据集。有趣的是,ARIMA &结构模型不能像 dlm 模型那样提取季节性成分。在 dlm 建模的情况下,我们没有考虑季节因素。但是,为了更好地预测,也可以添加季节性因素。

DLM 是一个相当有趣的软件包,我想在未来进一步使用它进行多变量分析。

我可以到达 这里

注意:此处描述的程序是实验性的,应谨慎使用。所有此类使用风险自负。

参考文献:

  1. Petris,g .,Petrone,S., & Campagnoli,P. (2009 年)。动态线性模型。在带 R 的动态线性模型中(第 31-84 页)。纽约州纽约市斯普林格。
  2. 乔瓦尼·佩特里斯(2010 年)。动态线性模型的 R 包。统计软件杂志,36(12),1–16。
  3. 德宾 J,库普曼 SJ (2001 年)。用状态空间方法进行时间序列分析。牛津大学出版社,牛津。
  4. 哈里森 PJ,史蒂文斯 CF (1976)。“贝叶斯预测。”皇家统计学会杂志 B,38,205–247。

基于人工神经网络的天然气现货价格预测

原文:https://towardsdatascience.com/natural-gas-spot-price-prediction-using-artificial-neural-network-56da369b2346?source=collection_archive---------21-----------------------

基本面分析的明确指南&时间序列价格预测

使用门控循环单元(GRU)架构的多变量案例研究

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

P 天然气价格的预测因为与原油的关联变得越来越重要。包括天然气价格在内的能源商品波动剧烈,具有高风险和不确定性。在这里,我们将研究天然气现货价格和其他变量,如气象数据、经济数据等。与气候相关的数据,包括生产相关数据、消费相关数据和温度相关数据。

数据集结合了亨利中心和 WTI 历史现货价格的月度数据以及其他相关因素( 46 个变量,不包括亨利中心和 WTI )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

问题描述

尽管我们都知道这样一个事实,冬季期间的天然气消耗量历来很高,这导致市场价格上涨。然而,市场并不按照我们预期的方式运行;问题是,与普遍的看法相反,几乎全年的价格都有显著的偏差。

为了解决上述问题,我们将使用机器学习算法来检验我们是否可以通过添加可能对天然气价格产生外部直接或间接影响的不同参数来预测未来价格。我们将尝试开发一个预测模型,根据历史价格预测天然气的现货价格。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

滞后散点图可用于检查自相关性;x 轴上的数据(t)与 y 轴上的上月数据 “t-1/t-2/t-3/t-4” 。带有大圆点的对角线清楚地显示了一种关系或某种相关性。这里也可以看到中间缺少的值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以看到,序列中存在一些模式,并且序列是自相关的。滞后 1 显示数据大多集中且高度相关。然而,我们将用自相关图进一步验证这一点。空白是因为数据中缺少值。

下面,我们添加了另一个变量,即月度回报百分比变化,这使数据正常化,但巨大的波动仍然显示了亨利中心现货价格(HH)的高波动性和随机性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们回顾一下 HH 时间序列在其滞后版本之间的相互关系。在下图中,蓝色阴影区域是 95%的置信区间。我们可以看到几个滞后到 10 个月。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里,我们假设当前值依赖于它以前的值,有一些滞后。为了找到可以用来预测未来价格的最大滞后,我们查看部分自相关图,并确定大多数滞后不显著之后的滞后。这里,我们从 pacf 中看到,1 个月后有一个大的峰值,这可以用作未来预测的回顾期。

理想情况下,我们应该尝试一些不同的滞后组合

  1. 根据某种信息标准(AIC 或 BIC)选择其中的最佳者
  2. 基于它们的可能性、信息标准等对模型进行加权。

我们的数据集有很多缺失值。因此,我们创建了一个函数,用以前的值来填充丢失的值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

统计分析

让我们研究一下时间序列分布。从下面的直方图和 Jarque-Bera 正态性检验表明,价格时间序列不是正态分布的。然而,对数价格遵循高斯分布。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所以,我们可以先假设正态分布为变量的差和或天然气价格的对数。

差异通货膨胀系数(VIF)

很难从下面的相关性皮尔逊相关图中识别变量并做出任何假设。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

除了相关图之外,为了确定在回归分析中导致标准误差的变量,我们使用了一个易于理解的指标(方差膨胀因子)。因此,这有助于检测数据集中的多重共线性。大 VIF (> 5)意味着存在显著的多重共线性,理想情况下,我们应该从回归分析中删除这些变量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于一些变量,我们的 VIF 系数大于 5,甚至更高。所有上述分析表明,使用神经网络将是一个理想的选择,也表明,理论上我们可以使用一个高自相关滞后(1)来开发一个神经网络模型。

LSTMs 在涉及自相关的时间序列预测任务中非常有用,因为它们能够在时间序列的长度上保持状态和识别模式。递归架构使得状态能够持续,或者随着每个时期的进展在权重的更新之间通信。

单变量和多变量

价格预测可以是单变量或多变量模型。

  1. 单变量模型试图通过目标变量本身及其滞后来模拟现象。在此模型中,假设所有原因都反映在价格中,则不考虑可能影响因变量行为的其他变量。
  2. 具有不同相关变量并可能影响相关价格变量的多变量模型称为外生变量。这些变量可能会根据不同的情况(如经济、社会、政治或环境)影响因变量的行为。这类模型需要预测未来的关联变量,以便预测目标变量。

这里,我们将研究使用 GRU 网络架构的第二种模型。GRU 控制信息流,而不需要使用存储单元。它相对较新,计算效率更高,结构不太复杂。

训练/测试分割

值序列对于时间序列数据至关重要。因此,我们使用如下的系统方法将训练和测试中的数据分开。此外,需要标准化来拟合用于神经网络架构学习的数据。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为神经网络准备数据

我们将准备 X_train,y_train,回看选项为 1,如前面的 acf/pacf 图所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GRU 网络架构

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

准备测试数据

一旦模型适合训练数据,我们希望看到模型在样本外数据上的技巧。与我们在训练集中所做的一样,我们将准备测试集,并且我们需要从训练数据中提取回望值。回看是用作输入变量的先前时间步长的数量,以预测下一个时间段*(本例中为 1)。*

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

诊断图

该算法的目标是在过拟合和欠拟合模型之间找到一个位置。一个好的拟合是由一个训练和验证损失确定的,该损失减少到一个稳定点,在两个最终损失值之间有一个最小的差距。你可以阅读这里了解更多关于诊断情节。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

训练数据集的模型损失几乎总是低于验证数据集。这意味着我们应该预料到训练和验证损失学习曲线之间的一些差距。这种差距被称为“泛化差距”

然而,诊断图显示了非代表性训练数据集的符号,这意味着模型没有从训练集中获得足够的信息来学习问题。

实际结果与预测结果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

换算预测值

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们将观察值和预测值连接在一个数据框中,以便更好地表示和报告。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

准确性指标

均方误差(MSE) : MSE 测量误差平方的平均值,即估计值和实际值之间的平均平方差。MSE 越小,我们就越接近最佳拟合模式。

均方根误差(RMSE) : RMSE 是预测值和实际观测值之间的平均平方差的平方根。由于在取平均值之前误差是平方的,RMSE 对大的误差给予相对高的权重。这使得 RMSE 在不希望出现大误差时最为有效。

平均绝对误差(MAE) : MAE 是预测值和实际观测值之间绝对差异的测试样本的平均值,其中所有个体差异具有相同的权重。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

实际与预测图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以看到,结果并不如预期。但在这里,我们的目标是找到一个模型,拟合和预测天然气现货价格。我们采用了 1 个月的时间范围,我们的算法能够学习和预测未来的价格。学习能力和泛化能力是神经网络的关键特征。此外,其中一个优点是,可以应用线性或非线性的激活函数***(model . add(Activation(" relu “或” sigmoid"))*** 。网络架构的内存块通过层连接。每个模块都包含用于管理状态和输出的门,并根据输入序列进行操作。而且,一个街区内的每个门都用 激活 单元来控制。默认情况下,架构使用***【sigmoid】***激活。这里,通过选择各种非线性函数以及神经元和层的不同排列,捕获对刺激的非线性响应。最后,我们观察到,GRU 网络结构可以有效地用于预测我们的时间序列数据的未来市场价格。

模型精度需要用更多的训练数据来测试,批量大小可以配置为 64 或 128,输入参数的数量可以是选择性的。我们使用了月度数据集,其中每日数据可能有助于实现更好的准确性。

特征重要性

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以从如下所述的数据集中找出 10 大重要特征来预测 Henry Hub 现货价格的月度价格变动:

  1. 美国天然气进口价格,
  2. 美国液化天然气进口,
  3. 美国天然气进口,
  4. 极端最高日温度—纽约,
  5. 美国天然气总提取量,
  6. 美国从油井中提取的天然气总量,
  7. 冷却度天数— TX,
  8. 美国天然气从气井中的总提取量
  9. 美国注入地下储气库的天然气总量
  10. 美国液化天然气出口

摘要

预测股票市场指数的准确每日价格一直是一项困难的任务。许多因素,如政治事件、总体经济状况和交易者的预期,都可能对现货价格指数产生影响。这里,我们应用了几个输入变量来预测未来 12 个月的价格方向。然而,通过选择有效的输入指示符,可以进一步提高预测性能。此外,我们可以包括一些可能影响预测性能的其他技术指标。实验中的模型以回归的方式解决了这个问题。回归模型可以与预测上升和下降的分类模型相结合,以提高精确预测的方向准确性。此外,由于非参数建模方法需要更多的训练数据来估计映射函数,因此需要用大量数据来测试同一模型的预测精度。

我可以到达 这里

自然梯度

原文:https://towardsdatascience.com/natural-gradient-ce454b3dcdfa?source=collection_archive---------4-----------------------

梯度助推器

梯度下降更好的梯度?

我们从这个系列中走了一个简短的弯路来理解什么是自然渐变。我们在梯度推进世界中考察的下一个算法是 NGBoost,为了完全理解它,我们需要理解什么是自然梯度。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

保罗·吉尔摩Unsplash 上拍摄的照片

预读:我将谈论 KL 散度,如果你对这个概念不熟悉,暂停一下,跟上进度。我在另一篇文章中给出了熵、交叉熵和 KL 散度背后的数学和直觉。

我也假设对梯度下降基本熟悉。我相信你会在网上找到上百万篇关于梯度下降的文章。

有时,在解释过程中,我们可能会涉及一些数学内容。但是只要有可能,我也会提供直觉,这样如果你不喜欢数学和方程式,你可以直接跳到直觉。

梯度下降

互联网上有一百万篇文章解释什么是梯度下降,但这不是第一百万篇文章。简而言之,我们将只涉及足够的梯度下降,使前面的讨论相关。

问题设置是:给定一个函数,我们想找到它的最小值。在机器学习中,这通常是损失函数,并且是算法的参数(例如,在神经网络中是网络的权重和偏差)。

  1. 我们为 x 取一个初始值,大多是随机的,
  2. 我们计算损失函数的梯度 w.r.t .参数 x

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.我们调整参数 x ,使得

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

,其中α是学习率

  1. 重复 2 和 3,直到我们对损失值感到满意。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:关于梯度下降的更多数学公式,你可以访问 Sebastian Raschka 的 mlxtend

该算法有两个主要成分——梯度和学习率。

梯度无非是损失函数 w.r.t .的一阶导数。这也叫做函数在该点的斜率。从高中几何中,我们知道斜率可以有符号,根据符号我们知道哪个方向是“下”。例如,在上图中,梯度或斜率是负的,我们知道我们必须向负方向移动才能达到最小值。所以梯度也给了你需要移动的方向,这就是梯度下降使用的性质。

学习率 是一个必要的缩放,应用于每次的梯度更新。它只是一个很小的量,我们用它来限制基于梯度的参数更新,以确保我们的算法收敛。我们将很快讨论为什么我们需要它。

限制

梯度下降的第一个陷阱是步长。我们使用损失函数的梯度来调整参数 x (按学习率缩放)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:讲稿马克·图森

梯度是损失函数的一阶导数,根据定义,它只知道计算点的斜率。这是短视的,因为斜率甚至是无穷小距离上的一点。在上图中,我们可以看到两个点,陡坡上的点具有较高的梯度值,几乎平坦的点具有较小的梯度值。但这是否意味着我们应该分别迈出更大或更小的步伐?因此,我们只能将梯度给出的方向作为绝对真理,并使用超参数 学习速率 来管理步长。这个超参数确保我们不会跳过最小值(如果步长太大)或永远达不到最小值(如果步长太小)。

这是你在几乎所有一阶优化算法中都能找到的一个陷阱。解决它的一种方法是使用二阶导数,它也告诉你函数的曲率,并在此基础上进行更新步骤,这就是牛顿拉夫森优化方法所做的(在以前的一篇博客文章中的附录)。但是二阶优化方法有其自身的问题——计算和分析的复杂性。

另一个缺陷是,这次更新通过学习率来衡量所有的参数,从而将所有的参数都一视同仁。可能有一些参数对损失函数的影响比其他参数更大,通过限制这些参数的更新,我们使算法收敛的时间更长。

替代方案

有什么选择?恒定的学习率更新就像是我们给算法的一个安全垫,这样它就不会盲目地从一个点冲到另一个点,完全错过最小值。但是我们可以用另一种方法来实现这个安全垫。

我们可以固定目标输出的分布空间中的距离,而不是固定每个参数移动的欧几里德距离(参数空间中的距离)。即,不是在ε距离内改变所有参数,而是我们将模型的输出分布约束在来自前一步骤的分布的ε距离内。

现在我们如何测量两个分布之间的距离?库尔贝克-莱布勒散度。虽然从技术上来说不是距离(因为它是不对称的),但在它被定义的位置上,它可以被认为是距离。这对我们来说很好,因为我们也关心当我们在参数空间中做小的步骤时,输出分布如何变化。本质上,我们不像在正常梯度下降中那样在欧几里得参数空间中移动。但是在以 KL 散度为度量的分布空间中。

费希尔信息矩阵和自然梯度

我将跳到最后,告诉你有一个神奇的矩阵,称为费歇尔信息矩阵,如果我们将它包括在常规梯度下降公式中,我们将得到自然梯度下降,它具有在每个更新步骤中约束输出分布的属性[1]。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这正是梯度下降方程,有一些变化:

  1. α,即学习速率,用ηₜ代替,以清楚地表明步长可能在每次迭代中变化
  2. 在正常梯度上增加了一项 F(θₜ)₋₁。

当正常梯度与费希尔矩阵的逆成比例时,我们称之为自然梯度。

现在,对于那些能够接受费舍尔矩阵是一个神奇的量,使正常梯度自然的人来说,跳到下一节。对于那些留下来的勇敢的人来说,一点数学知识正在你的路上。

数学(费希尔矩阵)

我假设每个人都知道 KL 散度是什么。我们将从 KL 散度开始,看看它如何转化为费雪矩阵,什么是费雪矩阵。

正如我们在深度学习和信息理论中看到的,KL 散度被定义为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那是当我们谈论一个离散变量,像一个分类结果。在更一般的意义上,我们需要用积分来代替求和。让我们也切换符号,以适应梯度下降框架,我们正在工作。

不把 P 和 Q 作为两个分布,我们说P(x;θ)p(x;θ + δθ) 是两个分布,其中 x 是我们的输入特征或协变量,θ是损失函数的参数(例如,神经网络中的权重和偏差),δθ是我们在梯度更新步骤中对参数的微小改变。因此,在新的符号下,KL 散度被定义为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们用p(x;来重写方程的第二项;θ) 利用二阶泰勒展开式(即利用特定点的导数进行近似)。泰勒展开在其一般形式下是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

以这种形式重写第二项,我们得到:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们把高中微积分中可靠的链式法则拿出来应用到第一学期。Log x 的导数为 1/x,第二项的泰勒展开式为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

把这个代入 KL 散度方程。我们得到:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

重新排列我们现有的术语:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第一项是同一分布之间的 KL 散度,它将为零。另一种思考方式是 log 1 = 0,因此第一项变成 0。

第二项也将为零。下面我们来看看。我们用来推断零的关键属性是概率分布 P(x)对 x 的积分是 1(就像概率分布曲线下面积的总和是 1)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在,留给我们的是 log p(x;)θₜ。一点数学知识(手摇)让我们明白:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们把这个放回 KL 散度方程。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第一项变成零,因为正如我们之前看到的,概率分布 P(x)对 x 的积分是 1。1 的一阶和二阶导数是 0。在第二项中,积分称为费雪矩阵。姑且称之为 F 。所以 KL 散度方程变成了:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

直觉(费希尔矩阵)

费希尔矩阵中 x 上的积分可以解释为期望值。而构成费希尔矩阵的是log p(x;)θₜ。和log p(x;)无非是对数似然。我们知道一阶导数给出了斜率,二阶导数(Hessian)给出了曲率。因此,费希尔矩阵可以被视为对数似然函数的曲率。

费希尔矩阵也是得分函数的协方差。在我们的例子中,得分函数是对数似然,它衡量我们预测的好坏。

数学(自然渐变)

我们看了什么是费希尔矩阵,但是我们仍然没有把它和梯度下降联系起来。现在,我们知道 KL 散度是 Fisher 矩阵和两个分布之间参数的 delta 变化的函数。正如我们之前所讨论的,我们的目标是确保在将 KL 散度保持在恒定的***【c】***内的前提下,使损失最小化。

形式上,可以写成:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们采用问题的拉格朗日松弛法,并使用我们信任的一阶泰勒松弛法

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为了最小化上面的函数,我们将导数设置为零并求解。上述函数的导数为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

将其设置为零并求解 δθ ,我们得到:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这意味着因子为 1/λ(这是我们接受的拉格朗日松弛的误差容限),我们得到最佳下降方向,考虑到在该点对数似然的曲率。我们可以把这个放松的常数因素带入学习速率,并把它看作是同一个常数的一部分。

最后一点数学技巧是,我们有自然梯度,

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

渐变与自然渐变

我们已经讲了很多关于渐变和自然渐变的内容。但是理解自然梯度不同于正常梯度的原因对于理解自然梯度下降如何不同于梯度下降是至关重要的。

在这一切的中心,是一个损失函数,衡量预测输出和地面真相之间的差异。我们如何改变这种损失?通过改变改变预测输出从而改变损失的参数。所以,在正态梯度中,我们取损失函数对参数的导数。如果预测的概率分布更接近真实分布,导数将会很小,反之亦然。这表示如果您将每个参数移动一个单位,您的损失将会改变。因此,当我们应用学习率时,我们将梯度更新按固定量缩放到这些参数。

在自然渐变世界中,我们不再限制参数空间中参数的移动。相反,我们在每一步都阻止了输出概率分布的移动。我们如何测量概率分布?对数可能性。费希尔矩阵给出了对数似然的曲率。

正如我们之前看到的,法线梯度不知道损失函数的曲率,因为它是一阶优化方法。但是,当我们将 Fisher 矩阵包括到梯度中时,我们所做的是用对数似然函数的曲率来缩放参数更新。因此,在对数似然随参数快速变化的分布空间中,相对于分布空间中的平坦平面,参数的更新会更少。

除了使用曲率信息调整我们的更新的明显好处之外,自然渐变还允许我们直接控制你的模型在预测空间中的移动。在正常梯度中,你的运动严格地在参数空间中,我们用一个学习率来限制该空间中的运动,希望预测空间中的运动也被限制。但是在自然梯度更新中,我们通过规定模型在 KL 散度项中仅移动固定的距离来直接限制预测空间中的移动。

因此…为什么我现在才听说?

一个显而易见的问题是,很多人会想:如果自然梯度下降真的很棒,而且明显比梯度下降好,为什么它不是神经网络中的事实标准呢?

这是实用主义战胜理论的领域之一。理论上,使用自然渐变的想法是美好的,而且它也像预期的那样工作。但问题是,当参数数量巨大时,计算费希尔矩阵及其逆矩阵成为一个棘手的问题,就像在典型的深度神经网络中一样。此计算存在于 n_parameter 中。

自然梯度没有受到太多关注的另一个原因是,深度学习研究人员和实践者想出了一些聪明的技巧/启发,在二阶导数中近似信息,而不计算它。深度学习优化器已经从 SGD 走了很长一段路,很多进展都是在使用这样的技巧来获得更好的梯度更新。动量RMSProp亚当,都是 SGD 的变体,其使用梯度的移动平均值和/或移动方差来近似二阶导数,并使用该信息来进行梯度更新。

与计算二阶导数或自然梯度相比,这些试探法的计算量要小得多,并且已经使得深度学习能够扩展到当前的水平。

也就是说,自然梯度在一些情况下仍然有用,其中要估计的参数相对较小,或者预期分布相对标准,如高斯分布,或者在强化学习的一些领域。最近,它也被用于一种形式的梯度增强,我们将在本系列的下一部分讨论。

在我们系列的下一部分中,让我们来看看新的产品— NgBoost

其他文章在T3T5【渐变助推器】

参考

  1. 甘利顺一。自然梯度在学习中很有效。神经计算,第 10 卷,第 2 期,第 251–276 页。
  2. 这很自然:过度深入自然梯度优化,https://towards data science . com/its-Only-Natural-An-over-Deep-Dive-into-Natural-Gradient-Optimization-75d 464 b 89 dbb
  3. 拉特里夫,内森,信息几何与自然渐变,https://ipvs . informatik . uni-stuttgart . de/MLR/WP-content/uploads/2015/01/mathematics _ for _ intelligent _ systems _ lecture 12 _ notes _ I . pdf
  4. 自然渐变下降,https://wise odd . github . io/tech blog/2018/03/14/natural-Gradient/
  5. 费舍尔信息矩阵,https://wise odd . github . io/tech blog/2018/03/11/fisher-Information/
  6. 什么是自然渐变,它是如何工作的?,http://kvfrans . com/what-the-natural-gradient-and-where-it-appeared-in-trust-region-policy-optimization/

原载于 2020 年 4 月 1 日【http://deep-and-shallow.com】

自然语言处理:初学者指南第一部分

原文:https://towardsdatascience.com/natural-language-processing-a-beginners-guide-part-i-1a5880cc3bdc?source=collection_archive---------26-----------------------

从零开始用 nltk 库学习 NLP

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

https://unsplash.com/

表达式包含大量数据。每次我们说话或写作时,它都有一些与特定主题、社区、教义等相关的解释。,可以在更大范围内影响人。作为一个人,分析这些数据非常困难,但由于机器学习和人工智能,这变得很容易!

在网民时代,信息在各种社交媒体平台、不同语言的电子报纸中流通。通过自然语言处理,收集这些非结构化数据并分析其不同的解释现在已经成为可能。

自然语言处理是人工智能领域,处理机器和人类语言之间的交互。换句话说,NLP 帮助机器理解人类(自然)语言的含义。

用例

智能助手如谷歌助手、SIRI、亚马逊 Alexa 等。基于 NLP 概念的工作。这些助手将你的演讲转换成文本,进行分析,然后付诸行动。

情绪分析:在社交媒体平台中,人们对你可以使用 NLP 分析的推文或帖子的情绪。组织通过使用 NLP 的反馈处理来分析客户对产品的情感,并在业务中获得收益。

主题建模:你可以使用 LDA(潜在狄利克雷分配 ) 技术深入主题建模的世界。我将在这个博客的第二部分对此进行更多的讨论。

垃圾邮件检测:公司使用 NLP 对流经其服务器的垃圾邮件进行分类。

**假新闻检测:**一些机构使用自然语言处理来检测社交媒体、电子媒体中的假新闻。

NLP 还有许多其他的用例。在这篇博客中,你将作为初学者理解使用 NLP 对一篇报纸文章的文本分析。为此,您可以直接转到链接并复制文章进行处理,也可以使用 Python 进行抓取。网络抓取真的很有趣,我会在另一个博客中讨论它。

让我们用 NLP 做一些伟大的事情!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

https://unsplash.com/

基本安装:

对于这个博客来说, nltk 开源库和 spyder IDE 将会得心应手。这个库描述了 NLP 的许多功能。首先,您需要导入 nltk 库,然后从 GitHub 库下载一些必需品。

#import library nltk
import nltk
nltk.download()

一旦您在 spyder IDE 中运行这些东西,就会出现如下弹出窗口。你需要全部下载。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从我的电脑输出

记号化:它是文本处理部分,帮助你将一个大的字符串分割成几个记号。换句话说,这种技术可以帮助你将段落分成一系列的句子,将一个句子分成一系列的单词。

paragraph =’’’
Ahead of U.S. President Donald Trump’s visit to India, some of the key deliverables from the trip, as well as the outcomes that may not be delivered after his meeting with Prime Minister Narendra Modi on Tuesday, are coming into view. The larger question remains as to whether the bonhomie between the two, who will be meeting for the fifth time in eight months, will also spur the bilateral relationship towards broader outcomes, with expectations centred at bilateral strategic ties, trade and energy relations as well as cooperation on India’s regional environment. On the strategic front, India and the U.S. are expected to take forward military cooperation and defence purchases totalling about $3 billion. Mr. Trump has cast a cloud over the possibility of a trade deal being announced, but is expected to bring U.S. Trade Representative Robert Lighthizer to give a last push towards the trade package being discussed for nearly two years. Both sides have lowered expectations of any major deal coming through, given that differences remain over a range of tariffs from both sides; market access for U.S. products; and India’s demand that the U.S. restore its GSP (Generalised System of Preferences) status. However, it would be a setback if some sort of announcement on trade is not made. A failure to do so would denote the second missed opportunity since Commerce Minister Piyush Goyal’s U.S. visit last September. Finally, much of the attention will be taken by India’s regional fault-lines: the Indo-Pacific strategy to the east and Afghanistan’s future to the west. India and the U.S. are expected to upgrade their 2015 joint vision statement on the Indo-Pacific to increase their cooperation on freedom of navigation, particularly with a view to containing China. Meanwhile, the U.S.-Taliban deal is expected to be finalised next week, and the two leaders will discuss India’s role in Afghanistan, given Pakistan’s influence over any future dispensation that includes the Taliban.Any high-level visit, particularly that of a U.S. President to India, is as much about the optics as it is about the outcomes. It is clear that both sides see the joint public rally at Ahmedabad’s Motera Stadium as the centrepiece of the visit, where the leaders hope to attract about 1.25 lakh people in the audience. Despite the Foreign Ministry’s statement to the contrary, the narrative will be political. Mr. Trump will pitch the Motera event as part of his election campaign back home. By choosing Gujarat as the venue, Mr. Modi too is scoring some political points with his home State. As they stand together, the two leaders, who have both been criticised in the last few months for not following democratic norms domestically, will hope to answer their critics with the message that they represent the world’s oldest democracy and the world’s largest one, respectively.
‘’’
#tokenizing sentences
sentences = nltk.sent_tokenize(paragraph)#tokenizing words
words = nltk.word_tokenize(paragraph)

这里的段落包含一篇特定的报纸文章。使用 sent_tokenize()和 word_tokenize()可以创建令牌列表。

**词干化:**将派生单词还原为其词干或词根形式的过程。

Negligence    |
Negligently   | ============> Negligen 
Neglligent    |

在这里,疏忽、疏忽、过失这些词将被简化为疏忽。但是它有一个缺点——词干可能没有意义。

from nltk.stem.porter import PorterStemmer
from nltk.corpus import stopwords

您需要创建一个 PorterStemmer 对象,并遍历句子标记来执行词干提取。

**词汇化:**是一种类似词干化的活动。但在这种情况下,基本词会有一些意义。

from nltk.stem import WordNetLemmatizer

注意:

  1. 每次执行词汇化或词干化时,都需要将标记转换成小写,并删除停用词。
from nltk.corpus import stopwords

2.如果需要更多的文本清理活动,您可以使用 Python re 模块

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

https://www.thehindu.com/opinion/editorial/

在目前的讨论中,文章多次包含美国。因为它与文章更相关,所以你需要转换美国。使用 replace()方法对’ America '进行替换。执行上述功能后,输出如下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从我的电脑输出

在此图中,显然’可交付物’‘已被简化为’交付物’。它没有任何意义。所以我进行了词汇化。这是输出。看看第一行中的单词’可交付物’。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从我的电脑输出

停用词: nltk 支持各种语言,每种语言都有不同的停用词。对于英语来说,停用词就像“a”、“the”、“where”等。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从我的电脑输出

恭喜你!!!

你已经成功的将句子记号词条化了!

包话:

它是一个帮助你理解单词在文档或句子中出现的模式,而不管语法和单词的顺序。

您可以创建一个对象 CountVectorizer 来执行这个操作。

from sklearn.feature_extraction.text import CountVectorizer

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从我的电脑输出

到目前为止,我们可以从讨论中得出两个推论。

  1. 在词汇化和词干化中,所有的单词都具有同样的重要性。
  2. 在我们收集的单词中没有语义信息。

为了克服这些问题,采用了另一种方法— TFIDF

词频和逆文档频:

你是否有一些信息,以生僻字的形式出现,但在文本分析中却非常重要?

别担心,TFIDF 会帮你解决的!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

版权所有-Somesh

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

版权所有-Somesh

TFIDF = TF * IDF

再次感谢 Sci-Kit Learn library 减少了您的一些努力。创建 TfidfVectorizer 的 sn 对象来应用这个概念。

from sklearn.feature_extraction.text import TfidfVectorizer

看一下结果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这些不同的小数输出显示了单词相对于文档/句子的实际重要性。同样,这种方法既没有语义也没有上下文。但这是一种奖励词语的方法,却忽略了词语的频繁出现。

此外,我们可以利用主题模型,分析具有相同上下文的其他来源的文章,以了解作者的情绪。

但是这些内容将在第 2 部分中讨论!!!

自然语言处理是人工智能的一个广阔和蓬勃发展的领域,尽管在这方面工作非常具有挑战性。从智能助手到疾病检测,自然语言处理在很多领域都非常有用。

祝贺并欢迎所有从事自然语言处理的人!!!

感谢克里斯·纳伊克,是他让这一旅程成为可能。

对于建议,我将在 LinkedInGmail 上,并在 GitHub 关注我的工作。

自然语言处理:初学者指南第二部分

原文:https://towardsdatascience.com/natural-language-processing-a-beginners-guide-part-ii-54a1bf8c0497?source=collection_archive---------40-----------------------

让我们再深入一点…

我已经在 NLP 系列的第一部分讨论了 NLP 的基础知识。您会注意到,TF-IDF 的概念没有传达任何语义或上下文。但是你可以从语法的角度来解释这些文章。

让我们一起来探索语料库的隐藏之美吧!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源

位置标签

这指的是句子中的词类的概念,你们在高中已经学过了。使用 nltk 库,你可以给每个单词甚至短语添加词性标签。这是一个复杂的过程,有时单词在句子的形式上有模糊的意思。语料库有两种词性标注。

1.基于规则的位置标记:

当你遇到模棱两可的词时,你可以使用这个技巧。分析前人和后人。它也是特定于特定语言的。大写和标点词性标注是这种技术的一部分。

其中一个例子是布里尔的标签。它是一个基于规则的标记器,在训练数据中实现,找出词性标记错误较少的规则集,对数据进行最佳定义。

2.随机位置标记:

如果一个单词在训练句子中被标记了特定的标签,分析最高频率或概率,该单词将被赋予一个特殊的标签。

这也被称为 n 元语法方法,指的是基于具有 n 个先前标签的概率来决定单词的事实。

import nltkparagraph =’’’
Ahead of U.S. President Donald Trump’s visit to India, some of the key deliverables from the trip, as well as the outcomes that may not be delivered after his meeting with Prime Minister Narendra Modi on Tuesday, are coming into view. The larger question remains as to whether the bonhomie between the two, who will be meeting for the fifth time in eight months, will also spur the bilateral relationship towards broader outcomes, with expectations centred at bilateral strategic ties, trade and energy relations as well as cooperation on India’s regional environment. On the strategic front, India and the U.S. are expected to take forward military cooperation and defence purchases totalling about $3 billion. Mr. Trump has cast a cloud over the possibility of a trade deal being announced, but is expected to bring U.S. Trade Representative Robert Lighthizer to give a last push towards the trade package being discussed for nearly two years. Both sides have lowered expectations of any major deal coming through, given that differences remain over a range of tariffs from both sides; market access for U.S. products; and India’s demand that the U.S. restore its GSP (Generalised System of Preferences) status. However, it would be a setback if some sort of announcement on trade is not made. A failure to do so would denote the second missed opportunity since Commerce Minister Piyush Goyal’s U.S. visit last September. Finally, much of the attention will be taken by India’s regional fault-lines: the Indo-Pacific strategy to the east and Afghanistan’s future to the west. India and the U.S. are expected to upgrade their 2015 joint vision statement on the Indo-Pacific to increase their cooperation on freedom of navigation, particularly with a view to containing China. Meanwhile, the U.S.-Taliban deal is expected to be finalised next week, and the two leaders will discuss India’s role in Afghanistan, given Pakistan’s influence over any future dispensation that includes the Taliban.Any high-level visit, particularly that of a U.S. President to India, is as much about the optics as it is about the outcomes. It is clear that both sides see the joint public rally at Ahmedabad’s Motera Stadium as the centrepiece of the visit, where the leaders hope to attract about 1.25 lakh people in the audience. Despite the Foreign Ministry’s statement to the contrary, the narrative will be political. Mr. Trump will pitch the Motera event as part of his election campaign back home. By choosing Gujarat as the venue, Mr. Modi too is scoring some political points with his home State. As they stand together, the two leaders, who have both been criticised in the last few months for not following democratic norms domestically, will hope to answer their critics with the message that they represent the world’s oldest democracy and the world’s largest one, respectively.
‘’’#tokenizing sentences
sentences = nltk.sent_tokenize(paragraph)#tokenizing words
words = nltk.word_tokenize(paragraph)#pos tagging
for word in words:
 print(nltk.pos_tag(words))

运行上面这段代码,你可以看到单词和相应的 pos 标签压缩在一个列表中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

仅代表目的。版权所有 Somesh

这里的缩写像 NNP——专有名词,单数。

IN 表示介词等。您也可以探索 nltk 库中关于缩写的更多信息。

还可以进行组块操作,得到一组单词。组块用来给句子增加更多的结构。您还可以添加正则表达式技术来形成不同种类的标记组或名词短语组等。它也被称为浅层解析或轻量解析。

pattern = ‘’’chunk_sample:{<NNP.?>*<IN.?>}’’’
chunky = nltk.RegexpParser(pattern)
print(chunky)chunk_op = chunky.parse(nltk.pos_tag(words))
print(chunk_op)

这里的模式告诉我们如何从单词标记中创建组块。

关于模式创建的一些有用信息:

Special Symbols       Meaning
.                    Any character except newline*                    Match 0 or more repetitions?                    Match 0 or 1 repetitionspattern = '''chunk_sample:{<NN.?>*<VBD.?>*<JJ.?>}'''
chunky = nltk.RegexpParser(pattern)
print(chunky)#corpus_lem[5]=['however','would','setback','sort','announcement','trade made']chunk_op = chunky.parse(nltk.pos_tag(corpus_lem[5].split(' ')))
print(chunk_op)chunk_op.draw()

如果您运行上面这段代码,您可以更好地理解分块技术,并将其可视化。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

版权所有 Somesh

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

版权所有 Somesh

这里的图表描述了每个带有词性标签的单词。您可以更多地使用 RegexpParser 来从语法上理解标记,并可以制作漂亮的图形来更好地可视化。

#Ngram in nltk 
from nltk import ngramsbigram = list(ngrams(corpus_lem[8].split(),2))
trigram = list(ngrams(corpus_lem[8].split(),3))

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

BIGRAM 输出版权 somesh

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

三元模型输出版权所有 Somesh

您可以清楚地看到二元模型方法形成了两个单词的元组,三元模型方法形成了三个单词的元组。

隐马尔可夫模型:

这些是概率模型,基于先前识别的单词和当前单词,帮助决定最可能的决定。

HMM 是具有单个状态变量 S 和单个观察变量 **O,**的概率模型,因此该模型将具有两个概率部分。诸如

(I)过渡模型——它告诉我们一个国家在一段时间内的过渡。

(ii)观察模型——它告诉我们在给定的状态下,您获得不同观察结果的可能性有多大。(参考下图)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

版权所有 Somesh

下面是 HMM 概念的图形表示,称为结构化转换模型。这些数值对应的是在给定时间状态到当前状态的每一次转移的概率。每个节点都是一个特定的指定状态变量。

在这里,S1 以 0.7 的概率转移到 S2,并以 0.2 的概率停留在原来的状态。其他州也有类似的解释。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

版权所有 Somesh

这是关于 HMM 的概念。它被广泛用于 NLP 项目中,如机器人定位、语音识别、生物序列分析、文本分析等。我将在接下来的故事中讨论详细的模型和编码部分。

到目前为止,我们只分析了使用 nltk 库的单词。在这里,我将尝试使用 wordcloud 赋予文字艺术感。很迷人,不是吗?

如下导入所需的库。将每个句子的词条转化成一个字符串,使用 wordcloud 你可以表达它。

#to intsall wordcloud in anaconda type "pip install wordcloud" in #anaconda prompt#import librariesimport pandas as pd
from wordcloud import WordCloud#convert the corpus_lem to a dataframe
df = pd.DataFrame(data=corpus_lem,columns=[‘words’])stop_words = set(stopwords.words(‘english’))
words_test = ‘’#convert all the lematized sentence token to a string
for i in df.words:
 words_test = words_test+i+’ ‘

#put it in a wordcloud
word_cloud = WordCloud(width = 900, height = 900,stopwords = stop_words,
 background_color = ‘white’,min_font_size = 12).generate(words_test)#show using matplotlib
import matplotlib.pyplot as pltplt.figure(figsize = (10, 10), facecolor = None) 
plt.imshow(word_cloud) 
plt.axis(“off”) 
plt.tight_layout(pad = 0) 

plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

版权所有 Somesh

在这里,你可以发现作者试图将重点放在像 美国、印度、贸易、合作、莫迪、特朗普等词上。

稍后我将解释 HMM,Word2Vec 概念,以便更深入地理解 NLP &请务必阅读本系列的第 1 部分,以便更好地理解这个故事。

直到那时享受自然语言处理!!!

我希望你喜欢自然语言处理第一部分。在 媒体 上关注我,或者订阅我的博客来了解他们。一如既往,我欢迎反馈和建设性的批评,可以通过 Twitter @RoutraySomesh 联系。

自然语言处理:简单解释

原文:https://towardsdatascience.com/natural-language-processing-a-simple-explanation-7e6379085a50?source=collection_archive---------46-----------------------

自然语言处理(NLP)正在迅速发展,并在许多方面改善着我们的生活——下面是一个简单的介绍。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由西德·瓦克斯Unsplash 上拍摄

什么是自然语言处理?

自然语言处理,简称 NLP,是专门分析人类语言人工智能(AI) 的一种。

[## 什么是人工智能?-高要求技能

人工智能(AI)是一个你可能听说过的术语——它对社会产生了巨大的影响,并且…

highdemandskills.com](https://highdemandskills.com/what-is-artificial-intelligence/)

NLP 通过以下方式做到这一点:

  • 阅读自然语言,这种语言是通过人类的自然使用进化而来的,我们每天都用它来相互交流
  • 解释自然语言,通常通过基于概率的算法
  • 分析自然语言并提供输出

你有没有用过苹果的 Siri,想知道它是如何理解(大部分)你说的话的?这是 NLP 在实践中的一个例子。

NLP 正在成为我们生活中必不可少的一部分,与机器学习和深度学习一起,产生的结果远远优于几年前可能实现的结果。

在本文中,我们将仔细研究 NLP,看看它是如何应用的,并了解它是如何工作的。

自然语言处理能做什么?

如今,NLP 的使用方式多种多样。其中包括:

机器翻译

你上一次访问外国并用智能手机进行语言翻译是什么时候?或许你用过谷歌翻译?这是 NLP 机器翻译的一个例子。

机器翻译通过使用 NLP 将一种语言翻译成另一种语言来工作。历史上,简单的基于规则的方法已经被用来做这件事。但是今天的 NLP 技术是对已经存在多年的基于规则的方法的一个很大的改进。

为了让 NLP 在机器翻译方面表现出色,它采用了深度学习技术。这种形式的机器翻译有时被称为神经机器翻译(NMT),因为它利用了神经网络。因此,NMT 解释语言的基础上,统计,尝试和错误的方法,可以处理语境和其他微妙的语言。

除了像 Google Translate 这样的应用程序,NMT 还用于一系列商业应用程序,例如:

  • 翻译纯文本、网页或文件,如 Excel、Powerpoint 或 Word。Systran 是这样做的翻译服务公司的一个例子。
  • 实时翻译社交内容,由专门从事公共部门语言服务的 SDL 政府提供。
  • 在医疗情况下翻译语言,例如当一名讲英语的医生正在治疗一名讲西班牙语的病人时,由 Canopy Speak 提供。
  • 翻译财务文件,如年度报告、投资评论和信息文件,由专门从事财务翻译的公司提供。

语音识别

前面我们提到 Siri 是 NLP 的一个例子。Siri 使用的 NLP 的一个特殊功能是语音识别。Alexa 和 Google Assistant(“ok Google”)是 NLP 语音识别的其他众所周知的例子。

语音识别并不是一门新科学,它已经存在了 50 多年。多亏了 NLP,直到最近它的易用性和准确性才有了显著的提高。

语音识别的核心是识别口语单词、解释它们并将其转换为文本的能力。然后可以采取一系列行动,如回答问题、执行指令或写电子邮件。

NLP 中使用的强大的深度学习方法使今天的语音识别应用程序比以往任何时候都更好地工作。

聊天机器人

聊天机器人是模拟人类自然对话的软件程序。它们被公司用来帮助客户服务、消费者查询和销售查询。

上次登录公司网站并使用在线帮助系统时,您可能已经与聊天机器人进行了互动。

虽然简单的聊天机器人使用基于规则的方法,但今天更有能力的聊天机器人使用 NLP 来理解客户在说什么以及如何回应。

聊天机器人的众所周知的例子包括:

  • 世界卫生组织(世卫组织)聊天机器人,建立在 WhatsApp 平台上,分享信息并回答关于新冠肺炎病毒传播的询问
  • 《国家地理》的天才聊天机器人,说话像阿尔伯特·爱因斯坦,与用户互动以推广同名的《国家地理》节目
  • Kian 是韩国汽车制造商起亚在 FaceBook Messenger 上的聊天机器人,它回答关于起亚汽车的查询,并帮助销售查询
  • 全食超市的聊天机器人,帮助提供食谱信息、烹饪灵感和产品推荐

情感分析

情感分析使用 NLP 来解释和分类文本数据中包含的情感。例如,这用于根据正面或负面体验对在线客户关于产品或服务的反馈进行分类。

在最简单的形式中,情感分析可以通过根据传达情感的指定单词对文本进行分类来完成,如“爱”、“恨”、“快乐”、“悲伤”或“愤怒”。这种类型的情感分析已经存在了很长时间,但是由于其简单性,实际应用有限。

今天的情感分析使用 NLP 基于统计和深度学习方法对文本进行分类。结果是情感分析可以处理复杂和自然的声音文本。

如今,全世界的企业都对情感分析产生了浓厚的兴趣。它可以提供对客户偏好、满意度和意见反馈的宝贵见解,有助于营销活动和产品设计。

电子邮件分类

电子邮件超载是现代工作场所常见的挑战。NLP 可以帮助分析和分类收到的电子邮件,以便它们可以自动转发到正确的位置。

过去,简单的关键字匹配技术被用来对电子邮件进行分类。这有好有坏。NLP 允许更好的分类方法,因为它可以理解单个句子、段落和整个文本部分的上下文。

鉴于当今企业必须处理的电子邮件数量庞大,基于 NLP 的电子邮件分类可以极大地帮助提高工作场所的生产力。使用 NLP 进行分类有助于确保电子邮件不会被遗忘在负担过重的收件箱中,并被正确归档以供进一步处理。

自然语言处理是如何工作的?

既然我们已经看到了 NLP 能做什么,让我们试着理解它是如何工作的。

本质上,NLP 的工作原理是将一组文本信息转换成指定的输出。

如果应用程序是机器翻译,那么输入的文本信息将是源语言(比如说英语)的文档,输出将是目标语言(比如说法语)的翻译文档。

如果应用是情感分析,那么输出将是输入文本到情感类别的分类。诸如此类。

NLP 工作流

现代 NLP 是一门混合学科,它借鉴了语言学、计算机科学和机器学习。NLP 使用的流程或工作流有三个主要步骤:

步骤 1 —文本预处理

步骤 2 —文本表示

步骤 3 —分析和建模

每一步都可能使用一系列技术,这些技术随着不断的研究而不断发展。

步骤 1:文本预处理

第一步是准备输入文本,以便更容易分析。自然语言处理的这一部分已经很好地建立起来,并且利用了一系列传统的语言学方法。

此步骤中使用的一些关键方法有:

  • 记号化,将文本分解成有用的单元(记号)。例如,用空格分隔单词,或者用句号分隔句子。标记化也识别经常在一起的单词,例如“纽约”或“机器学习”。例如,句子“客户服务好得不能再好了”的标记化将导致以下标记:“客户服务”、“可能”、“不是”、“是”和“更好”。
  • 规范化使用像词干词汇化这样的技术将单词转换成它们的基本形式。这样做是为了帮助减少“噪音”和简化分析。词干提取通过删除词尾来识别词干。例如,单词“studies”的词干是“studi”。词汇化同样会删除后缀,但如果需要的话也会删除前缀,从而产生自然语言中通常使用的单词。例如,单词“studies”的引理是“study”。在大多数应用中,词汇化比词干化更受欢迎,因为生成的单词在自然语言中有更多的含义。
  • 词性标注利用了形态学,即研究单词之间的相互关系。单词(或记号)基于它们在句子中的功能被标记。这是通过使用从文本语料库中建立的规则来识别语音中单词的目的,即。动词、名词、形容词等。
  • 解析利用句法,或者对单词和句子如何组合的理解。这有助于理解句子的结构,是通过根据语法规则将句子分解成短语来完成的。一个短语可能包含一个名词和一个冠词,如“我的兔子”,或者一个动词,如“喜欢吃胡萝卜”。
  • 语义确定句子中所用单词的预期含义。单词可以有一个以上的意思。例如,“通过”可以表示(I)实际交出某物,(ii)决定不参加某事,或(iii)衡量考试成功。通过查看单词前后出现的单词,可以更好地理解单词的意思。

步骤 2:文本表示

为了使用机器和深度学习方法分析文本,需要将其转换为数字。这就是文本表示的目的。

此步骤中使用的一些关键方法有:

一袋单词

单词包(Bag of words,简称 BoW)是一种表示文本的方法,它通过计算每个单词在输入文档中出现的次数,与已知的参考单词列表(词汇表)进行比较。

结果是一组向量,包含描述每个单词出现次数的数字。这些向量被称为“包”,因为它们不包含任何关于输入文档结构的信息。

为了说明 BoW 是如何工作的,考虑例句“猫坐在垫子上”。这包含单词“the”、“cat”、“sat”、“on”和“mat”。这些单词的出现频率可以用[2,1,1,1,1]形式的向量来表示。这里,单词“the”出现两次,其他单词出现一次。

当与大词汇量相比较时,向量将扩展到包括几个零。这是因为词汇表中所有不包含在例句中的单词都没有出现频率。得到的矢量可能包含大量的零,因此被称为“稀疏矢量”。

BoW 方法相当简单易懂。然而,当词汇表很大时,得到的稀疏向量可能非常大。这导致计算上具有挑战性的向量不包含太多信息(即大多为零)。

此外,BoW 会查看单个单词,因此不会捕获任何关于单词组合的信息。这导致后面分析的上下文丢失。

一袋 n-克

使用 BoW 减少上下文丢失的一种方法是创建成组单词的词汇表,而不是单个单词。这些分组的单词被称为“n 元语法”,其中“n”是分组大小。由此产生的方法被称为“n-grams 袋”(BNG)。

BNG 的优势在于,每个 n-gram 比单个单词捕捉到更多的上下文。

在前面的例句中,“sat on”和“the mat”是 2-gram 的例子,“on the mat”是 3-gram 的例子。

TF-IDF

计算一个单词在文档中出现的次数的一个问题是,某些单词开始在计算中占主导地位。像“the”、“a”或“it”这样的词。这些词经常出现,但不包含太多信息。

处理这种情况的一种方法是将文档中频繁出现的单词与唯一出现的单词区别对待。频繁出现的单词往往是像“The”这样的低值单词。这些单词的计数可以被扣分以帮助降低它们的优势。

这种方法被称为“术语频率—逆文档频率”或 TF-IDF。术语频率查看一个词在给定文档中的频率,而逆文档频率查看该词在所有文档中的稀有程度。

TF-IDF 方法的作用是淡化频繁出现的单词,并突出具有有用信息的更独特的单词,如“cat”或“mat”。这可以带来更好的结果。

单词嵌入

一种更复杂的文本表示方法包括单词嵌入。这将每个单词映射到单独的向量,其中向量倾向于“密集”而不是“稀疏”(即。更小并且具有更少的零)。在映射过程中会考虑每个单词及其周围的单词。由此产生的密集向量允许更好地分析和比较单词及其上下文。

单词嵌入方法使用强大的机器学习和深度学习来执行映射。这是一个不断发展的领域,已经产生了一些出色的成果。目前使用的关键算法包括 Word2Vec、GloVe 和 FastText。

步骤 3:分析和建模

NLP 过程的最后一步是对通过步骤 1 和 2 生成的向量进行计算,以产生所需的结果。这里使用了机器学习和深度学习的方法。来自非 NLP 领域的许多相同的机器学习技术,如图像识别或欺诈检测,可用于此分析。

考虑情绪分析。这可以使用监督或无监督的机器学习来完成。有监督的机器学习需要预先标记的数据,而无监督的机器学习使用预先准备的精选单词(词典)数据库来帮助对情感进行分类。

使用机器学习,使用概率方法对输入文本向量进行分类。这是通过训练模型(监督机器学习)或通过与合适的词典进行比较(非监督机器学习)来完成的。

结果是基于通过机器学习过程生成的概率的情感分类。

结论

NLP 发展迅速,对社会的影响越来越大。从语言翻译到语音识别,从聊天机器人到识别情感,NLP 正在提供有价值的见解,并使我们的生活更加富有成效。

现代 NLP 通过使用语言学、计算机科学和机器学习来工作。近年来,NLP 已经产生了远远超过我们过去所看到的结果。

自然语言处理的基本工作流程包括文本预处理、文本表示和分析。如今使用了多种技术,并且随着研究的进行,更多的技术正在开发中。

NLP 承诺将彻底改变工业和消费者实践的许多领域。它已经成为我们日常生活中熟悉的一部分。

有了 NLP,我们有了一种强大的方式,通过一种我们天生熟悉的媒介——我们通过自然语言交流的能力——来参与数字未来。

[## 博客-高要求技能

阅读那些需求量很大的技能,这些技能可以让你更有生产力和效率,并且可以帮助你实现你的…

highdemandskills.com](https://highdemandskills.com/blog/)

自然语言处理

原文:https://towardsdatascience.com/natural-language-processing-a1496244c15c?source=collection_archive---------12-----------------------

使用 NLTK 的介绍和预处理

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

科伦萨·皮克特在 Unsplash 上拍摄的照片

什么是自然语言处理?

自然语言处理(NLP)是用于帮助机器理解和学习文本和语言的技术。通过 NLP 数据,科学家们旨在教机器理解所说的和所写的,以理解人类语言。用于将机器学习算法应用于文本语音

在本文中,我们将通过机器学习来了解 NLP 工作是如何理解人类语言的。

对我们重要吗?

我们可以使用 NLP 来创建类似于语音识别机器翻译垃圾邮件检测、文本简化问题回答、自动完成、预测打字、情感分析、文档摘要等等的系统。几个例子包括:

谷歌翻译 —语言翻译应用

语法上 —使用自然语言处理检查文本的语法准确性

个人协助——OK 谷歌、Siri、Cortana、Alexa 等应用。

关键词搜索,拼写检查,同义词搜索。

查询如产品价格、位置、公司名称等。在搜索引擎上。

这是一项容易的任务吗?

**NLP,情感和歧义:**教计算机关于语言的确切意义和情感被认为是计算机科学中的一个难题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

腾雅特Unsplash 上拍照

完全理解和表达语言的意义是一个极其困难的目标。开发 NLP 应用程序的主要挑战之一是,计算机很可能需要结构化数据,但就人类语音而言,这些数据是非结构化的,而且常常是模糊的。

使用自然语言指导信息的规则对于计算机来说不容易理解和翻译,尤其是感知语气,例如,如果某人使用讽刺的话来传递信息。这意味着计算机必须全面理解单词的含义以及单词背后的意图或情感。与编程不同,人类语言是模糊的,这使得它们复杂而难学。

NLP 中用到的技术有哪些?

自然语言处理主要有两个方面:自然语言理解 (NLU)或自然语言解释(NLI)(即人对机器)和自然语言生成 (NLG)(即机器对人)。简而言之,人们可以说 NLG 是 NLU 的逆(广义上称为 NLP)。自然语言生成(NLG)是指软件自动将数据转换成书面叙述。

句法和语义分析

自然语言处理任务主要通过句法分析和语义分析来实现。

术语 句法 指的是文本的语法结构,而 语义 指的是句子的意思。句法正确的句子并不意味着语义总是正确的。

句法分析(句法分析或解析),使用形式语法分析自然语言。语法规则适用于类别和词组,但不适用于单个单词。

示例:

  • 解析 —包括对提供的句子进行语法分析。
  • 词汇化 —将一个单词的各种屈折形式简化为单一形式。
  • 词干 —将屈折变化的单词切割成它们的词根形式。
  • 分词 —将一大段连续文本分成不同的单元。
  • 形态切分 —将词分成单个单位。
  • 词性标注 —识别每个单词的词性。
  • 断句 —在一大段文本上放置句子边界

语义分析是对句子的词语、符号、语气、结构进行理解和解释的过程。这项任务分析句子背后的意思或逻辑。我们主要依靠我们的直觉、关于语言和语调的知识来理解某人所说的话。

示例:

  • 命名实体识别(NER) —确定文本中可以被识别并归类到预设组中的部分,如人名和物体名。
  • 词义消歧——根据上下文赋予单词意义
  • 自然语言生成(NLG):——它涉及使用数据库来推导语义意图,并将它们转换成人类语言。

近年来,文本、视频、音频和照片形式的非结构化数据激增。NLU 有助于从文本中提取有价值的信息,如社交媒体数据、客户调查和投诉。

读取文本数据&为什么我们需要清理文本?

文本数据可以是结构化或非结构化的格式。

结构化的格式具有明确定义的模式,而非结构化的数据没有合适的结构。在这两种结构之间,我们有一种半结构化格式,它的结构化程度比非结构化格式要好。

在 python 中,我们有几个库来处理文本。

  • Scikit-learn,Keras,TensorFlow —具有一些文本处理功能
  • NLTK —自然语言工具包。
  • SpaCy —是一个工业级的 NLP 包,在一个漂亮的 API 中有许多实用的工具。
  • 其他库 — TextBlob,gensim,Stanford CoreNLP,OpenNLP。

在本文中,我们将介绍使用最常用的 python 库(即 NLTK)预处理文本数据的各种方法和技术。

自然语言工具包(NLTK)

(用于文本处理的 Python 库)

自然语言工具包(NLTK)是一个已知的 Python 开源包,它允许我们运行所有常见的 NLP 任务。它提供了易于使用的接口和一套文本处理库在预处理过程中涉及的大量步骤,如分类、标记化、词干化、标记、解析和语义推理。

需要对文本数据进行预处理

  • 真实数据**——往往不完整、不一致,并且充斥着大量的噪音和错误**
  • 数据结构 —大约。90%的数据是非结构化的
  • 多样性 —文本可以来自单个单词、句子、多个段落的列表(有或没有正确的拼写和标点)
  • 噪音——这些数据从来都不干净,包含大量噪音。

在建模和分析之前,有必要对数据进行预处理。简而言之,预处理将原始文本数据转换成计算机可理解的格式。

文本预处理

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们创建一个数据框(df)** 来练习文本数据的预处理。**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 将文本转换成小写的,使所有的数据格式一致

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 标点— 标点不添加任何额外信息。这一步骤减少了数据的大小,因此提高了计算效率

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 数字— 将数字转换成文字或删除数字。删除不相关的数字或改为文字。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • ****不重要的词“停用词”——是非常常见的词,与其他关键词相比没有意义或意义较小。如果我们去掉不常用的词,我们可以把注意力放在重要的关键词上。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 标记文本— 文本预处理中的一个强制步骤,其中文本被分割成最小有意义单元。可以是单词(word_tokenize)也可以是句子(sent_tokenize)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 词干化 词干化是通过去掉单词的后缀来提取词根的过程。在这篇文章中,我们将集中在 3 个词干技巧:波特斯特梅尔,斯诺鲍斯特梅尔和兰卡斯特斯特梅尔

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 词汇化— 词汇化是通过考虑词汇来提取词根的过程。词汇化是一种更强大的操作,它考虑了单词的形态分析。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

"词干化是一般操作,而词汇化是智能操作,其中将在字典中搜索适当的形式;因此,你以后会有更好的机器学习功能。”

摘要

在本文中,我们讨论了自然语言处理的基本概念和应用,以及使用 python 库 NLTK 的预处理步骤。一旦预处理完成,人们就可以将数据用于更复杂的 NLP 任务。

享受 NLP,感谢阅读😄。

自然语言处理—从初级到高级(第三部分)

原文:https://towardsdatascience.com/natural-language-processing-beginner-to-advanced-part-3-bbd536a89ecb?source=collection_archive---------27-----------------------

NLP 项目

高级词汇处理——如何处理文本数据中的杂波,以及如何构建自己的拼写校正器。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由洛伦佐·卡法罗皮克斯拜拍摄

在“NLP 项目”系列的前一部分中,我们学习了所有基本的词汇处理技术,比如去除停用词、标记化、词干化和词条化。

即使经过了所有这些预处理步骤,文本数据中仍然存在大量噪声。例如,由于错误和选择而发生的拼写错误(非正式的词,如’ lol ‘,’ u ‘,’ gud '等。).此外,由于发音不同(例如 Mumbai,Bombay)而出现的单词拼写变化问题。

我们在上一部分中谈到的两种方法——词干化和词汇化——都是称为规范化的技术的一部分。基本上,规范化意味着将一个单词简化为它的基本形式。

有些情况下,我们不能仅仅通过词干化和词汇化来规范化一个单词。因此,我们需要另一种技术来正确地规范化单词。例如,如果单词“allowing”被拼错为“alowing ”,那么在阻止拼错的单词后,我们将有一个多余的标记“alow ”,并且词条化甚至不起作用,因为它只对正确的词典拼写起作用。

同样的问题也存在于不同方言中相同单词的发音上。例如,英式英语中使用的单词“幽默”在美式英语中被拼写为“幽默”。这两种拼写都是正确的,但是在词干之后,当用于形式“幽默”和“幽默”时,它们会给出两种不同的基本形式。

语音散列法

有些词在不同的语言中有不同的发音。因此,它们最终的写法是不同的。例如,一个常见的印度姓氏如“Srivastava”也被拼写为“Shrivastava”、“Shrivastav”或“Srivastav”。因此,我们必须把一个特定单词的所有形式简化为一个单一的普通单词。

为了达到这个目的,我们将了解一种叫做语音哈希的技术。语音散列法将相同的音素(声音的最小单位)组合到一个桶中,并为所有变体赋予相同的散列码。所以,单词“color”和“colour”有相同的代码。

语音哈希是一种用于将具有不同变体但语音特征相同(即发音相同)的单词进行规范化的技术。

现在, Soundexes 是可以用来计算给定单词的哈希码的算法。语音哈希使用这些 Soundex 算法。算法因语言而异。美国的 Soundex 是最流行的 Soundex 算法,我们将使用它。此外,输入的单词来自哪种语言并不重要——只要单词听起来相似,它们就会获得相同的哈希代码。

拼音哈希是一个四字码。因此,让我们通过应用以下步骤来计算单词“Chennai”的散列码(也称为 Soundex)

  1. 保留单词的首字母——Soundex 的基本原理是,英语发音取决于辅音的首字母和模式。所以,C 变成了第一个字母。
  2. 去掉所有的元音。所以我们现在有了“CHNN”。
  3. 用数字替换辅音,如下所示(第一个字母后)
  • b,f,p,v → 1
  • c,g,j,k,q,s,x,z → 2
  • d,t → 3
  • l → 4
  • m,n → 5
  • r → 6
  • h、w、y→未编码/已移除

编码后,代码变成 C55。

4.如果原姓名中有两个或两个以上同号字母相邻(步骤 1 之前),只保留首字母;同样,由“h”或“w”分隔的具有相同数字的两个字母被编码为单个数字,而由元音分隔的这种字母被编码两次。这条规则也适用于第一个字母。现在,我们有两个 5,所以我们将它们合并成一个,得到 C5。

5.如果单词中的字母太少,我们无法分配三个数字,请添加零,直到有三个数字。如果我们有四个或更多的数字,只保留前三个。由于我们只有一个字母和一个数字,我们将在编码的末尾添加两个零,使其成为一个四字符代码。因此,我们得到 C500 作为“钦奈”的最终代码。

因此,我们看到像“Bengaluru”和“Bangalore”这样的城市名称的 Soundex 代码是相同的,B524,这就是我们的目标。

所以,我们看到了如何处理一个特定单词的不同发音。接下来,让我们看看如何处理拼写错误。

编辑距离

简而言之,编辑距离是将一个字符串转换为另一个字符串所需的最小编辑次数,即给定字符串到目标字符串。

现在,你一定想知道什么是编辑。因此,可能的编辑如下:-

  • 将一个字符插入给定的字符串。要将拼写错误的单词“Aquire”转换为正确的拼写“Acquire ”,我们需要在给定的拼写错误的字符串中插入字符“c”。
  • 从给定的字符串中删除一个字符。要将“necessary”转换为“必需的”,我们需要从给定的字符串中删除多余的“c”。
  • 给定字符串中字符的替换。为了将 Absense 转换成正确的形式 Absense,我们需要用字符 c 代替字符 s。

最常见的编辑距离算法是 Levenshtein 编辑距离,你可以在这里详细了解。还有另一个编辑选项叫做“转置操作”,你可以交换给定字符串的两个相邻字符。但是,该操作仅在damer au-Levenshtein编辑距离中可用。

拼写纠正器

拼写校正器是一个广泛使用的应用程序。如果您在电话上启用了“自动更正”功能,不正确的拼写将被正确的拼写替换。另一个例子是,当你使用谷歌这样的搜索引擎搜索任何东西,却打错了一个单词,它会提示正确的单词。拼写纠正是词汇处理的重要组成部分。在许多应用中,拼写校正形成了初始预处理层。

我们看到了如何计算两个单词之间的编辑距离。现在,我们将使用编辑距离的概念来制作拼写校正器。我们现在来看看如何制作著名的 Norvig 法术修正器。

我们需要大量拼写正确的文本。这个文本语料库也将作为我们的拼写校正器的字典搜索。在这里,文本“big.txt”的大型语料库只不过是一本书。这是古腾堡计划网站上以文本格式呈现的《夏洛克·福尔摩斯历险记》一书。

# function to tokenise words
def words(document):
 “Convert text to lower case and tokenise the document”
 return re.findall(r’\w+’, document.lower())# create a frequency table of all the words of the document
all_words = Counter(words(open('big.txt').read()))

我们将使用五个主要函数来查找单词的正确拼写,它们如下:

  1. edits_one() :函数创建与输入单词相距一个编辑距离的所有可能单词。这个函数创建的大多数单词都是垃圾,即它们不是有效的英语单词。例如,如果我们将单词’ laern ‘(单词’ learn ‘的拼写错误)传递给 edits_one(),它将创建一个列表,其中将出现单词’ lgern ‘,因为它是远离单词’ laern '的编辑。但这不是一个英语单词。只有一部分单词是真正的英语单词。
def edits_one(word):
 “Create all edits that are one edit away from `word`.”
 alphabets = ‘abcdefghijklmnopqrstuvwxyz’
 splits = [(word[:i], word[i:]) for i in range(len(word) + 1)]
 deletes = [left + right[1:] for left, right in splits if right]
 inserts = [left + c + right for left, right in splits for c in alphabets]
 replaces = [left + c + right[1:] for left, right in splits if right for c in alphabets]
 transposes = [left + right[1] + right[0] + right[2:] for left, right in splits if len(right)>1]
 return set(deletes + inserts + replaces + transposes)
  1. edits_two() :函数创建一个所有可能的单词的列表,这些单词与输入单词相差两个编辑点。这些话大部分也会是垃圾。
def edits_two(word):
 “Create all edits that are two edits away from `word`.”
 return (e2 for e1 in edits_one(word) for e2 in edits_one(e1))
  1. known(): 函数从给定单词列表中过滤出有效的英语单词。它使用频率分布作为使用种子文档创建的字典。如果使用 edits_one()和 edits_two()创建的单词不在词典中,它们将被丢弃。
def known(words):
 “The subset of `words` that appear in the `all_words`.”
 return set(word for word in words if word in all_words)
  1. possible_corrections(): 该函数获取输入单词,并使用上述三个函数返回给定输入单词的正确拼写。首先,它检查输入单词的拼写,如果拼写是正确的,也就是说,如果该单词存在于字典中,它不返回拼写建议,因为它已经是一个正确的字典单词。

如果拼写不正确,它将搜索与输入单词相差一个编辑的每个词典单词,并返回它们的列表。如果词典中没有与给定单词相距一个编辑点的单词,那么它将搜索相距两个编辑点的所有词典单词,并返回它们的列表。如果没有两个编辑之外的单词,输入的单词被返回,这意味着拼写纠正器找不到替代词。

def possible_corrections(word):
 “Generate possible spelling corrections for word.”
 return (known([word]) or known(edits_one(word)) or known(edits_two(word)) or [word])

5.**prob()😗*prob()函数将创建与每个建议的正确拼写相关联的概率,并返回具有最高概率的拼写,或者我们可以说,它采用建议的正确拼写并返回在我们的文本语料库中的输入单词中最频繁出现的拼写。

这就是为什么我们需要一个大的文本语料库,而不是一本字典。字典只包含所有正确英语单词的列表。但是,文本语料库不仅包含所有正确的单词,还可以用来创建所有这些单词的频率分布。

def prob(word, N=sum(all_words.values())): 
 “Probability of `word`: Number of appearances of ‘word’ / total number of tokens”
 return all_words[word] / N

现在,我们几乎完成了拼写校正器的构建。我们只需要把所有的代码片段放在一起,并把它们包装在一个新的函数中,这个函数使用到目前为止创建的所有函数。

def spell_check(word):
 “Print the most probable spelling correction for `word` out of all the `possible_corrections`”
 correct_word = max(possible_corrections(word), key=prob)
 if correct_word != word:
 return “Did you mean “ + correct_word + “?”
 else:
 return “Correct spelling.”

瞧啊。我们已经成功地创建了一个简单却非常有效的拼写纠正器。我们现在可以使用它来纠正任何给定文本语料库的拼写。

这就是第三部分的内容。我们已经在第 2 部分和第 3 部分中介绍了整个词汇处理过程。现在,我们将进入 NLP 的下一个主要部分——句法处理。干杯!

自然语言处理:使用 Spacy 和 Python 智能搜索文本

原文:https://towardsdatascience.com/natural-language-processing-document-search-using-spacy-and-python-820acdf604af?source=collection_archive---------4-----------------------

使用 Python 和机器学习从文本中提取有用信息

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在文本中搜索是自然语言领域中机器学习应用的关键焦点领域之一。

但是如果我们必须从一个大文档(100+页)中搜索多个关键词呢?此外,如果我们在我们的文档中进行了上下文搜索(搜索相似含义的关键字),该怎么办!*——*传统的“CTRL + F”解决方案要么需要很长时间来完成这项任务(或者在上下文搜索的情况下,将无法找到任何有意义的文本)。

本文将帮助读者理解我们如何使用 Spacy(一个强大的开源 NLP 库)和 Python 来使用机器学习解决这个问题。

数据预处理

构建任何基于机器学习的解决方案的第一步是预处理数据。在我们的例子中,我们将使用 Python 中的 PyPDF2 包预处理 PDF 文档,然后将整个文本转换成 Spacy 文档对象。对于没有使用过 Spacy 的读者来说,这是一个高级的 Python 开源库,用于各种 NLP 任务。对于有兴趣了解 Spacy 更多信息的用户,请参考此链接阅读文档并了解 Spacy 更多信息—https://spacy.io/

我们将首先加载 PDF 文档,清理文本,然后将其转换为 Spacy 文档对象。以下代码可用于执行此任务-

数据预处理

首先,我们必须加载 Spacy 的’ en_core_web_lg '模型,这是 Spacy 中提供的一个预先训练好的英语语言模型。Spacy 还提供了对多种语言的支持(更多信息可以在文档链接中找到)。此外,Spacy 有多种型号(小型、中型和大型),对于我们的情况,我们将使用大型型号,因为我们必须使用仅大型型号支持的单词向量。

setCustomBoundaries() '用作客户句子分割方法,与默认选项相反。同样的方法可以根据我们处理的单据进行修改。

一旦我们准备好了空间的文档对象,我们就可以进入下一步,处理需要在文档中搜索的输入查询(关键字)。

处理查询-查找相似的关键字

在进入编码部分之前,让我们看一下为了从我们正在搜索的文档中获得更准确的搜索结果而采用的更广泛的方法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

流程工作流

直到数据预处理阶段,我们已经将 PDF 文档文本转换为 Spacy 的文档对象。现在,我们还必须将我们的关键字转换为 Spacy 的文档对象,将它们转换为等价的向量形式((300,)维),然后使用余弦相似度来查找相似的关键字。最后,我们将有一个类似的关键字以及原始关键字的详尽列表,我们现在可以通过搜索我们的文档来生成准确的结果。

请参考以下代码来执行此任务-

生成相似的关键字

既然我们已经找到了与原始关键字上下文相似的单词,让我们开始最后的搜索部分。

通过文本搜索关键词

对于搜索,我们将使用 Spacy 的 Matcher 类的 PhraseMatcher 类。此时,重要的是要记住 Spacy 的文档对象不同于简单的 python 字符串,因此我们不能直接使用 if then else 来查找结果。

请参考以下代码来执行此任务-

在文本中搜索

上面的代码将搜索整个文本中的每个关键字,并在找到匹配的地方返回整个句子。

上述代码将生成以下输出-

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

搜索输出截图

您可以增加或减少想要为任何原始关键词查找的相似关键词的数量。此外,一旦在数据帧中获得结果,您可以简单地添加更多的逻辑来对结果进行排序(给精确的关键字匹配更多的权重,等等)。

注意:增加相似关键字的数量可能会增加整个程序的计算成本,因此应该明智地选择。

这就是你如何创建你自己的基于 ML 的 Python 程序来搜索任何文本。

在任何其他输入源(照片、网页等)的情况下。)你只需要定制数据预处理部分(OCR,网页抓取等。)和其余的逻辑应该执行得很好。

Python 中面向消费者满意度的自然语言处理

原文:https://towardsdatascience.com/natural-language-processing-for-consumer-satisfaction-in-python-e2b6d473efd1?source=collection_archive---------35-----------------------

消费者评论的数据挖掘和可视化

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由晨酿Unsplash 拍摄

一家公司如何更好地了解消费者对其产品的看法,以便改进产品?

营销咨询公司或内部团队一直在分析消费者的感知,以了解如何改进其产品、品牌和营销活动。但是解决这个问题的传统方法是深度访谈或调查,这些方法通常不遵循统计抽样技术,并且需要资源来收集数据。

在社交网络时代,我们每天都会产生大量的数据。例如,该公司的脸书页面可以作为收集评论、收件箱信息和反应的宝贵资源。其他数据来源是亚马逊和 Lowe’s 等电子商务平台上消费者的评论和评价。在这里,我将介绍如何使用 Python 和自然语言处理(NLP)来分析文本数据,并从这些评论中获得见解。

在下面,我们可以看到所使用的数据集,例如,它由来自不同零售商和产品(主要是冰箱)的 20473 条消费者评论组成。目标是(1)提取文本中编码产品功能、结构或购买过程的特征的单词;(2)确定销售渠道中的内容;(3)探索这些信息以产生洞察力,例如,哪些特征与正面评价最相关?最后,(4)生成数据可视化以传达结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

探索我们将使用哪些属性(列),可以看到我们有有用的信息,如零售商、类别、品牌、评论用户评级和文本评论本身。因此,我们可以考虑实现目标所需的步骤:

A.预处理和探索性分析:(1)清洗和标记文本;(2)统计总字数以识别特征为最常见的名词;(3)创建产品的二元估价(好/坏)。

B .情感分析:(1)识别有价值的特征进行发掘;(2)特征附近最频繁出现的形容词的词云可视化;(3)对时间特征的情感。

预处理和探索性分析

首先,我们导入库和 NLTK 模型。如果你没有这些库,你可以在终端中使用 pip 安装库来安装。注意使用 NLTK 包进行自然语言处理,熊猫用于数据操作, plotly袖扣用于数据可视化。

第一步是根据 review_id 列识别重复的评论并删除它们。69%的数据是重复的,这是一个很高的数字,应该由从网站上收集这些数据的负责团队进行验证。

在导入和探索之后,我们可以对评论进行预处理,将单词放在小写字母中,删除数字,删除停用词(连接词)并应用词汇标准化算法。这个过程使我们的文本标准化,以便使特征提取更有效,所以我们使“令人愉快的”和“享受”去“享受”,例如。

现在我们可以统计评论中的单词并识别词类(名词、形容词、动词、副词等。).通过这一步,我们将能够识别用名词表达的相关特征。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

在这里我们可以看到相关的特征,如冰箱、门、冰、冰箱、水、空间等。下一步是探索哪些情感与这些特征相关联。

情感分析

为了执行情感分析,我列出了在之前的分析中观察到的相关特征。我们将使用这个列表在数据集中创建其他属性:(1)标识每个评论上是否有相关特征的属性;(2)具有形容词(情感)和的列;(3)告诉我们评论是正面(≥4 星)还是负面(< 4 星)的属性。

现在可以搜索特征附近的单词和形容词,以了解人们对每个方面的看法。我还要强调的是,这个过程可以通过实施一个简单的过滤器,将您的品牌与其他品牌进行比较,从而导向一个特定的品牌或产品,但出于教育目的,我们在这个分析中包括了所有品牌。

在这里,我编写了三种不同的分析策略来聚合我们正在寻找的特征附近的文本,因此在下一步中,将对提取的文本进行计数。我们可以识别特征评论中的所有词(ruleAll),特征词右边的词(ruleNext),或者离特征 3 个词距离的特征附近的词(ruleNear)。

最后,我们编写了 wordcloud 可视化代码,它对前面的搜索算法返回的文本字符串中的单词进行计数。

现在我们可以看到结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

第一个来源于探索特征旁边的文字,这导致了文字制造者机器分配器,表明许多评论都与冰箱的这一方面有关。

更深入的分析是识别与单词“冰”相关的消极和积极情绪,这样我们可以从消费者对制冰机的感知中获得洞察力。下面左边的词云是基于正面评论中接近特征 ice 的词,其中观察到相关形容词,如 easybig、spatial、large表示消费者对大型制冰机的兴趣。

右边的词云捕捉了负面评论中接近于的词,这里我们可以看到形容词的突出显示,即增强了消费者对大型冰生产商的兴趣,但不太大,因为我们发现是对冰的差评。

同时,也有可能在差评中看到与 ice 相关的正面情绪,像 goodgreat ,这表明即使在差评中人们仍然可以指出产品的一个好的特性。

只要改变函数 aspectSentimentWordcloud()中的“方面”,就可以为任何其他特性复制相同的模型。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**(左)**作者在“ice”附近的正面评论中的单词| **(右)**作者在“ice”附近的负面评论中的单词

时间序列情感分析

正如我们在开始时看到的,数据集中有日期信息,可以用来让我们了解特定品牌、产品或功能的正面评论的分布情况。在这里,我展示了按日期计算正面评论的代码,并使用 plotly 交互图来可视化它。

在生成的图中,我们可以看到没有明确的长期趋势,因为回归线(trace1) 几乎没有变化。尽管如此,正面百分比线本身也存在表达上的变化,比如从 2019 年 9 月到 10 月,我们观察到的负面影响几乎只有 60%的正面评论,随后正面评论飙升至 90%。这个分析可以告知消费者对某个在此期间推出的产品的感知。

结论

在本文中,我想展示分析师或数据科学家如何使用 Python 工具处理、分析和可视化文本数据,以从消费者的感知中获得洞察力。

一旦来源是来自满意或不满意的消费者的大量评论和意见,而不是来自调查的封闭问题,使用这些工具不仅可以降低收集数据的成本,还可以获得自发的趋势和想法。

人们也可以用它来分析调查或深度访谈中的开放性问题。虽然数据量可能没有线上平台那么大。

我对小鸟的数据集表示感谢。如需获取数据和查看完整项目,您可以访问 https://github.com/claudioalvesmonteiro/nlp_birdie

自然语言处理:从西瓜盒子到单词嵌入

原文:https://towardsdatascience.com/natural-language-processing-from-watermelon-boxes-to-word-embeddings-4eb32e7dfd8a?source=collection_archive---------37-----------------------

使用单词嵌入的自然语言处理的强大发展

众所周知,人类不擅长随机应变。不管我们是否意识到这一点,我们做的每件事都有一定的模式。

我们用来交流的语言也不例外。所有的语言都遵循某种被称为句法的规则模式。

但是这有什么关系呢?

深度学习行业的很大一部分专注于一种名为的自然语言处理(NLP) 的东西。 NLP 是人工智能的一个子领域,专注于训练计算机处理人类语言。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

信用:猫王

自然语言处理始于 20 世纪 50 年代,当时哈佛的一名研究人员创造了一种叫做“西瓜盒”的机器。

它做了一件简单的事情…当一个人说“西瓜”这个词时,它可以探测到。

创造它的人认为 NLP 的未来是创造数千个盒子,每个盒子检测一个单词…

这在现在听起来很可笑,但在当时却是一项非常重要的发明。

从那以后,我们走过了漫长的道路,西瓜盒子现在已经被遗忘了很久。事实上,如果没有数以千计的方形西瓜出现,很难在网上找到任何关于它们的信息:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

信用:melonmold.com

现在,NLP 到处都在用。无论你使用的是谷歌翻译、Siri,还是语法——都有一个人工智能在后台使用 NLP 来理解你用什么语言交流。

所以最大的问题是:神经网络是如何变得如此擅长理解人类语言的?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

信用:igeeksblog.com

让我们从经典的全连接神经网络如何处理这个问题开始。

如果你想了解神经网络是如何工作的,可以看看 这篇文章

首先,神经网络只能接受数字作为输入。所以你不能只给它一堆文本来处理。你得把它转换成一个数值。

最初解决这个问题的方法是通过索引。基本上每个单词都会用它自己唯一的数字来表示。这个数字然后被一键编码。

这相当于给一个对化学一无所知的人一个基本周期表的单个单元格。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

就像桌子上的每个元素都有唯一的原子序数一样,神经网络看到的每个单词都有唯一的索引。

元素在周期表上的位置提供了很多信息。很明显,只有表格中的一个单元格,您会丢失那些有价值的信息。

同样,简单的全连接神经网络的问题是,人工智能没有这个词的上下文。

它不知道在它所查看的单词之前出现了什么单词,所以你不能指望它用那个单词做任何有价值的事情。

递归神经网络

NLP 的很多改进都是从递归神经网络(RNNs)开始的。它们非常擅长处理一系列数据(比如句子),因为它们使用内存来使用上下文。

你可以在这里了解递归神经网络如何工作

用我们的化学类比,这和给你整个周期表是一样的。现在,您有更好的机会根据元素所在的行和列来理解趋势。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

类似地,RNN 可以使用它正在分析的词周围的词来理解上下文并做出更好的预测。

RNNs 是一个重大的进步,可以更好地生成和分析文本。

Word2Vec

从那以后,NLP 有了更多的进展,出现了各种关于新的训练优化器、网络架构等的研究论文。

但是在所有这些中,NLP 最大的胜利之一是使用了像 Word2Vec 这样的嵌入层。

使用 RNNs,算法可以识别单词的上下文,但它不会真正理解每个单词。它只是看到一个随机的索引号。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

神经网络遗漏了关于每个单词的如此多的信息。

任何语言中的每个单词都有几个我们在理解该语言时下意识分析的属性。一个词可以是复数,可以是名词,可以有特定的动词时态,等等。

Word2Vec 确实如其名。它获取一个单词,并将其转换为向量表示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我将忠于我的周期表类比,展示使用 Word2Vec 这样的嵌入层处理 Word 的整个过程。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

索引氦给出了它独特的数字表示:它的原子序数。

将这个数字传递给经过训练的 Word2Vec 层,我们就可以得到氦的矢量表示。这将是原子量,电子配置,物理状态等。

这里有一个我创建的可视化,用来总结 Word2Vec 和 RNNs 对自然语言处理的影响的周期表类比:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过嵌入 Word2Vec 这样的层产生的矢量中最酷的部分之一是你可以可视化和量化单词之间的关系。

嵌入向量的维数取决于嵌入的大小(由程序员决定)。

当任何单词被转换成向量时,它的维数等于嵌入的大小。

然后,您可以在图表上绘制这些向量,并可视化各种单词之间的关系。

让我们以嵌入大小为 3 为例。它将生成 3D 矢量,我们可以在笛卡尔平面上绘制这些矢量:

在实践中,嵌入层比这大得多,但是你不能可视化超过 3 维的空间。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

*你可以立即看到这些向量位置的一些趋势。**相似的词在向量空间中位置相近。*我对矢量头部进行了颜色编码,以阐明示例中的聚类:

红色→ 地方

橙色→ 动词

黄色→

更有趣的是,单词之间精确的矢量转换背后也有意义。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

每个箭头颜色都是某种矢量变换,代表单词之间的关系。

以下是本例中矢量变换及其显示的关系的摘要:

***绿色:*国家→首都

***粉色:*不定式→过去式

蓝色:不定式→现在式

***紫色:*男性→女性

***棕色:*人→皇室

Word2Vec 向量是如何计算的

Word2Vec 通过学习从训练句子中预测单词来嵌入单词。

这个想法是,神经网络将学习为以类似方式使用的单词分配类似的权重。

拿下面这句话来说:

The ____ 正在跳跃。

空白单词可以是任何名词,如青蛙、人、狗等。

因此,相似的单词将具有相似的权重值,将它们连接到嵌入层中的每个节点。

你可以用余弦距离来衡量单词之间的相似度。相关单词将具有小的余弦距离。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由于单词是一次性编码的,嵌入层的权重变成了一个查找表,我们可以在其中找到该单词的矢量表示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

信用: Udacity

这就像一本字典,你提供你想要嵌入的单词的索引和它在权重矩阵中相应行的外观。

Word2Vec 的类型

即使在 Word2Vec 中,也有多种类型:连续单词包(CBOW)和 Skip-gram。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

信用:machinelearningmastery.com

在 CBOW 中,你取一个句子中某个窗口的单词,试着填空。 CBOW 获取上下文并生成单词。

Skip-gram 做的正好相反——它取一个单词,然后猜测它周围出现的单词。 Skip-gram 获取一个单词并生成其上下文。

直觉上,你会认为 CBOW 比 Skip-gram 更容易实现,因为两者之间的比率给了你更多的信息,而你需要猜测的更少。

有趣的是 Skip-gram 是实现 Word2Vec 的首选方式。只是看起来效果更好。

除了 Word2Vec,在嵌入层方面还有一些更有趣的进步。

另一种称为 Doc2Vec 的嵌入类型创建整个段落的矢量表示,顾名思义就是文档。

原帖:

* [## Mayank Jain - NLP:从西瓜盒子到单词嵌入

众所周知,人类不擅长随机应变。不管我们是否意识到,我们所做的一切都倾向于…

mayankjain.ca](https://mayankjain.ca/blog-posts/17)

如果你喜欢这篇文章:

  • Medium 上关注我,在 LinkedIn 上与我联系,了解我的最新工作进展!
  • 订阅我的时事通讯,跟随我的旅程!:

[## 注册我的每月更新!

注册以跟上我每月的进度,包括项目、会议、文章等等…

www.subscribepage.com](https://www.subscribepage.com/mayank)*

将 PDF 和 Gutenberg 文档格式转换为文本:生产中的自然语言处理

原文:https://towardsdatascience.com/natural-language-processing-in-production-converting-pdf-and-gutenberg-document-formats-into-text-9e7cd3046b33?source=collection_archive---------20-----------------------

在生产级自然语言处理(NLP )中最关键的是将流行的文档格式快速预处理成文本。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

企业中有大量不同的文档。资料来源:联合国人类住区规划署

据估计,世界上 70%–85%的数据是文本(非结构化数据)。大多数英语和欧盟商务数据格式为字节文本、MS Word 或 Adobe PDF。[1]

组织 web 显示一个dobePostscript 文档格式文档( PDF )。[2]

在这篇博客中,我详述了以下内容:

  1. 从 web 文件名和本地文件名创建文件路径;
  2. 将字节编码的古腾堡项目文件转换成文本语料库;
  3. 将 PDF 文档转换成文本语料库;
  4. 将连续文本分割成单词文本语料库。

将流行的文档格式转换为文本

1.从 web 文件名或本地文件名创建本地文件路径

以下函数将采用本地文件名或远程文件 URL 并返回一个文件路径对象。

#in file_to_text.py
--------------------------------------------
from io import StringIO, BytesIO
import urllib

def file_or_url(pathfilename:str) -> Any:
    *"""
    Reurn filepath given local file or URL.
    Args:
        pathfilename:

    Returns:
        filepath odject istance

    """* try:
        fp = open(pathfilename, mode="rb")  # file(path, 'rb')
    except:
        pass
    else:
        url_text = urllib.request.urlopen(pathfilename).read()
        fp = BytesIO(url_text)
    return fp

2.将 Unicode 字节编码文件转换成一个 o Python Unicode 字符串

您将经常遇到 8 位 Unicode 格式的文本 blob 下载(在浪漫的语言中)。您需要将 8 位 Unicode 转换为 Python Unicode 字符串。

#in file_to_text.py
--------------------------------------------
def unicode_8_to_text(text: str) -> str:
    return text.decode("utf-8", "replace")import urllib
from file_to_text import unicode_8_to_texttext_l = 250text_url = r'[http://www.gutenberg.org/files/74/74-0.txt'](http://www.gutenberg.org/files/74/74-0.txt') 
gutenberg_text =  urllib.request.urlopen(text_url).read()
%time gutenberg_text = unicode_8_to_text(gutenberg_text)
print('{}: size: {:g} \n {} \n'.format(0, len(gutenberg_text) ,gutenberg_text[:text_l]))

输出= >

CPU times: user 502 µs, sys: 0 ns, total: 502 µs
Wall time: 510 µs
0: size: 421927 

The Project Gutenberg EBook of The Adventures of Tom Sawyer, Complete by
Mark Twain (Samuel Clemens)

This eBook is for the use of anyone anywhere at no cost and with almost
no restrictions whatsoever. You may copy it, give it away or re-use
it under the terms of the Project Gutenberg License included with this
eBook or online at www.guten

结果是text.decode('utf-8') 可以在大约 1/1000 秒内格式化成一个包含一百万个字符的 Python 字符串。这一速度远远超过了我们的生产率要求。

3.将 PDF 文档转换为文本语料库。

“将 PDF 文档转换成文本语料库 ”是我为 NLP 文本预处理做的最麻烦也是最常见的任务之一。

#in file_to_text.py
--------------------------------------------
def PDF_to_text(pathfilename: str) -> str:
    *"""
    Chane PDF format to text.
    Args:
        pathfilename:

    Returns:

    """* fp = file_or_url(pathfilename)
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, laparams=laparams)
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    password = ""
    maxpages = 0
    caching = True
    pagenos = set()

    for page in PDFPage.get_pages(
        fp,
        pagenos,
        maxpages=maxpages,
        password=password,
        caching=caching,
        check_extractable=True,
    ):
        interpreter.process_page(page)

    text = retstr.getvalue()

    fp.close()
    device.close()
    retstr.close()

    return text
-------------------------------------------------------arvix_list =['[https://arxiv.org/pdf/2008.05828v1.pdf'](https://arxiv.org/pdf/2008.05828v1.pdf')
             , '[https://arxiv.org/pdf/2008.05981v1.pdf'](https://arxiv.org/pdf/2008.05981v1.pdf')
             , '[https://arxiv.org/pdf/2008.06043v1.pdf'](https://arxiv.org/pdf/2008.06043v1.pdf')
             , 'tmp/inf_finite_NN.pdf' ]
for n, f in enumerate(arvix_list):
    %time pdf_text = PDF_to_text(f).replace('\n', ' ')
    print('{}: size: {:g} \n {} \n'.format(n, len(pdf_text) ,pdf_text[:text_l])))

输出= >

CPU times: user 1.89 s, sys: 8.88 ms, total: 1.9 s
Wall time: 2.53 s
0: size: 42522 
 On the Importance of Local Information in Transformer Based Models  Madhura Pande, Aakriti Budhraja, Preksha Nema  Pratyush Kumar, Mitesh M. Khapra  Department of Computer Science and Engineering  Robert Bosch Centre for Data Science and AI (RBC-DSAI)  Indian Institute of Technology Madras, Chennai, India  {mpande,abudhra,preksha,pratyush,miteshk}@ 

CPU times: user 1.65 s, sys: 8.04 ms, total: 1.66 s
Wall time: 2.33 s
1: size: 30586 
 ANAND,WANG,LOOG,VANGEMERT:BLACKMAGICINDEEPLEARNING1BlackMagicinDeepLearning:HowHumanSkillImpactsNetworkTrainingKanavAnand1anandkanav92@gmail.comZiqiWang1z.wang-8@tudelft.nlMarcoLoog12M.Loog@tudelft.nlJanvanGemert1j.c.vangemert@tudelft.nl1DelftUniversityofTechnology,Delft,TheNetherlands2UniversityofCopenhagenCopenhagen,DenmarkAbstractHowdoesauser’sp 

CPU times: user 4.82 s, sys: 46.3 ms, total: 4.87 s
Wall time: 6.53 s
2: size: 57204 
 0 2 0 2     g u A 3 1         ]  G L . s c [      1 v 3 4 0 6 0  .  8 0 0 2 : v i X r a  Offline Meta-Reinforcement Learning with  Advantage Weighting  Eric Mitchell1, Rafael Rafailov1, Xue Bin Peng2, Sergey Levine2, Chelsea Finn1  1 Stanford University, 2 UC Berkeley  em7@stanford.edu  Abstract  Massive datasets have proven critical to successfully 

CPU times: user 12.2 s, sys: 36.1 ms, total: 12.3 s
Wall time: 12.3 s
3: size: 89633 
 0 2 0 2    l u J    1 3      ]  G L . s c [      1 v 1 0 8 5 1  .  7 0 0 2 : v i X r a  Finite Versus Infinite Neural Networks:  an Empirical Study  Jaehoon Lee  Samuel S. Schoenholz∗  Jeffrey Pennington∗  Ben Adlam†∗  Lechao Xiao∗  Roman Novak∗  Jascha Sohl-Dickstein  {jaehlee, schsam, jpennin, adlam, xlc, romann, jaschasd}@google.com  Google Brain

在这个硬件配置上,“将 PDF 文件转换成 Python 字符串需要 150 秒。对于 Web 交互式生产应用程序来说不够快。

您可能希望在后台设置格式。

4.将连续文本分割成单词文本语料库

当我们阅读https://arxiv.org/pdf/2008.05981v1.pdf’时,它返回的是没有分隔字符的连续文本。使用来自 **wordsegment,**的包,我们把连续的字符串分成单词。

from wordsegment import load,  clean, segment
%time words = segment(pdf_text)
print('size: {:g} \n'.format(len(words)))
' '.join(words)[:text_l*4]

输出= >

CPU times: user 1min 43s, sys: 1.31 s, total: 1min 44s
Wall time: 1min 44s
size: 5005'an and wang loog van gemert blackmagic in deep learning 1 blackmagic in deep learning how human skill impacts network training kanavanand1anandkanav92g mailcom ziqiwang1zwang8tudelftnl marco loog12mloogtudelftnl jan van gemert 1jcvangemerttudelftnl1 delft university of technology delft the netherlands 2 university of copenhagen copenhagen denmark abstract how does a users prior experience with deep learning impact accuracy we present an initial study based on 31 participants with different levels of experience their task is to perform hyper parameter optimization for a given deep learning architecture the results show a strong positive correlation between the participants experience and then al performance they additionally indicate that an experienced participant nds better solutions using fewer resources on average the data suggests furthermore that participants with no prior experience follow random strategies in their pursuit of optimal hyperparameters our study investigates the subjective human factor in comparisons of state of the art results and scientic reproducibility in deep learning 1 introduction the popularity of deep learning in various elds such as image recognition 919speech1130 bioinformatics 2124questionanswering3 etc stems from the seemingly favorable tradeoff between the recognition accuracy and their optimization burden lecunetal20 attribute their success t'

你会注意到单词切分完成了相当精确的单词切分。有一些错误,或者我们不想要的单词, NLP 文本预处理清除掉。

阿帕奇语段速度很慢。对于少于 1000 字的小文档,它几乎不能满足生产的需要。我们能找到更快的分割方法吗?

4b。将连续文本分割成单词文本语料库

似乎有一种更快的方法来“将连续文本分割成单词文本的语料库”

正如以下博客中所讨论的:

[## 符号拼写与 BK 树:模糊字符串搜索和拼写检查快 100 倍

传统智慧和教科书说 BK 树特别适合拼写纠正和模糊字符串搜索…

towardsdatascience.com](/symspell-vs-bk-tree-100x-faster-fuzzy-string-search-spell-checking-c4f10d80a078)

SymSpell 快 100-1000 倍。哇!

注:编辑:2020 年 8 月 24 日沃尔夫·加贝指出值得称赞

SymSpell 博客文章中给出的基准测试结果(快 100-1000 倍)仅指拼写纠正,而非分词。在那篇文章中,SymSpell 与其他拼写纠正算法进行了比较,而不是与分词算法进行比较。2020 年 8 月 23 日

此外,从 Python 调用 C#库还有一种更简单的方法:https://stack overflow . com/questions/7367976/calling-a-C-sharp-library-from-Python—Wolfe Garbe 8/23/2020

注:编辑日期:2020 年 8 月 24 日。我打算试试 Garbe 的 C##实现。如果我没有得到相同的结果(很可能如果我得到了),我将尝试 cython port,看看我是否能作为管道元素适合 spacy。我会让你知道我的结果。

但是在 C# 中实现。因为我不会掉进无限的老鼠洞:

  • 把我所有的 NLP 转换成 C# 。不可行的选择。
  • Python 调用 C# 。我和 Python 团队的两位工程师经理谈过。他们拥有 Python-C# 功能,但是它涉及到:

注意:

  1. 翻译成VB-香草;
  2. 人工干预和翻译必须通过再现性测试;
  3. VB -vanilla 翻译成C
  4. 手动干预和翻译必须通过重复性测试。

相反,我们使用一个到 Python 的端口。下面是一个版本:

def segment_into_words(input_term):
    # maximum edit distance per dictionary precalculation
    max_edit_distance_dictionary = 0
    prefix_length = 7
    # create object
    sym_spell = SymSpell(max_edit_distance_dictionary, prefix_length)
    # load dictionary
    dictionary_path = pkg_resources.resource_filename(
        "symspellpy", "frequency_dictionary_en_82_765.txt")
    bigram_path = pkg_resources.resource_filename(
        "symspellpy", "frequency_bigramdictionary_en_243_342.txt")
    # term_index is the column of the term and count_index is the
    # column of the term frequency
    if not sym_spell.load_dictionary(dictionary_path, term_index=0,
                                     count_index=1):
        print("Dictionary file not found")
        return
    if not sym_spell.load_bigram_dictionary(dictionary_path, term_index=0,
                                            count_index=2):
        print("Bigram dictionary file not found")
        returnresult = sym_spell.word_segmentation(input_term)
    return result.corrected_string%time long_s = segment_into_words(pdf_text)
print('size: {:g} {}'.format(len(long_s),long_s[:text_l*4]))

输出= >

CPU times: user 20.4 s, sys: 59.9 ms, total: 20.4 s
Wall time: 20.4 s
size: 36585 ANAND,WANG,LOOG,VANGEMER T:BLACKMAGICINDEEPLEARNING1B lack MagicinDeepL earning :HowHu man S kill Imp acts Net work T raining Ka nav An and 1 an and kana v92@g mail . com ZiqiWang1z. wang -8@tu delft .nlM arc oLoog12M.Loog@tu delft .nlJ an van Gemert1j.c. vang emert@tu delft .nl1D elf tUniversityofTechn ology ,D elf t,TheN ether lands 2UniversityofC open hagen C open hagen ,Den mark Abs tract How does a user ’s prior experience with deep learning impact accuracy ?We present an initial study based on 31 participants with different levels of experience .T heir task is to perform hyper parameter optimization for a given deep learning architecture .T here -s ult s show a strong positive correlation between the participant ’s experience and the fin al performance .T hey additionally indicate that an experienced participant finds better sol u-t ions using fewer resources on average .T he data suggests furthermore that participants with no prior experience follow random strategies in their pursuit of optimal hyper pa-ra meters .Our study investigates the subjective human factor in comparisons of state of the art results and sci entific reproducibility in deep learning .1Intro duct ion T he popularity of deep learning in various fi eld s such as image recognition [9,19], speech [11,30], bio informatics [21,24], question answering [3] etc . stems from the seemingly fav or able trade - off b

Python 中实现的 SymSpellpy 大约快了 5 倍。我们没有看到 100-1000 倍的速度。

我猜 SymSpell-C# 是在比较用 Python 实现的不同分割算法。

也许我们看到的加速是由于 C# ,一种编译过的静态类型语言。由于 C#C 的计算速度差不多,我们应该期待 C#Python 实现快 100-1000 倍。

注意:有一个 spacy 流水线实现 spacy_symspell,直接调用 SymSpellpy。我建议你不要使用 spacy_symspell。Spacy 首先生成令牌作为流水线的第一步,这是不可变的。 spacy_symspell 从分割连续文本生成新文本。它不能在空间中生成新的令牌,因为空间已经生成了令牌**。。一个** 空间管道工作于一个令牌序列,而不是一个文本流**。人们将不得不衍生出一个改变了的版本。何必呢?代替将连续文本分割成单词文本语料库。然后更正单词中嵌入的空格和带连字符的单词。做任何其他你想做的原始清洁。然后将原始文本输入到空间**。

我显示**空间 _ 符号拼写。**再一次我的建议是 不要 使用它。

import spacy
from spacy_symspell import SpellingCorrector def segment_into_words(input_term):
nlp = spacy.load(“en_core_web_lg”, disable=[“tagger”, “parser”])
corrector = SpellingCorrector()
nlp.add_pipe(corrector)

结论

在以后的博客中,我会详细介绍许多常见和不常见的**快速文本预处理方法。**此外,我将展示从移动 SymSpellpycython 的预期加速。

在“将 X 格式转换成文本语料库”的世界中,您需要支持更多的格式和 API。

我详细介绍了两种更常见的文档格式, PDF古腾堡 项目格式。另外,我给出了两个 NLP 实用函数segment_into_wordsfile_or_url.

我希望你学到了一些东西,并且可以使用这个博客中的一些代码。

如果你有一些格式转换或者更好的软件包,请告诉我。

参考

[1] 我们每天会产生多少数据?

[2]https://en.wikipedia.org/wiki/PDF

【3】将 DNA 序列分割成‘单词’

4 个基本正则表达式操作符简化了自然语言处理

原文:https://towardsdatascience.com/natural-language-processing-made-simpler-with-4-basic-regular-expression-operators-5002342cbac1?source=collection_archive---------56-----------------------

了解四种基本的常规操作,以清理几乎所有类型的可用数据

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图为苏珊尹Unsplash

用机器学习和深度学习来构建自然语言处理项目总是很棒的。然而,在我们开始构建我们的模型之前,我们遇到了一个非常无聊但重要的问题。

在数据收集和探索性数据分析步骤之后,我们必须立即处理令人厌烦的预处理步骤。显然,我们可用的大多数数据并不清晰,我们必须对其进行处理以提高数据集的质量,从而从构建的模型中获得更有效的结果。

今天,我们将看看带有四个内置函数的正则表达式是如何成为最佳解决方案的。正则表达式是一个内置的标准库模块,可用于清理和预处理数据。下面的简单命令可以用来导入正则表达式模块。

import re

在开始之前,让我们先了解正则表达式模块和一些基础知识,以便更直观地理解进一步的概念。

正则表达式:

正则表达式是字符串,其语法允许它们处理其他形式的文本数据中的模式。re 模块用于解析文本数据,不需要额外安装。

GIF 来自 GIPHY

正则表达式文档提供的常见模式列表非常庞大。我将提供清理数据所需的更简短的形式。这些是我唯一用过的。我会少用一些其他的。

因此,我发现与其他操作相比,用于匹配文本数据的一些常见模式是最有用的,如下所示:

  1. \d: 匹配任何 Unicode 十进制数字(即 Unicode 字符类别[Nd]中的任何字符)。这包括[0-9],以及许多其他数字字符。如果使用了[ASCII](https://docs.python.org/3/library/re.html#re.ASCII)标志,则只有[0-9]匹配。
  2. \D: 匹配任何不是十进制数字的字符。这是\d的反义词。如果使用了[ASCII](https://docs.python.org/3/library/re.html#re.ASCII)标志,这相当于[^0-9]
  3. \s’: 匹配 Unicode 空白字符(包括[ \t\n\r\f\v],以及许多其他字符,例如许多语言中排版规则要求的不间断空格)。如果使用了[ASCII](https://docs.python.org/3/library/re.html#re.ASCII)标志,则只有[ \t\n\r\f\v]匹配。
  4. ‘\S’: 匹配任何不是空白字符的字符。这是\s的反义词。如果使用了[ASCII](https://docs.python.org/3/library/re.html#re.ASCII)标志,这相当于[^ \t\n\r\f\v]
  5. ‘\w’: 匹配 Unicode word 字符;这包括任何语言中单词的大部分字符,以及数字和下划线。如果使用了[ASCII](https://docs.python.org/3/library/re.html#re.ASCII)标志,则只有[a-zA-Z0-9_]匹配。
  6. ‘\W’: 匹配任何不是单词字符的字符。这与\w相反。如果使用了[ASCII](https://docs.python.org/3/library/re.html#re.ASCII)标志,这相当于[^a-zA-Z0-9_]。如果使用了[LOCALE](https://docs.python.org/3/library/re.html#re.LOCALE)标志,则匹配当前语言环境中既不是字母数字也不是下划线的字符。
  7. '+或’:* 执行贪婪匹配。
  8. 'a-z**'😗*匹配小写组。
  9. 'A-Za-z**'😗*匹配大小写英文字母。
  10. '0–9**'😗*匹配从 0 到 9 的数字。

要了解更多关于这些常见图案的信息,以及如何搭配它们以发现更多图案和风格,请访问官方网站此处

正则表达式函数和方法:

在本节中,我们将讨论四种正则表达式方法,它们可以用来解决数据清理和数据预处理的大多数常见问题。正则表达式函数与正则表达式模式一起使用,对我们拥有的文本数据执行特定的操作。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

艾德·罗伯森Unsplash 拍摄的照片

现在,让我们通过下面的文本示例更详细地分析如何使用这个模块,以及如何准确地使用 re 模块来执行适当处理和解析文本数据所需的各种操作。我只是用一些随机的不规则句子组成了一个随机的文本样本。你可以用和我一样的句子,或者随便编一个句子,然后跟着学。

文本示例如下所示:

sentence = "Machine Learning is fun. Deep learning is awesome. Artificial Intelligence: is it the future?"

我们将用于数据预处理的函数是以下四个基本的正则表达式操作—

  1. re.findall()
  2. 重新拆分()
  3. re.sub()
  4. 重新搜索()

使用上述四个函数,几乎可以完成任何自然语言任务和文本数据的数据预处理。所以,事不宜迟,让我们开始分析这些功能,以及如何利用它们。

  • re.findall()

上面的方法返回所有匹配的列表。如果没有找到匹配,则返回一个空列表。

让我们试着找出所有以大写字母开头的单词。下面的代码块可用于以下过程—

capital = re.findall("[A-Z]\w+", sentence)
print(capital)

这应该会给我们以下输出[‘机器’,‘学习’,‘深度’,‘人工’,‘智能’]。

如果你想知道文本数据中有多少个句号或句号,你可以使用两个命令中的任何一个

1\. len(re.findall("[.]", sentence))
2\. len(re.findall("\.", sentence))

上面的两个命令都应该给出结果 2,因为我们总共有两个周期。backlash '\ '命令用于一个分隔符,只查找句点,而不执行另一个正则表达式操作。

  • re.split()

这个函数可以用来相应地拆分文本,只要有匹配,就会返回一个数据列表。否则返回一个空列表。

让我们执行一个拆分操作,得到一串由句点分隔的句子。下面的命令将是这个操作。

re.split("\.", sentence)

该操作将返回以下句子列表。

['Machine Learning is fun',
 ' Deep learning is awesome',
 ' Artificial Intelligence: is it the future?']

如果你想用句点和问号来分割,那么请执行下面的命令。

re.split("[.?]", sentence)
  • re()

以下函数在找到匹配项时执行替换操作。如果没有找到匹配,则模式保持不变。

如果你想用解释代替所有的句号和问号,你可以使用下面的命令

re.sub("[.?]", '!', sentence)

函数中的第一个位置是要替换的项目。第二个位置是您指定用什么来替换选择的位置。最后和第三个位置是要执行替换操作的句子或文本数据。

执行上述操作后,您应该会看到下面的句子。

'Machine Learning is fun! Deep learning is awesome! Artificial Intelligence: is it the future!'
  • re.search()

该函数查找特定单词、标点符号或选定项目的第一个匹配项,并相应地返回操作。如果没有找到匹配,则返回 none 类型值。

如果我想找到单词“fun”的起始字符和结束字符的位置在文本中,然后我可以运行下面的命令。

x = re.search("fun.", sentence)
print(x.start())
print(x.end())

上述代码块将返回 20 和 24 的输出。这个结果告诉我们,f 的位置是 20,而。是 24。我强烈推荐您使用这个功能尝试更多的操作。

这样,我们就完成了常规行动的主要部分。继续尝试本模块,以了解与本主题相关的更复杂的细节。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由 Giammarco BoscaroUnsplash 拍摄

结论:

在本文中,我们已经涵盖了机器学习的大多数数据集的预处理所需的大多数重要模式。我们还可以将从这篇文章中学到的知识用于网络抓取以及其他需要清理数据的活动。在 python 中使用正则表达式模块在较小程度上简化了这个枯燥的过程。

利用所有提供的模式和四个特定的函数通常足以执行几乎任何预处理操作,但是可以从正则表达式官方网站的这里的查看更多这些操作。

看看我的其他一些文章,你可能也会喜欢读。

[## 带有完整代码片段和有用链接的 5 个最佳 Python 项目创意!

为 Python 和机器学习创建一份令人敬畏的简历的 5 个最佳项目想法的代码片段和示例!

towardsdatascience.com](/5-best-python-project-ideas-with-full-code-snippets-and-useful-links-d9dc2846a0c5) [## 人工智能是破解宇宙奥秘的关键,下面是原因!

人工智能、数据科学和深度学习的工具是否先进到足以破解人类大脑的秘密

towardsdatascience.com](/artificial-intelligence-is-the-key-to-crack-the-mysteries-of-the-universe-heres-why-56c208d35b62) [## OpenCV:用代码掌握计算机视觉基础的完全初学者指南!

包含代码的教程,用于掌握计算机视觉的所有重要概念,以及如何使用 OpenCV 实现它们

towardsdatascience.com](/opencv-complete-beginners-guide-to-master-the-basics-of-computer-vision-with-code-4a1cd0c687f9) [## 迷失在密林中:用简单的代码对机器学习中稀疏性的直觉!

为什么 ML 需要稀疏性?理解稀疏性的核心概念。

towardsdatascience.com](/lost-in-a-dense-forest-intuition-on-sparsity-in-machine-learning-with-simple-code-2b44ea7b07b0) [## 在不知道任何编码的情况下,在可教机器上免费训练机器学习模型!

不需要编码,不需要注册,没有额外的东西,只是你的浏览器。训练计算机识别您的…

medium.com](https://medium.com/illumination-curated/train-machine-learning-models-without-knowing-any-coding-for-free-on-teachable-machine-51d69657c6e5)

谢谢你们坚持到最后。我希望你们都喜欢阅读这篇文章。祝大家度过美好的一天!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值