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

NHL球员评级与NLP文本分类传统方法

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

使用标准和高级曲棍球统计数据的 NHL 球员评级

原文:https://towardsdatascience.com/nhl-player-rating-using-standard-and-advanced-hockey-stats-af2a9537909e?source=collection_archive---------9-----------------------

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

玩 EA sports (EAS) NHL(或众所周知的 Chel)这些年来,我经常想知道他们是如何得出他们的玩家评级的。根据每个球员的简历和个人资料,总得分(通常在 70 到 100 之间)是由每个球员的各种参数组合而成的。例如,速度、加速度、击球力量和击球准确度(或类似)、球棍处理能力、耐力、攻击性、强度等等。然而,在现实中,你如何衡量强度或侵略性,甚至坚持处理能力,以至于你可以在与其他人的比较中得分?EAS 分级系统的整个概念(对于他们所有的体育比赛)是一个鲜为人知的秘密。但它确实让我想知道是否有可能建立我自己的玩家评级系统(让我们称之为 Sigmoid 玩家评级;SPR)只使用优秀的老玩家指标。在之前的一篇文章中,我制作了一个模型,使用各种表现指标来预测球员工资。这里,我将使用相同的性能数据集来生成玩家评级。

数据集

使用的最终数据集是传统和高级玩家指标的组合。传统的统计数据涉及进球和助攻(总得分)、加减分、点球时间和冰上时间等指标,而高级球员指标则更多地涉及球员行为和控球。利用 Python 的 beautifulsoup 库,我刮到了更多传统的统计数据(比如进球、助攻、积分等。)来自 www.Hockey-reference.com 的,而高级指标则由 www.corsica.hockey 提供。科西嘉曲棍球的高级曲棍球统计从 2008 年开始,因此,我有近 2000 名球员的数据,跨越 2008 年至 2018 年。需要注意的是,我只考虑了游戏处于平均水平时的高级统计数据。数据被清除掉丢失的值,并被传入 Pandas 进行分析。虽然,我计划最终达到它,这个评级系统只适用于运动员,而不是守门员。守门员的统计和溜冰者的统计非常不同。

模型概念

我熟悉其他一些玩家的评级方法,我的想法建立在那些聪明的评级系统之上。基本上,我们获取单个参数,对每个参数应用一个权重,然后对它们求和。本质上,该模型是单个加权参数的总和。最难的部分是确定哪些是最重要的参数,以及应该给每个参数什么权重。从我之前的帖子可以看出,使用随机森林分类器可以确定一些更重要的特征。因此,我将使用其中的一些功能。每个参数权重的选择有些随意。我可以使用 EAS 评级作为事实,并尝试使用一些机器学习方法来预测权重。虽然这似乎不是一个坏主意,但这些评级有太多的未知。它们真的是基于玩家的衡量标准,还是通过某种人为因素测量设备神奇地计算出来的?他们的收视率是基于上一季的,还是几季的平均值?他们的算法每年都会改变吗?对我来说,探索这条路线有太多的不确定性。因此,我提出了我自己的权重,在我看来,这似乎很好。

将所有选定的参数加在一起是一个好的开始,但这并不意味着结果在空间上是连续的。什么时候我们达到了最大值 100?也许下个赛季,有人超过了 100 分,这意味着前一年的收视率已经过时了。为了克服这个连续性问题,我们可以利用 Sigmoid 函数,它在下面的公式中描述,

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

概率 P 被描述为输入变量 *x,*的函数,其中 z 是由常数β0 描述的多项式表达式,权重 w,其中输入参数 x 用于从 i=1 到 n 的所有包含参数。用图形表示,这可以如图 1 所示。

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

Fig1: A standard Sigmoid function where the sum of weighted parameters can be represented as a probability value

可以看出,S 曲线充当概率曲线,并且渐近地接近 0 和 100,并且在 50 处穿过 y 轴。Sigmoid 函数主要用于机器学习逻辑回归问题,在给定一组独立输入参数的情况下,通过将其从优势空间的对数转换到概率空间来识别因变量的二分法分类。

同时,我们已经有了预先确定的权重,我们不打算在这里对任何东西进行分类,我们仍然可以利用通过标准 Sigmoid 函数传递参数的多项式组合。从图 1 可以看出,随着值接近+∞和-∞,对 y 轴的灵敏度降低。本质上,玩家将具有介于 50 和 99.9(递归地)之间的评级,因为每个玩家的权重之和应该大于零。

高级曲棍球统计术语词汇

我假设读者理解基本曲棍球统计数据的概念,如得分(进球+助攻)、平均上场时间(每场)、盖帽、放弃、带走、命中、罚分、罚分、赢分、输分。但是,也许有一些更高级的指标是外来的,所以我将简要解释它们的含义。

CF%: CF 代表“Corsi For”,这是当一名球员在冰上时该球员的球队产生的射门次数,与“Corsi Against”(CA)相对,这是当该球员在冰上时对方球队产生的射门次数。CF%简单来说就是 CF / (CF + CA)。

CFQoC:比赛平均 CF%的质量。数字越高,竞争程度越高。关于它的解释,这是一个有些争议的统计数据,但我喜欢它被用在 OZS 的上下文中(见下文)。

CFQoT:这是玩家的队友的 CF%。它表明了一个球员相对于他的队友对整体比赛的贡献。通常这是一个很好的指标,可以看出某个球员是否让他周围的球员变得更好。

OZS:进攻区开始。给定球员在进攻区域开始移动的次数百分比。

PDO:这不是一个首字母缩写词,是由曲棍球博客作家维克·法拉利起的名。这只是运气的代表。它是球员在冰上时的射门百分比加上他所在球队的扑救百分比。更多精彩文章点击此处。

xGF%:的预期目标与的预期目标的比率。预期目标仅仅是给定射门得分的可能性。它提供了对拍摄质量的判断。因此,xG 值为 0.2,意味着射门的概率为 20%。从本质上讲,这里的高得分球员都有高质量的机会。

DPS:防守点股。由 Hockeyreference.com 设计的三个标准之一(其他标准是进攻得分份额和守门员得分份额),使用边际进球得分和边际进球得分的概念为球员的每一分分配一个分数。获得 DPS 比 OPS 更难,因此防守型前锋和 D-men 比大多数进攻型前锋有更高的 DPS。更多信息见链接

该算法

这里的 python 代码片段(图 2)显示了在堆叠单个参数(GSS_adj)并通过 Sigmoid 函数传递它们之前,我所使用的算法和权重。

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

该算法背后的思想相当复杂,在这篇文章中,我们将尽可能详尽地解释这一切。相反,你可以在我的 Github 上找到更多。我会说一些事情;

1)我用分数来衡量成功。我不区分进球,第一次和第二次助攻。对我来说,不管你在哪里,做了什么,如果你为目标做出了贡献,那么你就是富有成效的。一个进球是如何得分的完全取决于具体情况,并且因进球而异。

2)计算权重,使得平均而言,堆叠的“GSS_adj”中的大部分权重(50%)来自点数(生产率),“defn”约占35%(责任),“toi”约占~8%(耐力),其他参数构成其余部分(杂项)。

3)只考虑给定赛季 10 场以上的球员。

4)玩家的评级基于通过 82 场游戏预测的统计数据。

等级

以下总体评级(SPR)是过去三年(2016 年、2017 年、2018 年)个人年度评级的加权平均值,因此,玩了所有三年的玩家的个人年度评级在前一年、两年前、三年前分别加权分布为 50%、30%和 20%。

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

对于在过去三年中只打了两个赛季的球员,最近一年的总体评分权重为 60%,最老的一年为 40%。最近三年只有一个赛季的球员,没有加权。考虑到表 1,这里出现的一些名字并不令人惊讶。一些名字不见了,包括 Auston Matthews,Mitch Marner,Nathan MacKinnon,Mikko Rantanen,Gabe Landeskog 和 Johnny Gaudreau。尽管他们去年都表现强劲,但这是一个加权平均值,因此前几年对总体评分略有限制,但他们的得分在 87 至 90 分之间,相当可观。鉴于它们今年的表现,它们 2019 年的 SPR 值将会更高。需要注意的是,马特-巴尔扎尔和叶夫根尼-达多诺夫只踢了一个赛季。

与 EA Sports 相比

所以,让我们来验证一下。虽然 EAS 的评级不一定是真理,但这是促使我首先制作自己的评级系统的原因,因此将这里的总体评级与 EAS 的评级进行比较似乎是正确的。应该重申的是,我不是要复制 EAS,但是我们需要一些基准来比较。图 4。显示 EAS 玩家评级(2018-2019 版,但评级基于 2017-2018 赛季)作为每个 EAS 评级大于 73 (99%的数据)的玩家的 SPR 的函数。R2 值为 0.76,具有很强的统计学显著相关性(r = 0.87,P 值= 0),这意味着 76%的 EAS 评级可变性可以用 SPR 来解释。RMSE 为 2.6,最佳拟合线幅度为 0.60,截距为 32.5。从小到大有少量的同方差。本质上,SPR 倾向于高估约 82 以上的 EAS(即最佳拟合线穿过 1–1 线的位置),低估以下的 EAS,但总体而言,存在良好的相关性。

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

Fig 4. EAS ratings as a function of SPR with best fit line, and 1–1 line plotted for comparison

考虑比较的另一种方法是检查每个评级人群的分布关系。图五。显示了 SPR 和 EAS 的分布图以及 KDE 曲线。可以看出,除了 SPR 更宽之外,两种分布在形状上相似,具有双峰结构。我们可以测试这两个平均值之间的差异是否具有统计学意义。通过这样做,我们可以研究 SPR-EAS 分布是否代表相同的分布。这里,我们将 P 值显著性阈值设置为 0.05(或 5%)。

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

Fig 5. Distributions and KDE’s for SPR and EA Sports values

P 值越低,获得与零假设为真时观察到的结果相似的结果的概率越低(因此,它不是偶然发生的)。这两种分布都不属于正态分布。

然而,我们可以利用中心极限定理(CLT ),从每个分布中随机抽取样本。CLT 指出,对于抽取的足够大量的样本,假设样本过程是随机的,并且每个抽取的样本都是独立的(即一个玩家的评级不会影响另一个),那么最终的分布将是平均值附近的正态分布,我们可以对其进行假设检验。下面是这样一个例子,从每个分布中随机抽取 500 个样本(替换),计算平均值。这个过程重复约 527 次(SPR 和 EAS 数据集的长度),以确保正常(图 6。).

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

Fig 6. Sampling distributions of SPR and EA Sports values

因为我们有两个正态分布,我们现在可以进行假设检验。由于两个分布之间的方差不同,我们进行了韦尔奇 T 检验。无效假设是 SPR 和 EAS 评级之间的平均评级之间没有关系。在进行假设检验时,P 值= 0(即<0.05) and Cohen’s D value > 2 ),这意味着我们应该拒绝零假设,并且在抽样 SPR 和 EAS 评级均值之间存在很大的统计显著差异。此外,还进行了 Kolmogorov-Smirnov 检验,以确定是否可以从同一分布中抽取 2 个随机样本。这也证明了 P 值=0,也得出两个分布不同的结论。

总的来说这意味着什么?尽管我们发现 SPR 和 EAS 值之间有很强的相关性,但分布被认为是彼此非常不同的。这很好,如果他们来自同一个发行版,那么我也可以只使用 EAS 评级,这不是这里的重点!

模型问题

这个模型有几个地方出了问题,可以改进。与 EAS 相比,这个模型低估了防守型的防守队员。我需要想办法给这些球员更多的信任。他们往往有良好的“责任”价值观,但由于他们没有贡献分数,因此很可能会错过机会,尽管他们对团队的整体贡献很重要。另一个问题是 82 场比赛的预测。很难证明如果一个球员只打了 48 场比赛,然后受伤错过了剩下的赛季,他会取得什么成就。选择投射到 82 场比赛是为了让每个人都在相同的出场频率上被比较。它的工作方式与计算每场游戏费率的“选择指标”值相同。然而,谁能说一个特定的球员会继续得分,击球,得分等等。考虑到赛季的长度和球员的疲劳,或者随着时间的推移,速度会减慢。通过考虑一个球员的统计数据是如何随时间变化的,可以得到某种基线。这是我在未来版本中可能会考虑的事情。

结论

虽然这很好地预测了每个玩家的评分,但我们必须记住这只是一个模型。它没有对错之分,只是提供了一个真相的“暗示”。这里有一些东西,我认为是构成一个曲棍球运动员的重要特征,如果有的话,但是这些选择可能不适合其他人。然而,我们已经看到,使用 Sigmoid 函数可以很好地构建这样的模型,如果 EAS 使用类似的方法,我不会感到惊讶。如果你对 2017-2018 赛季结束时的完整评级感兴趣,你可以在我的 Github 资源库上找到它们作为 2018.csv。感谢阅读!

尼古拉斯·凯奇——虚假的泳池救星?

原文:https://towardsdatascience.com/nicholas-cage-pool-saviour-9c13feafff6f?source=collection_archive---------17-----------------------

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

Photo by Brooklyn Morgan on Unsplash

测试虚假的相关性

好吧,我坦率地告诉你,我不完全确定我在这里发现了什么。不知何故,我觉得在我周末做的这个有点仓促的分析背后有一个秘密的意义。不知何故,在某个地方,电影中尼古拉斯·凯奇的魔力并不局限于我的内心深处,但事实上,就像标题图片中尼古拉斯·凯奇在 Con Air 的华丽鬃毛一样,他涵盖了整个世界。让我们来看看我可能不应该做的事情。如果你想跳到精彩的部分,你要找的图表就在页面的一半,非常有趣。

好吧,我们从头开始…

在你漫游互联网的时候,你可能会碰到这个有趣的图表。

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

from: http://tylervigen.com

这个图表和其他类似的 tylervigen.com 图表的目的是教育人们相信相关性等于因果关系的谬论。现在,虽然尼古拉斯·凯奇出演的电影数量和掉进游泳池淹死的人数之间看起来确实有关系,但我们知道事实并非如此。

然而,作为尼古拉斯·凯奇的超级粉丝,我相信除了这种简单的关联,也许还有更多证据。如果我们尝试针对我们的池数据设置一组不同的 Nicholas Cage 相关数据会怎么样?我们能找到相关性吗?更好的是,我们会发现负相关吗?我们会发现尼古拉斯·凯奇和他辉煌的电影生涯减少了溺死在泳池中的人数吗?我必须弄清楚。

传奇开始了…

最明显的地方开始检查尼古拉斯凯奇效应对我们的泳池溺水数据将是看他的电影质量。也就是好的尼古拉斯凯奇电影有助于减少泳池死亡吗?为此,我前往烂番茄,去看看老好人尼克的职业生涯。匆匆一瞥,他的职业生涯跨越了令人印象深刻的 38 年,有 100 多部电影值得称赞。它们各不相同,从热门的《T2 离开拉斯韦加斯》到票房炸弹的《T4》《幽灵骑士》……以及它的续集()说真的,我喜欢这个家伙,但是谁会为此买单呢?! )

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

A sample of the data we will be using.

因此,在使用美丽的汤进行了一些轻微的网络搜索之后(对不起,烂番茄,这是为了更大的利益!我现在自豪地拥有尼古拉斯·凯奇的分级电影记录。下一步是清理数据。我想特别针对尼古拉斯·凯奇不仅仅是制片人、导演或任何其他职位的电影。我觉得最好的成功指标是尼古拉斯·凯奇出现在屏幕上的电影,或贡献出他独特的声音和措辞,历史上曾让观众高兴。所以再见了大卫·盖尔的一生* ( 不知道他是制片人),再见了吸血鬼的影子 ( 真的?太酷了!我需要尼古拉斯凯奇这个传奇人物!*

接下来,我想清除没有分数的电影。这些电影要么是凯奇参演但从未公映的,要么是公映后从未评论的。前者的优势更大。我确实遇到了一个异常情况,由艾迪·墨菲主演的《一千个字》,它在评论家中的评分为 0%,但幸运的是,凯奇只被认为是这部电影的制片人,所以我们可以安全地删除它。

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

Admit it, you’re going to watch it for its 0% rating. So bad its good?

最后,为了对我们的数据进行排序,我们使用一个 Pandas groupby 命令来计算每年的平均分数。这将有助于把我们的分数和溺水数据联系起来。最后的结果?非常令人满意。

你们期待已久的时刻

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

这不是很神奇吗??现在,我坦率地承认,我在这里做了另一个虚假的相关图,但很难抗拒真正看看这个,并得出一些有趣的结论,当然都是虚假的。

例如,2003-2005 年是尼古拉斯·凯奇最好的几年。2003 年火柴人问世,2004 年国宝、战争之王、天气预报员紧随其后。这些是尼古拉斯·凯奇最具代表性的电影,非常成功,我们看到这些年溺水死亡人数呈稳步下降趋势。从 2006 年开始,事情开始变得有点疯狂,一开始是评价很高的《世界贸易中心》,T19 但以无限记忆的《柳条人》,结束,我们看到尼古拉斯·凯奇穿着熊装,打了一个穿得像 18 世纪定居者的女人。

随着 2007 年《幽灵骑士》(T0)、Next、和国宝 2 的上映,事情开始失去控制,只有他在罗伯特·罗德里格兹 GrindHouse 的短暂露面才挽救了局面。2008 年,集体“不良”终于达到顶点,凯奇最差的电影(在这个例子中为),曼谷危险,泳池死亡人数上升到 123 人。最后,还有一个有趣的负相关性-0.577172。这不是最好的,但比我预期的要高很多,虽然真的比我希望的要低。

最后,出于好玩,我使用 statsmodel 的 OLS 对模型进行了简单的线性回归,得出了以下结果:

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

我们的 R 值很低,我更喜欢 0.6 到 0.7 的值,这有助于证明尼古拉斯·凯奇是我们的精神生命卫士。这个数据中一个有趣的数字是位于 OLS 汇总中间的系数。它基本上表明,在一定程度的误差下,尼古拉斯·凯奇的电影每得一分,泳池溺水人数每年下降 0.0119 人,这多少有助于我们的案例。

最终结论

好了,完成了,但是即使我没有得到我想要的相关性或因果关系,结果仍然很有趣。我不禁认为,尼古拉斯·凯奇的两组数据显示了溺水死亡与泳池死亡之间的关系,这两者之间没有什么关联。阻碍我的一件事是缺乏更多关于泳池溺水死亡的数据。疾病预防控制中心对溺水死亡有非常广泛的分类,我无法确定哪些是在游泳池中,哪些是在其他类型的水体中。数据的原始来源是涵盖 1999 年至 2009 年的一次完成周报。也许另一个将于 2009-2019 年发布。有了更多的数据,也许我能找到更强的关系。毕竟,我们知道尼古拉斯·凯奇的职业生涯出现了戏剧性的下滑,我不禁想知道泳池死亡人数的上升是否与他的职业生涯相关。也许我的下一个笼子分析将围绕票房回报和池死亡。原因可能在于尼古拉斯·凯奇的票房吸引力,即人们正在观看他的电影并远离游泳池吗?只有进一步的分析才能告诉我们!最后,我想我只能说,银幕传奇尼古拉斯·凯奇与泳池安全有关!还有,松露猪的新电影?绝对看那个!

此分析的所有代码可在我的 Github 上获得

来源:

[## 尼古拉斯·凯奇

尼古拉斯凯奇名人简介-查看最新的尼古拉斯凯奇照片库,传记,照片,图片…

www.rottentomatoes.com](https://www.rottentomatoes.com/celebrity/nicolas_cage) [## 15 件相互关联的疯狂事情

为什么这些事情相互关联?这 15 个相关性会让你大吃一惊。(这个标题够煽情吗……

tylervigen.com](http://tylervigen.com/spurious-correlations)

在 LinkedIn 上与我联系!

[## 汉密尔顿·张,CRPC·CSPO-熨斗学校-纽约,纽约| LinkedIn

具有财务规划背景的数据科学家和机器学习工程师。我有专家级的知识…

www.linkedin.com](https://www.linkedin.com/in/hamilton-chang-crpc%C2%AE/)

简化你生活的九个 Postgres 概念🐘

原文:https://towardsdatascience.com/nine-postgres-concepts-to-simplify-your-life-a0aa8c9bd87d?source=collection_archive---------15-----------------------

我不喜欢无意义的介绍,所以我们直接开始吧。

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

“If we have data, let’s look at data. If all we have are opinions, let’s go with mine.”

1.从文本语料库中生成 n 元语法

与使用另一种脚本语言相比,查询文本语料库并立即获得 n 元语法要简单得多。结果数据可以被存储用于多种目的,包括但不限于:关键短语识别、自动完成提示、自动纠正提示。这个集合还可以使用上下文 word2vec 模型创建单词和短语向量。

A way of generating n-grams in Postgres

这里,是按单词出现的顺序排列的单词记录集(直接获得或通过一些操作获得)。看起来是这样的:

Example Record Set of ordered words

2.高效地从表中删除重复项

I know not why I use so many GIFs

考虑到多个约束,下面的查询非常适合从表中删除重复项。这里,考虑列 var1 和列 var2 相同的所有行,保留一个副本,其余的被删除。

Efficiently delete duplicates rows from a table with a set of specific constraints.

3.忽略冲突的快速更新

You think throwing an error in my face will stop me from updating you, you scum of a table?

通常,更新表中的行值会导致与现有行的冲突。一些流氓条目阻止简单直接的更新查询运行到最后。为了解决这个问题,一个简单的程序可以逐行更新表格,忽略与约束冲突的条目,这很有意思。您可以选择记录这些行,以便在异常处理中进一步处理。

Handle update conflicts smarter.

另一种处理方法是移除冲突约束,正常更新表,处理冲突行(例如移除重复项)并重新添加约束。这不是推荐的方法。

4.复制带有现有约束的表

复制表时,约束有时是必不可少的,可以包括如下内容:

CREATE TABLE *table_copy* (LIKE *_table* INCLUDING ALL);INSERT INTO *table_copy* SELECT * from *_table*;

5.处理行锁

很容易出现这样的情况:多个进程持有对公共关系的锁,从而导致死锁情况。过时的查询或断开的连接是过时的,可以这样查询:

Get a list of queries and their details that hold locks over relations in a dB.

可以使用以下查询终止阻塞和/或被阻塞的语句:

SELECT pg_terminate_backend(*pid*)

6.查询 JSON 和 JSONB 列

很容易忘记 JSON(/B)及其数组可以像在脚本语言中一样被查询。将下面的 jsonb 结构视为关系中的一个单元格:

以下所有查询都是可能的:

7.高效的文本搜索和构建自动完成/自动更正模块!

Correct those typos and complete those sentences by using the power of tri-gram search.

我建议你在开始搜索任务之前阅读这篇博客文章:

在另一篇文章中,我描述了提取名词块的基本步骤,将它们存储在数据库中,查询它们并对结果进行排序。本文根据包含的名词块短语搜索数据点。这个可以扩展到全文搜索!

8.分组依据,每组多行

像 grouping 这样的聚合运算符为每个分组元素返回一个分组行。为了获得每个组的多行,下面的查询创造了奇迹。

9.有价值的信息

我发现以下三个概念在日常查询中有巨大的价值。

A.无效的

SELECT null **IS** null; 
--trueSELECT null **IS DISTINCT FROM** null;
--falseSELECT null **=** null; 
--nullSELECT null and null; 
--nullSELECT null **isnull**; 
--trueSELECT null notnull; 
--falseSELECT true or null; 
--trueSELECT true and null; 
--nullSELECT null is **unknown**; 
--true

B.对称的

SELECT 2 BETWEEN 1 and 5; 
--trueSELECT 2 BETWEEN 5 and 1; 
--falseSELECT 2 BETWEEN SYMMETRIC 5 and 1; 
--true

C.PgAdmin 具有查询的自动补全功能

鲜为人知的功能。从文档中:

要使用自动完成功能,请键入您的查询;当您希望查询编辑器建议查询中可能出现的下一个对象名称或命令时,请按下Control+空格键 组合键。例如,键入“SELECT * FROM”(不带引号,但有一个尾随空格),然后按 Control+Space 组合键从自动完成选项的弹出菜单中进行选择。

D.睡眠

SELECT pg_sleep(5);
--sleeps for 5 seconds indeed!

See you in the next one!

注意事项:

我喜欢阅读的一个很棒的博客可以在这里找到。

成为数据科学家所需的技能

原文:https://towardsdatascience.com/ninja-skills-of-modern-data-scientist-621622e59614?source=collection_archive---------13-----------------------

内部人工智能

成为数据科学家的详细信息,从数学到编程到商业到沟通!!!一切都在这里!!!

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

https://giphy.com

人工智能爱好者你好!!!如果你认为你想成为一名数据科学家,那么你在一个完美的地方获得了真正的数据科学家所拥有的所有技能。

通俗地说,火箭科学家是一个拥有火箭科学知识(和惊人经验)的人。成为一名数据科学家并没有那么难。(我说不难,并不是说每个小 kid 都适合这个角色。成为一名喷气式飞机驾驶员并不是火箭科学,但是要成为一名喷气式飞机驾驶员仍然需要很多努力。)

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

https://giphy.com

在 LinkedIn 上与许多数据科学家交谈后,我写这篇博客是为了收集别人 30 多年的生活经验。你会在这里找到很多奇妙的经历。

抓紧时间,继续阅读成为数据科学家所需的技能。

1.数学和统计学

1.机器学习

各种机器学习技术的知识就像任何数据科学家的心脏。没有机器学习知识,很难想象数据科学家的存在。大多数公司要求作为机器学习工程师至少有 3-5 年的基层经验,之后,你将有资格成为任何组织的数据科学家。

机器学习工程师是人工智能项目中的万金油。百事通意味着对问题定义、数据分析、结果展示和测试的透彻理解。它包含了从预处理和选择合适的算法来解决问题到用可视化的方式展示结果的所有内容。你必须全靠自己!!!您是开发人员、分析师,也是测试人员。

所以基本上,你需要机器学习的超能力。

你不必编码每一行,但是理解机器学习是很重要的。

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

https://giphy.com

2.统计建模

统计在数据科学家的生活中扮演着非常重要的角色。只是做一个机器学习算法的代码,你要更多的分析数据。最后,预处理良好的数据意味着项目已经完成了 50%。

您需要对什么是评估矩阵以及准确性、错误率、精确度、召回率、F1 分数和其他术语有一个基本的了解,才能完成您的任务。在概率和统计方面有超级理解力的人可以像国王一样统治数据科学的世界。

3.贝叶斯推理

贝叶斯理论是数据分析师世界中最重要的理论。数据革命始于贝叶斯理论。贝叶斯理论的具体基础将始终帮助您在数据科学竞赛中领先。掌握这一理论很容易让你从其他竞争者中脱颖而出。

4.监督学习和非监督学习

一个没有监督算法知识的数据科学家就像一个没有球的足球运动员。如果 11-11 名球员无球踢球会是什么样子?愚蠢。没有监督和非监督算法的知识也是一样的。

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

https://giphy.com

监督算法包括线性回归、逻辑回归、朴素贝叶斯线性判别分析、决策树、K-最近邻算法、支持向量机、神经网络(多层感知器)等等。

无监督算法包括层次聚类、K-均值、混合模型、DBSCAN、光学算法、主成分分析等等。

5.最佳化

优化是很少有人能掌握的技能。这是你区别于其他开发者的关键因素。训练模型不是非常重要,但是创建模型的优化版本需要大量的工作。超参数每天都会让你头疼,对优化的完美理解就像一场没有任何障碍的比赛。所以,优化你的优化技巧,做一个英雄。

2.编程和数据库

1.计算机科学基础

计算机科学技能是很少有人能掌握的。但是我有很多专业的机械工程师。他们开始学习 Python,然后转向数据科学领域。你会惊讶地发现他们表现得像冠军一样!!!

但是计算机科学概念对于数据科学家角色来说是非常重要的要求。掌握算法,操作系统,非常基础的网络开发和设计,计算机网络将会有很大的不同。这些概念会让你的速度提高 10 倍。

2.脚本和编程语言

如果没有像 Python ♥、r 或 MatLab 这样的脚本和编程语言,就不可能想象数据科学家的生活。如果你没有其中任何一个,那么就把自己踢出这场比赛。你永远不会有一个没有草的花园。你能想象没有草的花园是什么样子吗???想象一下。那不是花园,是沙漠。你必须在沙漠中耕作。这怎么可能呢?[1]您不仅需要了解 Python,还需要了解一些更高级的库,如 TensorFlow、PyTorch、Keras with MatplotLib、Numpy 和 Pandas。

所以在脚本和编程语言知识上没有妥协。就像不不不不。就是这样!!!

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

https://giphy.com

3.数据库 SQL 和 NoSQL

每个项目都有自己的数据和存储格式。对各种数据库的透彻理解可以帮助您理解和定义项目的具体问题。

数据可以是任何形式。你只需要接受这些数据。你不能对你的客户说,“不,我想要不同格式的数据。”您有责任将数据转换为算法所需的输入,并对其进行预处理。数据科学世界指出,粗糙的数据会降低你的准确性,但大量的非结构化数据会给你意想不到的东西。这需要创新的想法来解决。在这里,不同数据库的知识将帮助你。它可以是结构化的、非结构化的、图像、文本、音频或其他内容。

4.将数据转化为可视化

可视化是你可以用数据做的一件神奇的事情。当你尝到可视化的重要性,你会从内心感受到数据。可视化是展示结果的最佳方式。演示时不用说一个字,你的老板就会明白一切。所以这是数据科学学科成功的关键。

5.数据科学工具知识

不同工具上的命令就像是用特斯拉赛博卡车赛车在比赛中表演。你也可以用塔塔 Nano(印度最便宜的车)完成一场比赛但是值得完成一场比赛吗?明智地使用任何工具也是一种技能。互联网上什么都有,但你必须正确使用它。

像 Tableau,SAS,Apache Spark 这样的工具。Excel、RapidMiner、KNIME、QlikView 可以提高您的项目绩效和期限。

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

https://giphy.com

6.云

云知识不是强制性的,而是一种资产。一些内置的库和服务可能会很好用,例如 Google MLKit、Google Colaboratory、Kaggle 服务器、IBM Watson 和其他 API、微软 Azure AI toolkit 和 AWS storages。

至此,技术细节已经完成。

但是你仍然不知道如何成为一名数据科学家,琼恩·雪诺!!!

3.领域知识和软技能

1.对商业充满热情

数据科学家也经常从业务角度思考问题,因为归根结底,什么才是最重要的???钱。是的,再说一遍!!!钱!!!

你必须有强大的商业策略。这将提升你在组织中的价值,最重要的是你的职位。作为一名数据科学家,对业务视角有所了解是件好事。

2.对数据好奇

一名优秀的数据科学家有能力根据自己的经验以不同的方式看待数据。初级工程师看不到数据科学家能看到的东西,因为他们有经验和惊人的天赋。所以数据很说明问题!!!作为一名数据科学家,你只需仔细聆听!!!

3.问题求解程序

人工智能是没有人是完美的领域。你可以面对许多挑战,你只需要跳出框框思考。从字面上跳出框框思考解决问题。你身边就有一个解决方案,但是你只需要把它邀请到你的脑海中,它就会解决你的问题。

4.战略决策者

在作为数据科学家的某些阶段,你必须走得更远,因为在完成一些任务后,你会意识到用另一种技术可以更容易地做到这一点。所以运用一些脑力和技巧来做决定吧。继续使用基本解决方案,然后回来应用一些高级版本。

4.沟通

1.与高级管理层的接触

这都是关于网络、人际交往技巧和人际交往技巧的。播种什么就收获什么。这就像是你在数据科学职业竞赛中的兴奋剂。与权威打交道,当一个组织需要时,他们会提升你。与前辈的良好沟通会让你了解即将到来的项目。提前做好准备是最好的表演方式。

2.讲故事的技巧

作为一名数据科学家,你必须参加很多会议,包括董事会、客户、首席技术官和许多其他人。因此,在不给他们看代码的情况下,你必须向他们解释一个场景。所以只要展示魔法,人们就会认为你是天使。讲好故事,你就能睡个好觉。

3.人工智能不同最新趋势的知识

让自己跟上市场的最新趋势和技术。这会让你成为一个积极的领导者。而在这个科技时代(21 世纪),只有积极的领导者才能统治。

如果你掌握了这些技能,那么你就是这个游戏的冠军。神级!!!

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

https://giphy.com

参考资料:

[1]https://en.wikipedia.org/wiki/Desert_farming

NIPS 2018 年关于“金融风险稳健分类”的论文——摘要

原文:https://towardsdatascience.com/nips-2018-paper-on-robust-classification-of-financial-risk-summary-93445019d4f0?source=collection_archive---------18-----------------------

在这篇短文中,我将概述一篇名为“金融风险稳健分类”的研究论文。该论文被 NIPS 2018 关于*“人工智能在金融服务中的挑战和机遇”*的研讨会接受,旨在解决使用深度学习模型进行信贷借贷时出现的非常有趣和独特的问题。

概观

作者

这篇论文是由哈佛大学的 4 名计算机科学家撰写的。

出版

论文于 2018 年 11 月 27 日发布,是 NIPS 2018 年关于*“人工智能在金融服务中的挑战和机遇”*研讨会的一部分。

问题

已经观察到,输入数据的微小变化可以显著改变机器学习模型的结果。当试图在现实世界的系统中部署这种模型时,这带来了挑战,特别是在金融服务中,因为它允许精心构造的输入“愚弄”模型做出错误的决策。

解决办法

作者旨在使用*“鲁棒优化算法”*解决该问题,该算法增强了神经网络模型,以关注产生更高分类损失的变化(扰动)。

结果

通过比较两个神经网络之间的准确性和损失来进行评估。两个模型使用相同的底层结构(4 层,每层具有相同数量的单元和激活),但其中一个还使用了*“鲁棒优化算法】*。结果直接取自论文:

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

Credits to the authors of “Robust Classification of Financial Risk”

如您所见,损耗从 1.0 下降到 0.6,准确度从 50%提高到 70%。

书面演练

这项研究旨在回答这两个问题:

  1. 输入数据的微小扰动会导致错误分类吗?
  2. 稳健分类能否帮助金融服务中使用的机器学习模型在扰动的例子上表现更好?

该分析是在一个数据集上进行的,该数据集包括从 LendingClub (一个点对点借贷平台)获得的 421,095 份申请的借贷数据。作者使用了 4 种类型的扰动(输入数据的变化),包括:

  • 快速梯度符号法(FGSM) —在损失函数相对于输入的梯度方向上扰动输入。换句话说,该方法将 符号 函数应用于梯度,以确定输入应该朝哪个方向(正、负或零)变化。每次变化的大小由常数 e 决定。更多细节,参见论文中的第 2.2 节并浏览这篇伟大的张量流教程。
  • 预计梯度下降——与 FGSM 相同,但使用与其符号值相反的实际梯度。
  • 基于雅可比矩阵的显著性映射攻击 —扰动对损失函数影响最大的输入。
  • 最大显著性攻击 —以设定的百分比增加或减少来单独扰动每个特征,并找出这些特征中哪一个产生最高的成功误分类率。之后,作者选取其中一两个受影响最大的特征,用一个固定的百分比变化来干扰它们。

注意:“扰动”是输入中的一种变化,这种变化对人类来说可能是微小的或不明显的,但实际上却使网络误分类,产生巨大的误差。

回到问题 1,作者指出:

我们首先表明,在我们高精度贷款等级预测模型上的小扰动是成功的,每个特征 1.3%的平均扰动导致 95%输入的错误分类。

该模型是一个神经网络,具有大小为 100 和 60 的两个密集的 ReLU 层,使用 0.2 的漏失和具有 7 种可能结果的最终 softmax 层。结果的数量是根据数据确定的——lending club 使用一种信用系统,给任何候选人分配 A-G 的分数。

对于第二个问题,作者使用鲁棒优化算法,该算法通过识别哪些扰动具有高分类损失来增强网络,并且在训练期间更加关注那些扰动类型。

您在上面看到的结果是在训练神经网络和使用“鲁棒优化算法”的网络之后获得的,训练集在每次迭代中对扰动类型具有固定的均匀分布。

换句话说,在每个训练步骤中,作者均匀地随机挑选一个数据集,其中应用了四种扰动类型中的一种。

正如您所看到的,所提出的优化算法具有显著的效果。有关该算法如何工作的更多细节,请阅读论文中的第 2.3 节。

关键要点

下面列出了论文中发现的一些有用的观点:

  • 深度学习模型容易受到使用敌对输入的攻击。一个这样的例子是信用风险评估,其中抵御这种攻击的鲁棒性是必不可少的。
  • 类似于本文中应用的算法可以增强现有的模型,以识别这种错误分类。
  • 有用的资源是 LendingClub 数据集,其中包括数千名候选人的贷款数据。

谢谢你的阅读。希望你喜欢这篇文章🤩我祝你今天过得愉快!

NLP 102:阴性取样和手套

原文:https://towardsdatascience.com/nlp-101-negative-sampling-and-glove-936c88f3bc68?source=collection_archive---------3-----------------------

让 Word2Vec 变得越来越好。

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

Photo by Joshua Sortino on Unsplash

从语料库中生成高质量单词嵌入的一种方法是使用 Word2Vec — CBOW 或 Skip-gram 模型。这两种模式有一些共同点:

  • 训练样本由一对基于出现的接近度选择的单词组成。
  • 网络的最后一层是 softmax 函数。

CBoW/Skip-gram 的问题

首先,对于每个训练样本,只有对应于目标词的权重可能得到显著更新。在训练神经网络模型时,在每次反向传播过程中,我们都尝试更新隐藏层中的所有权重。对应于非目标单词的权重将接收到微小的变化或根本没有变化,即在每一遍中,我们仅进行非常稀疏的更新。

其次,对于每一个训练样本,使用 softmax 计算最终概率是一个非常昂贵的操作,因为它涉及对我们词汇表中所有单词的分数求和以进行标准化。

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

The softmax function.

因此,对于每个训练样本,我们执行一个昂贵的操作来计算单词的概率,这些单词的权重甚至可能不会更新,或者更新得如此之少,以至于不值得额外的开销。

为了克服这两个问题,我们尝试减少为每个训练样本更新的权重数量,而不是强行创建训练样本。

负采样

负采样允许我们只修改一小部分权重,而不是每个训练样本的所有权重。我们通过稍微修改我们的问题来做到这一点。我们不是试图预测词汇表中所有单词的邻近单词的概率,而是试图预测我们的训练样本单词是否是邻近单词的概率。参考我们之前的例子(桔子果汁),我们并不试图预测果汁成为邻近词的概率,即 P( 果汁 | 桔子),我们试图通过计算 P(1| < 桔子果汁)来预测(桔子果汁)是否是邻近词

因此,我们现在已经把它变成了 10,000 个二进制分类问题,而不是一个巨大的 soft max——在 10,000 个类别中分类。

我们通过随机选择少量“负面”词*(一个超参数,假设为 5)来更新权重,从而进一步简化问题。(在这种情况下,“否定”单词是我们希望网络输出 0 的单词)。*

对于我们的训练样本(橘子果汁,我们将取五个词,说苹果*,晚餐椅子,房子作为负样本。对于这个特定的迭代,我们将只计算*果汁、苹果、晚餐、狗、椅子、房子的概率。因此,损失将只为它们传播回来,因此只有对应于它们的权重将被更新。

目标函数

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

Overall Objective function in Skip-gram and Negative Sampling. Here sigmoid = 1/(1+exp(x)), t is the time step and theta are the various variables at that time step, all the U and V vectors.

***第一项试图最大化位于上下文窗口中的实际单词的出现概率,*即它们共现。而第二项,试图迭代一些不在窗口中的随机单词 j ,并最小化它们同现的概率

我们根据随机单词出现的频率对它们进行采样。P(w) = U(w)的 3/4 次方,其中 U(w)是一个单图分布。3/4 次幂使得不太频繁的单词被更频繁地采样,如果没有它,采样诸如“The”、“is”等频繁单词的概率将比诸如“斑马”、“大象”等单词高得多。

在我们上面提到的例子中,我们试图最大化概率 P(1| <桔子果汁 >)和最大化(因为在我们的目标函数中它前面有一个负号,所以当我们将选择最大值时,我们将鼓励它们不要发生)我们的负样本的概率 P(1| < 桔子,苹果 >),P(1| < 桔子,晚餐 >),P(1

对于大型数据集,选择一个小的值 k ,大约在 2 到 5 之间。而对于较小的数据集,相对较大的值是优选的,大约 5 到 20。

子采样

语料库中单词的分布是不均匀的。有些词比另一些词出现得更频繁。诸如“the”“is”“are”等词出现得如此频繁,以至于在训练模型时省略一些实例不会影响其最终嵌入。此外,它们的大多数出现并没有告诉我们它的上下文含义。

在二次抽样中,我们通过限制样本出现的频率来限制一个词的样本数量。对于频繁出现的单词,我们会删除一些作为相邻单词和输入单词的实例。

性能考虑因素

在多 CPU 机器上使用并行训练可以显著减少 word2Vec 的训练时间。超参数的选择对性能(速度和精度)至关重要,但不同的应用会有所不同。要做出的主要选择是:

  • 架构 : skip-gram(较慢,对不常用词更好)vs CBOW(快)。
  • 训练算法 :分级 softmax(对不常用词更好)vs 负采样(对常用词更好,对低维向量更好)。
  • 常用词的子采样:可以提高大型数据集的精度和速度(有用值在 1e-3 到 1e-5 范围内)。
  • 词向量的维度 :通常越多越好,但也不尽然。
  • 上下文(窗口)大小 :对于 skip-gram 通常在 10 左右,对于 CBOW 在 5 左右。

几乎所有使用的目标函数都是凸的,所以初始化很重要。在实践中,使用小随机数来初始化单词嵌入会产生好的结果。

基于计数的方法

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

在 word2vec 中,我们本质上要做的是捕获单词的共现,但是一次一个滑动窗口。如果我们在一个矩阵中一次性捕捉到 co 出现的频率,会怎么样?这将在计算上比训练神经网络更简单和容易。使用这种方法,问题有点类似于我们面对的一次性表示(在以前的帖子中讨论过)。虽然我们在一定程度上解决了捕获单词间相似性的问题,但其他维度问题仍然存在。

总而言之,通过使用基于窗口的方法来学习我们的嵌入,我们能够捕获复杂的模式而不仅仅是单词相似度,但是我们对统计数据的使用效率很低。通过使用纯粹基于计数的方法,我们使统计数据得到了有效的利用,但是当我们将这些嵌入应用到外部任务时,这些复杂的潜在模式非常有用。

手套

它是基于计数和基于窗口的模型的混合。GloVe 的优势在于,与 Word2vec 不同,GloVe 不仅仅依赖于局部统计(单词的局部上下文信息,基于窗口的模型),而是融入了全局统计(单词共现,基于计数的模型)来获取单词向量。****

目标函数

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

Objective function for the GloVe model.

**对于每一对可能同时出现的单词 ij ,我们试图最小化它们单词嵌入的内积与 ij 的对数之差。术语**f(Pij)允许我们降低一些非常频繁的共现的权重,并限制非常频繁的单词的重要性。

这里的 uv 向量是可以互换的。我们在这里使用两组不同的向量,因为它在优化时提供了更多的稳定性。如果我们只使用一组向量,我们将执行一个与它本身的内积,我们将有一个表现不太好的目标函数。在我们的最终评估中,我们将通过执行元素相加来简单地将两者结合起来。

优势

  • 快速训练:与基于窗口的方法不同,在基于窗口的方法中,我们过去常常一次优化一个窗口(可能多次对相同的同现进行训练),在 GloVe 中,我们一次只优化一个计数。
  • 可扩展:在庞大的语料库中,罕见的单词不会经常出现,但 GloVe 允许我们捕捉语义,而不管单词出现的次数。
  • 有效使用统计数据:这有助于模型在小语料库和小向量上表现良好。

突出

最近的邻居

两个单词向量之间的欧几里德距离(或余弦相似度)提供了一种测量相应单词的语言或语义相似度的有效方法。

线性子结构

这种计算两个词之间相似性的简单性可能是有问题的,因为两个给定的词几乎总是表现出比单个数字更复杂的关系。比如可能被认为和相似,两个词都是描述人类的;另一方面,在现实世界中,我们知道不应该认为男人=女人。这种差异不仅是生物学上的,也是社会学上的。{性别平等仍然是许多人渴望的理想,却没有人去实现}。为了以定量的方式捕捉区分男人女人的细微差别,模型有必要将一个以上的数字与单词对相关联。

参考

我认为你会喜欢:D 的其他文章

我很高兴你坚持到了这篇文章的结尾。🎉我希望你的阅读体验和我写这篇文章时一样丰富。💖

请在这里查看我的其他文章。

如果你想联系我,我会选择推特。

NLP 101: Word2Vec — Skip-gram 和 CBOW

原文:https://towardsdatascience.com/nlp-101-word2vec-skip-gram-and-cbow-93512ee24314?source=collection_archive---------0-----------------------

单词嵌入速成班。

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

Photo by Sincerely Media on Unsplash

单词嵌入是什么意思?

单词嵌入只是单词数字表示的一种花哨说法。一个很好的类比是我们如何使用颜色的 RGB 表示。

为什么我们需要单词嵌入?

作为一个人,从直觉上来说,想要用数字来表示单词或宇宙中的任何其他对象没有多大意义,因为数字是用来量化的,为什么需要量化单词呢?

在科学课上,我们说我的车的速度是 45 公里/小时,我们得到了我们开得有多快/多慢的感觉。如果我们说我的朋友以 60 公里/小时的速度开车,我们可以比较一下我们谁开得更快。此外,我们可以计算在某个时间点我们将在哪里,当我们知道我们旅程的距离时,我们将到达我们的目的地等等。类似地,在科学之外,我们用数字来量化质量,当我们报出一件物品的价格时,我们试图量化它的价值,一件衣服的尺寸,我们试图量化它最适合的身体比例。

所有这些表述都是有意义的,因为通过使用数字,我们可以更容易地根据这些品质进行分析和比较。鞋子和钱包哪个更值钱?尽管这两种物品不同,但有一种方法可以回答这个问题,那就是比较它们的价格。除了量化方面之外,这种表示没有任何其他可获得的东西。

既然我们知道对象的数字表示通过量化某种质量来帮助分析,问题是我们想要量化什么质量的词?

答案是,我们要量化 语义 。我们希望用一种人类能够理解的方式来表达单词。不是这个词的确切意思,而是上下文的意思。例如,当我说单词 *see,*时,我们确切地知道我在说什么动作——上下文——即使我们可能无法引用它的意思,那种我们可以在字典中找到的,我们头顶的意思。

什么是好质量的单词嵌入,如何生成?

最简单的单词嵌入是使用一键向量。如果你的词汇表中有 10,000 个单词,那么你可以将每个单词表示为一个 1x10,000 的向量。

举个简单的例子,如果我们的词汇表中有 4 个单词— 芒果、草莓、城市、德里— ,那么我们可以将它们表示如下:

  • 芒果[1,0,0,0]
  • 草莓[0,1,0,0]
  • 城市[0,0,1,0]
  • 德里[0,0,0,1]

上面的方法有一些问题,首先,我们的向量的大小取决于我们的词汇的大小(这可能是巨大的)。这是一种空间浪费,并且以指数方式增加了算法的复杂性,导致了维度的诅咒。

其次,这些嵌入将与它们的应用紧密耦合,使得迁移学习到使用相同大小的不同词汇的模型,从词汇中添加/删除单词几乎是不可能的,因为这将需要再次重新训练整个模型。

最后,创建嵌入的全部目的是捕捉单词的上下文含义,这是这种表示法所不能做到的。意思或用法相似的词之间没有关联。

**## Current situation** 
Similarity(Mango, Strawberry) == Similarity(Mango, City) == 0**## Ideal situation**
Similarity(Mango, Strawberry) >> Similarity(Mango, City)** Note: Similarity(a,b) = *a.b/(||a||*||b||*) Cosine similarity

连续词袋模型(CBOW)和跳格

两者都是通过使用神经网络来学习每个单词的底层单词表示的架构。

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

Source: Exploiting Similarities among Languages for Machine Translation paper.

CBOW 模型中,上下文(或周围单词)的分布式表示被组合起来预测中间的单词。而在跳格模型中,输入单词的分布式表示用于预测上下文

任何神经网络或任何监督训练技术的先决条件是具有标记的训练数据。你如何训练一个神经网络来预测单词嵌入,当你没有任何标记数据,即单词和它们相应的单词嵌入?

跳格模型

我们将通过为神经网络创建一个“假”任务来进行训练。我们不会对这个网络的输入和输出感兴趣,相反,我们的目标实际上只是学习隐藏层的权重,这实际上是我们试图学习的“单词向量”。

Skip-gram 模型的假任务是,给定一个单词,我们将尝试预测它的相邻单词。我们将通过窗口大小——一个超参数——来定义一个相邻单词。

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

The word highlighted in yellow is the source word and the words highlighted in green are its neighboring words.

给定句子:
“我早餐吃橘子 果汁 和鸡蛋。”
且窗口大小为 2,如果目标词是果汁,其邻词将是(有、橙、和、蛋)。我们的输入和目标词对将是(果汁,有),(果汁,橙),(果汁,和),(果汁,鸡蛋)。
还要注意,在样本窗口中,单词与源单词的接近度不起作用。所以
有,橙,和,
在训练时会被同等对待。

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

Architecture for skip-gram model. Source: McCormickml tutorial

输入向量的维数将是 1xV——其中 V 是词汇表中的个单词— ,即单词的一键表示。单个隐藏层将具有维度 VxE,其中 E 是单词嵌入的大小,并且是超参数。隐藏层的输出将是 1xE 的尺寸,我们将把它输入到一个 softmax 层。输出层的维度将是 1xV,其中向量中的每个值将是目标单词在该位置的概率得分。
根据我们之前的例子,如果我们有一个向量[0.2,0.1,0.3,0.4],这个词成为芒果的概率是 0.2,草莓是 0.1,城市是 0.3,德里是 0.4。

对应于源单词的训练样本的反向传播在一次反向传递中完成。所以对于*果汁,*我们将完成所有 4 个目标词 *( have,orange,and,eggs)的正向传递。*然后我们将计算对应于每个目标单词的误差向量【1xV dimension】。我们现在将有 4 个 1xV 误差向量,并将执行逐元素求和以获得 1xV 向量。隐藏层的权重将基于这个累积的 1xV 误差向量进行更新。

CBOW

CBOW 中的假任务有点类似于 Skip-gram,在某种意义上,我们仍然采用一对单词,并教导模型它们共同出现,但我们不是添加错误,而是添加相同目标单词的输入单词。

我们的隐藏层和输出层的尺寸将保持不变。只有我们的输入层的维度和隐藏层激活的计算将改变,如果我们对于单个目标单词有 4 个上下文单词,我们将有 4 个 1xV 输入向量。每个都将乘以 VxE 隐藏层,返回 1xE 向量。将对所有 4 个 1xE 向量进行元素平均,以获得最终的激活,然后将该激活馈入 softmax 层。

Skip-gram :适用于少量的训练数据,甚至可以很好地表示罕见的单词或短语。
CBOW :训练速度比 skip-gram 快几倍,对常用词的准确率略高。

在本帖第二部分NLP 101:阴性采样和手套中,我们讨论了:

  • 负采样 —一种在不影响嵌入质量的情况下改善学习的技术
  • 另一个单词嵌入叫做 GloVe ,它是基于计数和基于窗口的混合模型。

参考

我认为你会喜欢:D 的其他文章

我很高兴你坚持到了这篇文章的结尾。🎉我希望你的阅读体验和我写这篇文章时一样丰富。💖

请点击这里查看我的其他文章

如果你想联系我,我会选择推特。

NLP(人工智能)现实…混乱

原文:https://towardsdatascience.com/nlp-ai-reality-decluttered-3dd34f6daba0?source=collection_archive---------29-----------------------

诗歌生成器、推文生成器、新闻生成器、聊天机器人、破解考试的机器……唷……自然语言处理(NLP)已经离我们很远很远了。还是我们在媒体炒作的回音室里?现实是怎样的?

现实是开发人员在哪里…他们在编码什么,出现了什么问题,发生了什么对话?像 Stack Overflow 这样的顶级开发者网站对此有很好的描述。这也是一个很好的预示未来的指标(今天正在开发明天的解决方案)。让我们解混得到 NLP 现实。

这是开发者提出的问题的摘要、基本标签和标题。截至 2019 年 6 月,在 1867 个标签上分析了 11000 个查询。

属性:标签数据来自堆栈溢出

注:2019 年的数据是今年迄今为止的数字,因此会出现下降。按比例计算,2019 年在 6 个月内约为 2018 年的 70%,并有望大幅超过 2018 年。

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

Top 15 tags

  • NLP 正在兴起,尤其是在 2016 年之后
  • 机器学习比深度学习用得更多……深度学习正在逐级提升
  • 早些年出现了 Java、PHP 等…现在主要是 python
  • NLP 仍然是一流的 NLTK(自然语言工具包)库,它已经强大了十年
  • 嵌入/矢量技术在最近几年有所发展…先驱 word2vec 仍然占据主导地位
  • 文本分析是文本分类的主要用例

注:参见插图“矢量化标签网络”来理解这些技术术语是如何获得的。

快速进入这些领域…向量、库和用例。

**矢量:**下面的图表显示了一部分关于矢量生成技术的见解。Word2Vec 占主导地位,但像 elmo、bert 等新架构的快速发展正在蚕食它的份额。

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

Vector Generation

**库:**NLTK 最简单免费的库,Scikit-learn 独霸。斯坦福大学在 70 年代以基于规则的文本处理开创了自然语言处理,并继续赢得人们的忠诚。

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

鉴于 Word2Vec 的受欢迎程度,在那里看到 Gensim 并不奇怪。Spacy 是在 NLP 中取得巨大进展的软件包。有趣的是,bigtech 驱动的 NLP APIs 还没有引发很多讨论。

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

**用例:**用例主要是在文本分析/挖掘中。近年来,文本分类和情感分析的份额越来越大。情感分析是文本分类的一种形式,很明显,文本分类是开发人员正在讨论的用例。

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

快速浏览每个用例可以发现,文本分析和信息提取主要利用了 regex、tf-idf、nltk 等。文本分类/情感分析是深度学习出现的地方。

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

使用主题建模技术理解文档继续沿用旧的 LDA 和 Gensim 方法。利用嵌入和深度学习让机器理解语言还没有出现。

总之,自然语言处理越来越受到重视,尽管是现有技术的更高组合。向量和深度学习概念的探索获得更多份额。

NLP 现实…通过“AI+代码”去杂乱。

基于自然语言处理的提高预测模型精度的数据预处理方法

原文:https://towardsdatascience.com/nlp-based-data-preprocessing-method-to-improve-prediction-model-accuracy-30b408a1865f?source=collection_archive---------12-----------------------

自然语言处理如何帮助均匀化异构数据集以优化机器学习回归任务的预测模型。

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

Photo by Milad Fakurian on Unsplash

任务概述

如今,将机器学习用于点对点市场非常流行,因为它可以提高 UX,增加客户忠诚度。在第一部分的中,我描述了众包平台【Arcbazar.com】基于 ML 的奖项推荐系统的主要阶段,客户发起设计师竞赛并设立奖金。ML 系统在已完成的带有付费奖项的竞赛的数据集上进行训练,以帮助客户为某个建筑项目设置最佳奖项。经过数据分析,选择了最佳回归算法。

问题

正如在上一篇文章中提到的,我对数据集做了一些简化。我将训练数据集的三个文本描述字段替换为一个有数值的字段——字符总数。因此,我得到了 5 个字段的数据集,而不是 7 个字段。

然而,测试表明,模型的准确性可以提高。

在这篇文章中,我将告诉您如何使用自然语言处理来升级数据集预处理的预测模型。

假设

古希腊哲学家苏格拉底说:“说话,让我能看见你”。这句格言的意思是,我们的言语比我们想说的更多地揭示了我们的个性。此外,它还提示了一个假设,即项目的文本描述可能与奖励金额相关联,并且这些关系比大量字符更强。

我决定使用自然语言处理方法将文本描述的字符串类型数据转换为数值,目的是丰富和均匀化数据集。

ML 系统升级分为三个主要步骤:

  1. 文本清理。
  2. 文本到数字的转换。
  3. 选择最佳回归方法。

文本清理

对于数据库的每个文本描述字段,我使用 Python 语言的自然语言工具包gensim 库应用了文本清理算法。但是,您可以使用您喜欢的任何 NLP 库。我将文本转换成小写,去掉标点符号和英语停用词。

#Transform to lower case
import stringfeatures['description'] = features['description'].str.lower()#Remove punctuation
table = str.maketrans('', '', string.punctuation)
features['description'] = [features['description'][row].translate(table) for row in range(len(features['description']))]#Remove stopwords
import nltk
nltk.download('stopwords')
from nltk.corpus import stopwords
stop = stopwords.words('english')features['description'] = features['description'].apply(lambda x: " ".join(x for x in x.split() if x not in stop))

文本到数字的转换

然后,每个字段中最常用和最不常用的单词都被删除。语义分析中常用(最频繁)词的含义非常接近停用词。他们给文本添加了一种类似噪音的模式。此外,最不常用的词的意义可以忽略不计,它们可以被过滤掉。这一步的目的是筛选出最有价值的单词。我使用了图形分析,绘制单词和它们的频率。

#Find words spreading (each word frequency)
freq_d = pd.Series(‘ ‘.join(features[‘description’]).split()).value_counts()#Plot the words distributionfreq_d.plot(kind=’line’, ax=None, figsize=None, use_index=True,
            title=None, grid=None, legend=False, style=None,
            logx=False, logy=False, loglog=False, xticks=None,
            yticks=None, xlim=None, ylim=None, rot=None,
            fontsize=None, colormap=None, table=False, yerr=None,
            xerr=None, label=None, secondary_y=False)

词频可视化帮助我筛选出频率大约在 5 到 200 之间的词。

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

#Remove the least frequent words
rare_d = pd.Series(' '.join(features['description']).split()).value_counts()[-17528:]rare_d = list(rare_d.index)features['description'] = features['description'].apply(lambda x: " ".join(x for x in x.split() if x not in rare_d))#Remove the most frequent words
freq_d = pd.Series(' '.join(features['description']).split()).value_counts()[:30]freq_d = list(freq_d.index)features['description'] = features['description'].apply(lambda x: " ".join(x for x in x.split() if x not in freq_d))

然后每个文本记录被标记化——一个文本被分割成一个单词数组。

features['description'] = [text.split() for text in features['description']]

单词及其频率的组合给出了一个文本向量,其中每个单词都用它的索引代替。相似的向量表示相似的文本。这就是语义搜索引擎的工作方式。与现代搜索引擎不同,这里我只关注可能的相似性的一个方面——它们的文本(单词)的明显语义相关性。没有超链接,没有随机游走的静态排名,只是对布尔关键字匹配的语义扩展。

#Create a set of text records for each field
from gensim import corporadict_d = corpora.Dictionary(features['description'])

将文本转换成单词包(BoW)格式,即(token_id,token_count)元组的列表,是由类gensim.corpora.dictionary.Dictionary().doc2bow()的属性完成的。

#Convert tokenized text (corpora) to vectorscorpus_d = [dict_d.doc2bow(line) for line in features['description']]

为了得到一个实数而不是一个向量,我使用了一个范数,它是一个函数,为向量空间中的每个向量指定一个严格为正的长度或大小。

#Transform vectors of texts to scalar values (calculating norms of vectors)
from numpy import linalg as LAcorpus_d_vec_norm = [LA.norm(vec) for vec in corpus_d]
#Replace text descriptions in the database with norms of vectors
features[‘description’] = corpus_d_vec_norm

最后,我得到了一个同质的 7 场数据集。

选择最佳回归方法

我使用了之前测试中评级最高的机器学习方法——随机森林回归器——来计算模型如何适应我们的新数据集。决定系数 R 的平方是 5 字段数据集(0.37)的两倍(约 0.75)。

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

Random Forest Regressor results distribution on 7-field data

最初,我有混合数据集:前三个字段(下拉菜单)显然是相互依赖的,接下来的三个字段(描述)更具波动性。

由于我的假设,描述域在哲学上(甚至心理学上)更接近于奖励值。所以,我把 ML 方法改成了人工神经网络。顺便说一下,该算法在之前的 5 字段数据集测试中被拒绝,因为它的 R 平方非常低,为 0.05。

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

Image source: scikit-learn.org

然而,多层感知器只有三个隐藏层的回归器给出了 R 平方为 0.999962 的惊人结果。

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

Multi-layer Perceptron Regression on 7-fields dataset.

import sklearn
from sklearn.neural_network import MLPRegressormlpreg = MLPRegressor(hidden_layer_sizes=(3,), activation=’relu’,
         solver=’adam’, alpha=0.001, batch_size=’auto’,
         learning_rate=’adaptive’, learning_rate_init=0.01,
         power_t=0.5, max_iter=1000, shuffle=True, random_state=9,
         tol=0.0001, verbose=False, warm_start=False, momentum=0.9,
         nesterovs_momentum=True, early_stopping=False,
         validation_fraction=0.1, beta_1=0.9, beta_2=0.999,
         epsilon=1e-08)

结论

1.所获得的结果显示了向量的范数对于替换文本向量的适用性,而没有显著的数据丢失。

2.客户对他/她的需求的口头描述比下拉菜单更接近于奖金数额,因为这些文字可能表达了人类的本质或共同的动机。

3.基于人工神经网络的算法在“理解”人性方面比随机森林更好,首先是因为它在结构上与人脑相似。

基于自然语言处理的无用户偏好推荐系统

原文:https://towardsdatascience.com/nlp-based-recommender-system-without-user-preferences-7077f4474107?source=collection_archive---------5-----------------------

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

推荐系统 (RS)已经发展成为帮助用户做出明智决策和选择的基本工具,尤其是在大数据时代,客户必须从大量产品和服务中做出选择。人们提出了许多遥感模型和技术,其中大多数都取得了巨大的成功。其中,基于内容的粗糙集和协同过滤粗糙集是两个有代表性的。研究界和工业界都证明了它们的有效性。

我们将在自然语言处理方法的基础上建立一个基于内容的推荐系统,当我们处理以描述或标题(一般是文本数据)为特征的产品,如新闻、工作、书籍等时,这种方法非常有用…

开始吧!

数据

我们将使用来自一些自由职业者网站的项目数据集,这些项目是出于教育目的从 RSS 源解析而来的。

我们将根据自由职业者以前做过的项目,尝试向他们推荐感兴趣的项目。

import pandas as pd
projects = pd.read_csv("projects.csv")
projects_done= pd.read_csv("projects_done_by_users_history.csv")
projects.head()

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

Dateframe of projects

项目完成历史表包括 2 行,用户标识和项目标识。

现在让我们准备数据并清理它。

projects = projects.drop_duplicates(subset="Title", keep='first', inplace=False)
projects["Category"] = projects["Category"].fillna('')
projects["Description"] = projects["Description"].fillna('')
projects["SubCategory"] = projects["SubCategory"].fillna('')
projects['Title']= projects['Title'].fillna('')

让我们将每个文档的所有行合并为一行

projects["text"] = projects["Category"] + projects["Description"] + projects["SubCategory"] + projects["Title"]

现在我们将计算 TF-IDF “项频率—逆数据频率”

from sklearn.feature_extraction.text import TfidfVectorizertf = TfidfVectorizer(analyzer='word',ngram_range=(1, 2),min_df=0, stop_words='english')
tfidf_matrix = tf.fit_transform(projects['text'])

是时候生成余弦 sim 矩阵了

from sklearn.metrics.pairwise import linear_kernel, cosine_similaritycosine_sim = linear_kernel(tfidf_matrix, tfidf_matrix)

现在我们完成了,我们的自由职业者是免费的开放项目…给他们推荐几个有意思的项目吧:))

getUserDone 函数将返回一个列表,其中包含用户已完成项目的所有 id。

get_recommendations 将返回一个列表,其中包含与特定用户完成的项目最相似的项目,该列表将按升序排序。

titles = projects['Title']
indices = pd.Series(projects.index, index=projects['Title'])

让我们推荐 id 为 20 的用户可能感兴趣的前 25 个项目。

get_recommendations(20).head(25)

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

Top 25 Recommendations

结论

在本文中,我们使用 NLP 方法构建了一个基于内容的推荐器,它对于包含文本数据的产品非常有用。

不需要用户的偏好,我们可以从他们完成的项目中为他们推荐高质量的推荐。

这种方法也有优点,这就是为什么总是建议使用多种方法,并结合它们以获得准确的结果。

NLP 基础,动手操作:一个语言分类器,分 3 步在线部署

原文:https://towardsdatascience.com/nlp-basics-hands-on-a-portuguese-dialect-classifier-deployed-online-in-3-steps-53a8b3b88ea9?source=collection_archive---------28-----------------------

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

São Paulo or Lisbon? (Photos by Gabriel Santos and Lisa Fotios)

TL;dr:我用 scikit-learn 创建了一个葡萄牙方言分类器,用了 5000 篇 TED 演讲。然后我修补了 Flask 和 Vue.js 来与你分享。

小团体

是的,我是最近决定加入数据科学潮流的一群人中的一员。人们说,边走边学。他们说,想出一个问题并找到它的解决方案。他们说,不要害怕在路上打碎东西。我也在努力。作为一名波兰-葡萄牙语翻译,我立刻想到了一个现实世界的问题:

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

你知道,葡萄牙语是横跨大西洋的一种语言。巴西和旧世界(葡萄牙+讲葡萄牙语的非洲和亚洲国家)的变体在词汇、语法和发音方面有所不同。

与此同时,波兰的自由葡萄牙语翻译市场相当狭窄。我没有足够的时间专门研究和坚持其中一个品种。我头上戴着两顶帽子,有时在同一个工作周,我必须加倍小心地保持给定翻译的一致性。这就是为什么我对 NLP 项目的第一个想法是葡萄牙语方言分类器。

无论是在自然语言处理还是人工智能领域,这都不是开拓性的研究。我在这里的动机与我之前关于 tweet bot 的 Medium 文章类似——展示在 Python 中进行自然语言处理的第一步是多么简单。作为一个没什么技术背景的人,我尽量用通俗易懂的英语来呈现。

这篇文章分为三个主要部分:

  • 准备源数据(Scrapy);
  • 训练模型(sci kit-learn);
  • 使用模型(Flask+Vue.js)部署 API。

准备源数据

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

A lecture. Could be a TED one. Photo by Samuel Pereira on Unsplash

我需要什么数据,从哪里收集,如何收集?在这种情况下,我选择 TED.com 作为我的来源。这是一个相当大的数据库,方便转录讲座。在这种情况下,特别重要的是,TED 的翻译团队严格区分两种葡萄牙语方言(例如,维基百科就不是这种情况)。

TED 曾经维护了一个官方 API,但他们在 2016 年停止了它,所以我建立了一个 Scrapy spider 来收集数据。大部分是基于刺儿头教程的样板。蜘蛛在指定语言的 TED 演讲目录中循环,并跟踪各个演讲的链接:

def parse_front(self, response):

   talk_links = response.css(“a.ga-link::attr(href)”) 
   links_to_follow = talk_links.extract()    for url in links_to_follow: 
      url = url.replace(‘?language’, ‘/transcript?language’) 
      yield response.follow(url=url, callback=self.parse_pages)

然后,第二种解析方法抓取各个讲座的标题和文本,并将它们添加到字典中:

def parse_pages(self, response): 
   title = response.xpath(‘//head/title/text()’).extract_first()    
   title = title.strip() 
   title = title.split(‘:’)[0] 
   talk = response.xpath( ‘//div[@class=”Grid__cell flx-s:1 p-r:4"]/p/text()’).extract() 
   for i in range(len(talk)): 
      line = talk[i].strip() 
      line = line.replace(‘\n’,’ ‘) 
      talk[i] = line.replace(‘\t’,’ ‘) 
   talk = ‘ ‘.join(talk) 
   talk = talk.replace(‘\n’,’ ‘) 
   ted_dict[title] = talk

完成后,字典被转储到一个 CSV 文件中。我需要做的就是确定合适的 xpaths。我还设置了每次下载之间的半分钟延迟(如果没有它,我会过于频繁地访问服务器,这会阻塞我的查询):

class TedSpiderPt(scrapy.Spider): 
   name = “ted_spider_pt” 
   download_delay = 0.5

剩下的资料准备和训练过程都可以在 Jupyter 笔记本这里伴随。下面,我浏览了一下,并强调了关键时刻。

我为葡萄牙语的每个版本搜集了大约 2500 个 TED 演讲,每个演讲大约有 12000 到 18000 个字符。清理完格式后,我将 PT-PT(欧洲葡萄牙语)的转录标记为“0 ”, PT-BR 的转录标记为“1 ”,然后用 scikit-learn 的 CountVectorizer 拟合并转换它们。

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

An example of data prepared for CountVectorizing.

如果这篇文章是对自然语言处理的介绍:CountVectorizer 将一组文本文档转换成字数。这种数字形式的文本数据极大地提高了处理它的能力。

首先,我按照 2:1 的比例将讲座分成训练集和测试集。该模型将仅在训练数据上学习。测试部分用于在向世界发布之前检查其性能。

然后,我将向量机与训练数据相匹配——简单地说,它会为在那里找到的每个单词分配一个唯一的数字,从而创建一个词汇表。为了消除极端的异常值,我将参数 min_df 设置为 2——只出现一次的单词不考虑在内。然后,我转换训练集——即统计词汇表中每个单词的出现次数。在计数矢量化之后,在组成训练集的 3555 个谈话的每一个中计数 59061 个单词中的每一个。

请参见下面的图示:

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

Tracking down a particular word.

单词“eu”(葡萄牙语中的“me”)在词汇表中被索引为“23892”。在这个指数的字数统计中,我们看到一个演讲中“eu”的数量明显较高。我们可以追溯到演讲的转录……事实上,个人经历在 Chiki Sarkar 的 TED 演讲中发挥了重要作用。

除了向量化和计数,我避免任何其他预处理。我不做词干分析,因为我想保留两种语言版本之间的语法差异(如动词变化差异)。举个例子:把“[a] fazer”和“fazendo”减少到它们的词干会模糊我想要抓住的 PT/BR 区别。

训练模型

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

Photo by Jelmer Assink on Unsplash

然后,我在训练集上训练一个多项式朴素贝叶斯分类器。尽管这种方法相当基础,但在 NLP 应用程序中,比如这个,它的效果非常好。

再次,一些简单的英语解释:NaiveBayes 分类器基本上比较给定单词在 BR 和 PT 集中的频率,从而确定该单词是否建议更“巴西”或“葡萄牙”的文本。在预测时,对文本中的所有单词进行加权,我们获得最终的概率。

在训练分类器之后,我使用与之前相同的矢量器来转换测试集。它已经填充了训练集词汇,并且它将只计算出现在其中的单词。

然后使用多项式贝叶斯对矢量化的测试集进行分类。在这个特殊的例子中,我对测试集做了一点调整——我想测试它对短文本进行分类的能力。因此,我将测试集的讲座分成 200-760 个字符的小块。相比之下,你现在正在阅读的段落包含 370 个字符。结果呢?

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

How’s that for a score?

我在短文本上实现了 86.55%的准确率,错误分类的 PT-PT 和 PT-BR 示例的比例几乎相同。这是一个足够好的分数吗?我不是这里最客观的法官,但我会说这很体面。让我们看一些错误分类短语的例子来帮助我们评估模型。

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

Three examples of PT-BR texts classified as PT-PT

即使你不熟悉这两种葡萄牙语变体,也可以想象一下,有些句子听起来既不像典型的美式英语,也不像典型的英式英语。这就是这里许多分类错误的短语的问题。无论如何,我将在本文的后续部分更深入地研究改进模型的方法。现在,让我们与世界分享吧!

使用模型部署 API

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

Image source and all the rest of Flask goodness: https://palletsprojects.com/p/flask/

如果我想在 Jupyter 笔记本之外使用我的模型,我需要一种导出它的方法。对于这个任务,我使用了 joblib 序列化库,它提供了这个问题的轻量级解决方案。

扔给模型的每个新文本都需要由矢量器进行转换,然后进行分类。因此,我将矢量器和分类器打包成一个 scikit-learn 管道。然后只需将它转储到 joblib 文件中:

pipeline = Pipeline([('vectorizer',vectorizer), 'classifier',nb_classifier)])dump(pipeline, 'ptclassifier.joblib', protocol = 2)

“轻量级”这个术语也适用于 Flask ,一个我用来部署 API 的精益 web 应用框架。我的 Flask 应用程序的完整代码是 GitHub repo 中的。它基本上加载 joblibbed 模型并监听带有一个参数的 GET 请求:一个文本数据字符串。一旦接收到,它通过管道传递字符串,并返回预测的标签和该预测的置信度值。

我还应用了 flask-cors 包来允许来自不同来源的请求。在我们的例子中,我稍后将介绍的托管在其他地方的前端应用程序需要访问这个 Flask API。你可以在这里阅读更多关于 CORS 的信息。

我在 PythonAnywhere 上托管了我的 Flask 应用,我在 tweetbot 文章中详细描述了这项服务。如果你从在线托管的 Python 脚本开始,我全心全意地推荐 PyA 支持团队总是对我的初学者问题很有帮助。

我通向 ML 前端的痛苦之路

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

You always need a frontend, as scrappy as it may be. Photo by Eric Muhr on Unsplash

啊,前台。我巨大挫败感的根源和原因。我确信,在最后一英里,建立一个带有文本框和“发送”按钮的最简单的页面是相当容易的。我深信不疑,结果陷入了恶性循环。

首先,我得到一个建议,我应该使用 Vue.js ,但是从一本关于 JavaScript 本身的书开始,比如 EloquentJS 。啊啊。不要误会我,我喜欢 EJS,它的在线版本,有练习用的沙盒,非常容易上手。但在一周的课程后,我意识到我此刻的目标是缝合一个基本的前端,然后回去构建模型。我仍然觉得 Python 不够流利,无法开始一门新的语言。

然后我谷歌了“简单机器学习前端模板”和类似的关键词,结果喜忧参半。我掉进的陷阱?我对最小可行解决方案的耐心持续的时间比我理解和部署模板所需的时间要少。

最后,我找到了一个对我的急性子足够有效的方法——由 James Salvatore 在 Uptake Tech 博客中提出。我拿了他的模板,并根据我的需要做了一些调整。为了简单起见,我去掉了工具栏,添加了一个图片作为标题,并且只保留了一个文本框。我在 AlwaysData 上托管了该应用的生产版本,这是我可以推荐的另一项服务。

如果你还没有看到最终的结果在这里

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

The Brazilian anthem is classified as 97.5% Brazilian. What’s the result for its Portuguese counterpart? Check for yourself here.

随便玩玩,就算不懂葡萄牙语。如果你在上面打碎了什么东西并告诉我,我会非常高兴的!此外,对库中代码的任何建设性的批评都会赢得我永远的感激。

下一步是什么?

本文将有第二部分。在不久的将来,我想:

  • 添加一个功能,向我的前端应用程序的用户显示单个单词如何影响预测;
  • 刮一些其他文字来源(新闻、博客、电影字幕),在上面检查模特的表现;
  • 探索分类器的错误并尝试发现模式;
  • 尝试用 LSTM 方法解决问题,并比较结果;
  • 最后但同样重要的是,希望我能从读者那里得到一些值得分享的反馈!

奖金(葡萄牙语者)!

我偶然发现了两个人们用葡萄牙方言解决类似问题的例子:

感谢Piotr migda对本项目和其他项目的指导,感谢 Kamil Herba 和Piotr Kaznowski对本文和 webapp 的见解。

[NLP]基础:理解正则表达式

原文:https://towardsdatascience.com/nlp-basics-understanding-regular-expressions-fc7c7746bc70?source=collection_archive---------8-----------------------

你唯一需要的向导

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

Photo by travelnow.or.crylater on Unsplash

当我开始学习自然语言处理时,正则表达式真的感觉像一门外语。我努力理解语法,花了几个小时写一个正则表达式来返回我正在寻找的输入。很自然的,我尽可能的远离他们。

但事实是,作为一名数据科学家,总有一天你会接触到正则表达式。它们构成了自然语言处理中基本技术的一部分,学习它们将使你成为一个更高效的程序员。

所以是时候坐下来开始了。把学习正则表达式想象成一堂语法课:它们很痛苦,起初看起来不可理解,但一旦你理解并学会了,你会感到如释重负。我向你保证,到头来也没那么难。

注意,我将在本文中使用的编程软件是 R.

展开正则表达式

简而言之,正则表达式是给函数的“指令”,告诉它如何匹配或替换一组字符串。

让我们从正则表达式的一些基础开始,这是一些你应该知道的基本语法。

括号 []用于指定字符的析取。例如,使用括号放 W 或 W 允许我返回大写的 W 或小写的 W。

/[wW]oodchuck/ --> Woodchuck or woodchuck 
/[abc]/ --> ‘a’, ‘b’, or ‘c’
/[1234567890]/ --> any digit

如果你添加一个破折号,你就指定了一个范围。例如,将 A-Z 放在括号中允许 R 返回一个大写字母的所有匹配。

/[A-Z]/ → machtes an upper case letter
/[a-z]/ → matches a lower case letter
/[0–9]/ → matches a single digit

可以用于否定,或者仅仅表示.

/[ˆA-Z]/ --> not an upper case letter
/[ˆSs]/ --> neither ‘S’ nor ‘s’
/[ˆ\.]/ --> not a period
/[eˆ]/ --> either ‘e’ or ‘ˆ’
/aˆb/ --> the pattern ‘aˆb’

问号?标记上一个表达式的可选性。例如,将一个。在土拨鼠结束时,返回土拨鼠(不带 s)和土拨鼠(带 s)的结果。

/woodchucks?/ --> woodchuck or woodchucks
/colou?r/ --> color or colour

可以用。指定两个表达式之间的任意字符。例如,输入 beg.n 将返回 begin 或 begin 这样的单词。

/beg.n/ --> Match any character between beg and n (e.g. begin, begun)

*或+ 用户允许您添加 1 个或多个先前字符。

 oo*h! → 0 or more of a previous character (e.g. ooh!, ooooh!)
o+h! → 1 or more of a previous character (e.g. ooh!, ooooooh!)
baa+ → baa, baaaa, baaaaaa, baaaaaaa

用于断言关于字符串或匹配过程的一些东西。因此,它们不是用于特定的单词或字符,而是帮助进行更一般的查询,正如您在下面的示例中所看到的。

 . → any character except a new line
\\w → any word character
\\W → anything but a word character
\\d → any digit character
\\D → anything but a digit character
\\b → a word boundary
\\B → anything but a word boundary
\\s → any space character
\\S → anything but a space character

POSIX 字符类别有助于匹配特定的字符类别,如数字。换句话说,它使一个小的字符序列匹配一个更大的字符集。

 [[:alpha:]] → alphabetic characters
[[:digit:]] → digits
[[:punct:]] → punctuation
[[:space:]] → space, tab, newline etc.
[[:lower:]] → lowercase alphatic characters
[[:upper:]] → upper case alphabetic characters

strsplit()、grep()和 gsub()

这是行动开始的地方。在处理字符串时,很可能必须使用命令 strsplit()、grep()和 gsub()来激活您希望 R 返回给您的输入。

strsplit(x,split)

下面的例子展示了一种使用 strsplit 来拆分句子中的单词的方法,在这个例子中是破折号“…”内的所有单词。

richard3 <- “now is the winter of our discontent”
strsplit(richard3, “ “) # the second argument specifies the space

grep(pattern,x,ignore.case = FALSE,value = FALSE)

grep 允许你“抓取”你想要的单词或单词集,这取决于你设置的匹配模式。例如,在下面的代码中,我让 R 返回包含单词“both”的字符串。

grep.ex <- c(“some like Python”, “some prefer R”, “some like both”)grep(“both”, grep.ex) # in numerical form
grep(“both”, grep.ex, value=TRUE) #prints the character string itself

gsub(pattern,replacement,x,ignore.case= FALSE)

例如,gsub 允许你用一个词替换另一个词。在这种情况下,我选择在下面的字符串中用超人代替罗密欧。

r_and_j <- “O Romeo, Romeo, wherefore art thou Romeo?”
gsub(“Romeo”, “Superman”, r_and_j, ignore.case = FALSE)

应用了正则表达式

让我们开始将这些命令应用于正则表达式。下面我给你看几个例子。

1.grep(模式,x,ignore.case =假,值=假)

dollar <- c(“I paid $15 for this book.”, “they received $50,000 in grant money”, “two dollars”)

注意,在上面的例子中,你有三个不同的句子,其中两个使用了 符号,一个使用了单词“美元”。仅使用 符号,一个使用了单词“美元”。仅使用 符号,一个使用了单词美元。仅使用来匹配您的模式将会返回所有三个句子。然而,如果你在 前加上 你可以指定你只需要使用 前加上\\你可以指定你只需要使用 前加上你可以指定你只需要使用符号的句子。

grep(“$”, dollar) 
grep(“\\$”, dollar)

下面还有几个例子,说明如何使用 grep 来匹配单词“ashes”、“shark”、“bash”的正则表达式:

# matches all three vector elements
grep(“sh”, c(“ashes”, “shark”, “bash”), value=TRUE) # matches only “shark”
grep(“^sh”, c(“ashes”, “shark”, “bash”), value=TRUE) # matches only “bash”
grep(“sh$”, c(“ashes”, “shark”, “bash”), value=TRUE) 

关于“失态”、“擦破”、“粉笔”三个词:

quant.ex <- c(“gaffe”, “chafe”, “chalk”, “encyclopaedia”, “encyclopedia”)# Searching for one or more occurences of f and we want to see the value not only the index (that’s why we put value = TRUE)
grep(“f+”, quant.ex, value=TRUE) # one or two “f”
grep(“f{1,2}”, quant.ex, value=TRUE) # at least one “f”
grep(“f{1,}”, quant.ex, value=TRUE)

2.gsub(pattern,replacement,x,ignore.case= FALSE)

在下面的例子中,你可以用 gsub 替换句子中的单词。

ex.sentence <- “Act 3, scene 1\. To be, or not to be, that is the Question:”

如果您还记得在本文第一部分中学习的正则表达式,您应该能够猜出 R 将返回哪种输入。否则,我会将它添加到下面的代码中,以便您更好地理解使用正则表达式返回所需结果的所有不同方式。

gsub(“.”, “*”, ex.sentence, ignore.case=TRUE, perl=TRUE)
[1] "**********************************************************"gsub(“\\w”, “*”, ex.sentence, ignore.case=TRUE, perl=TRUE)
[1] "*** *, ***** *. ** **, ** *** ** **, **** ** *** ********:"gsub(“\\W”, “*”, ex.sentence, ignore.case=TRUE, perl=TRUE)
[1] "Act*3**scene*1**To*be**or*not*to*be**that*is*the*Question*"gsub(“\\d”, “*”, ex.sentence, ignore.case=TRUE, perl=TRUE)
[1] "Act *, scene *. To be, or not to be, that is the Question:"gsub(“\\D”, “*”, ex.sentence, ignore.case=TRUE, perl=TRUE)
[1] "****3********1********************************************"gsub(“\\b”, “*”, ex.sentence, ignore.case=TRUE, perl=TRUE)
[1] "*Act* *3*, *scene* *1*. *To* *be*, *or* *not* *to* *be*, *that* *is* *the* *Question*:"gsub(“\\B”, “*”, ex.sentence, ignore.case=TRUE, perl=TRUE)
[1] "A*c*t 3,* s*c*e*n*e 1.* T*o b*e,* o*r n*o*t t*o b*e,* t*h*a*t i*s t*h*e Q*u*e*s*t*i*o*n:*"gsub(“\\s”, “*”, ex.sentence, ignore.case=TRUE, perl=TRUE)
[1] "Act*3,*scene*1.*To*be,*or*not*to*be,*that*is*the*Question:"gsub(“\\S”, “*”, ex.sentence, ignore.case=TRUE, perl=TRUE)
[1] "*** ** ***** ** ** *** ** *** ** *** **** ** *** *********"

否则,试着猜测最后一个问题的答案:

letters.digits <- “a1 b2 c3 d4 e5 f6 g7 h8 i9”
gsub(“(\\w)(\\d)”, “\\2\\1”, letters.digits)

就是这样!我希望你喜欢这篇文章,并且我已经设法使正则表达式对你来说更容易理解。

我经常写关于数据科学和自然语言处理的文章。在 Twitter Medium上关注我,查看更多类似的文章或简单地更新下一篇文章。 感谢阅读!

PS:最后一个的答案是“1a 2b 3c 4d 5e 6f 7g 8h 9i”。换句话说,您已经使用正则表达式重写了所有的字母和数字。很酷不是吗?

过去 25 年中的 NLP 商业化

原文:https://towardsdatascience.com/nlp-commercialization-in-the-last-25-years-6468d8119fcd?source=collection_archive---------22-----------------------

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

Photo by Thomas Kelley on Unsplash

自然语言工程期刊 现在已经是第 25 个年头了。早在 1995 年第一期的编辑序言中就强调,该杂志的重点是自然语言处理(NLP)技术的实际应用:这是一个严肃的出版物,有助于鼓励研究想法进入实际产品的时机已经成熟。那时 NLP 技术的商业化已经开始,但是在过去的四分之一世纪里,事情已经有了巨大的进展。因此,为了庆祝杂志的周年纪念,我们来看看商业 NLP 产品在过去 25 年中是如何发展的。

这篇文章的一个版本也出现在 2019 年 5 月的《自然语言工程》杂志上。

一些背景

对许多研究人员来说,自然语言处理工作有双重吸引力。一方面,语言理解或语言产生的计算模型经常被视为探索语言学和心理语言学理论问题的手段,一般的论点是,如果你能建立某种现象的计算模型,那么你很可能朝着理解这种现象的方向前进了一些。另一方面,自然语言处理技术的实际应用范围一直很诱人:我们可以构建真正有用的与人类语言一起工作的计算工件的想法可以追溯到 20 世纪 50 年代早期机器翻译实验领域的起源。

然而,直到 20 世纪 90 年代早期,NLP 的商业应用才真正开始蓬勃发展,特别是在美国的定向研究的推动下,其中大部分是由 DARPA 通过消息理解会议(MUC)等项目资助的,而在欧洲,则是通过许多大规模前瞻性的 EU-资助的研究项目。正是在这种活动的背景下,自然语言工程杂志应运而生,其明确的目标是主要关注实践贡献而非理论贡献。

《华尔街日报》现在已经是第 25 个年头了,我们有一个很好的借口来看看 NLP 商业化的历史,并反思我们在这 25 年里走了多远。

起点

除了是该杂志创刊的一年,1995 年还发生了大量与计算机相关的事件。这是视窗 95 和网景问世的一年;Java 1.0 出现,JavaScript 被开发出来;DVD 问世了,索尼在北美发布了 PlayStation。也是在这一年,NSFNet 退役,消除了互联网商业化的最后限制。Yahoo.com、eBay.com 和 Amazon.com 都是在 1995 年启动的。IBM 推出了“深蓝”,这一计算机系统后来打败了国际象棋世界冠军加里·卡斯帕罗夫。啊,那是令人兴奋的日子!

为了我们现在的目的,1995 年也是肯·丘奇和丽莎·劳发表了一篇关于自然语言处理程序商业化的文章的一年。值得回顾一下当时该领域是如何出现的。丘奇和劳着眼于四个领域的发展:一般的自然语言处理,文字处理,信息检索和机器翻译。在每一个案例中,他们都试图描述什么是广为人知的技术,什么是最先进的,什么是更具前瞻性的。表 1 重述了该论文中相关汇总数字的内容。

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

在某些方面,看起来似乎没有什么变化:尽管丘奇和饶认为前瞻性的每个主题都取得了进展,但它们不是你所说的完全解决的问题,所以我认为它们在某些方面仍然是前瞻性的,也许沿着真正的人工智能是我们尚未建立的东西的路线。但是在下面我们将探讨的各种方式中,该领域已经在许多方面向前发展,并且今天日常使用的基于 NLP 的产品在 25 年前我们不会认为是合理的。

当然,最值得注意的是,由于广泛采用机器学习和统计技术,解决许多问题的方法发生了变化;在 20 世纪 90 年代中期,人们对统计方法进行了研究,但任何已经达到产品状态的东西,就其技术基础而言,都可能主要是基于规则的。新技术不仅为老问题提供了新的解决方案,还将新问题带到了舞台上,产生了我们以前想不到的产品创意。

商业景观

出于这里提供的分析的目的,我将采用 NLP 应用程序和技术的空间分解,它与 Church 和 Rau 使用的略有不同,并且对应于我在以前的专栏中使用的空间分解。这种世界观将商业 NLP 领域分为六个关键领域:

机器翻译:将源自然语言中的语言内容翻译成目标自然语言的保义翻译。

语音技术:将对应于语言话语的波形转换成该话语的文本呈现(语音识别);或者相反,将语言表达的文本表示转换成相应的音频形式(语音合成或 TTS)。

对话界面:交互式界面,允许用户提出自然语言问题(通过语音或文本)并获得答案,可能在较长的多回合对话中。

文本分析:检测文本来源中有用的内容或信息,通常通过分类或提取。

自然语言生成:从一些潜在的非语言信息表示中生成语言输出。

写作辅助:体现一些语言知识的技术,目的是提高人类创作的语言内容的质量。

当然,还有其他方法可以分解能量场。我发现这种看待事物的方式很有用,因为它相当好地对应了该领域供应商倾向于使用的一组自我分配的类别。有争议的是,语音技术不再代表一个独立的类别,已经在某种程度上被吸收到更广泛的对话界面领域。然而,至少早在 20 世纪 90 年代,用于将语音转换为文本的技术与用于处理文本的技术之间就有着明显的区别。

在本文的剩余部分,我们将依次研究这六个类别中的每一个。

机器翻译

如前所述,机器翻译的第一次实验开始于 20 世纪 50 年代,随着现在著名的 1954 年乔治敦-IBM 俄语到英语的翻译演示获得了广泛的关注。商业提供商在 20 世纪 60 年代末和 70 年代初出现,事实上,该领域最早的公司之一, Systran (成立于 50 多年前的 1968 年)
仍然是领先的翻译工具和服务提供商。

早期的机器翻译系统纯粹是象征性的,基于大量手写规则,将一种语言的语言内容转换成另一种语言。商业机器翻译软件的 PC 版本在 20 世纪 90 年代初开始出现。直到 20 世纪 90 年代后期,基于网络的翻译才出现(回想一下,网络在 1991 年才公开),1997 年 AltaVista 的 Babel Fish translator 使用了 Systran 的技术。因此,25 年前,商业机器翻译是一种基于规则的努力,商业重点是体现功能的工作台,如翻译记忆,这可以提高生产率。虽然 IBM 在 20 世纪 80 年代末发表了关于统计机器翻译(SMT)的研究,但直到 2007 年,随着谷歌翻译
的推出,基于网络的翻译才成为统计翻译。

今天,翻译行业处于不断变化的状态。有时粗糙的 SMT 被
认为对于某些目的来说已经足够好了,毫无疑问,深度学习技术的使用已经改善了结果。但是机器翻译在质量和准确性方面仍有一些不足,因此有越来越多的混合解决方案试图将机器翻译的可扩展性与人工翻译的精确性和准确性结合起来;例如,参见 Lilt 。机器翻译的广泛可用性和低成本在更广泛的翻译行业引发了大量的反思:每当机器翻译的质量提高时,[人工翻译不得不重新考虑他们给这个团体带来了什么](https://slator.com/sponsored-content/how-augmented- translation-will-redefine-the-value-of-translators/)。这种
是一种存在主义焦虑,我们可以期待在未来几年里看到它继续上演。

但是回到 1995 年,谁会想到你可以将手机摄像头对准日文菜单,然后在屏幕上看到英文翻译?那是科幻小说里的东西。

语音技术

语音社区早在 NLP 世界的其余部分之前就接受了统计技术;特别是,hmm 在 20 世纪 70 年代的采用是一个重大突破,导致了识别性能的显著提高。但是语音识别的进步仍然受到当时内存和计算能力的限制。在 20 世纪 70 年代末,IBM 拥有可以识别 1000 个单词的词汇的技术——前提是每个单词作为一个独立的单元说出,并且在下一个单词之前有一个停顿。到了 20 世纪 90 年代,技术得到了改进,计算能力也提高到了在 PC 桌面上进行语音识别的程度。1990 年为基于 DOS 的计算机发布的 Dragon Dictate 售价 9000 美元,但仍只能识别孤立的单词。Dragon Naturally
Speaking 于 1997 年 7 月问世,它可以每分钟识别多达 100 个单词的连续语音(一旦你对它进行 45 分钟的训练,使它适应你的声音),同年晚些时候,IBM 发布了一款名为 ViaVoice 的竞争产品与之匹敌。

20 世纪 90 年代中期,是语音识别商业应用的早期。与其他任何领域相比,过去 25 年取得的惊人进步在这里最为明显:将 20 世纪 90 年代初的孤立单词识别与我们现在对 Alexa、Siri 和谷歌助手的识别准确性的期望进行对比。

在过去的 25 年里,商用语音合成技术也经历了巨大的改进。自 20 世纪 90 年代初以来,许多计算机操作系统都包括了语音合成器。机器人 DECtalk——以斯蒂芬·霍金的声音而闻名——于 20 世纪 80 年代中期推出,但语音合成技术到 1995 年并没有太大变化。在 20 世纪 90 年代采用串联合成产生了听起来更自然的合成输出,但仍然有听觉故障,并且感觉输出不太令人信服。然而,由于深度学习技术的应用,过去几年已经取得了重大发展。今天部署的语音合成的高质量是最明显的,如果你听听[谷歌双工的对话贡献](https://ai.googleblog.com/2018/05/duplex-ai-system-for-natural- conversation.html),完成
犹豫和填充,或者 Alexa 最近引入的[新闻播音员的声音](https://techcrunch.com/2019/01/16/alexa-gets-a-professional- newscaster-voice-for-reading-the-days-news)。

对话界面

我使用术语“对话界面”来涵盖许多不同的技术:

  • 20 世纪 60 年代和 70 年代早期基于文本的对话互动实验,例如约瑟夫·韦森鲍姆的《伊莉莎》。
  • 基于文本的自然语言数据库界面在 20 世纪 70 年代和 80 年代是人们关注的焦点,它允许用户输入诸如“有多少销售人员比我挣得多?”而不是必须制定一个意思相同的 SQL 查询。
  • 20 世纪 90 年代的语音对话系统,在基于电话的应用中,有限状态对话模型
    与基于语法的语音识别
    相结合。
  • 现在的虚拟助手,比如 Siri,Alexa,Google Assistant。
  • 今天的基于文本的聊天机器人,在许多网站和消息应用程序上都可以找到,
    显示了广泛的功能(或者,通常是缺乏功能)。

这些看起来似乎都是非常不同种类的应用程序,但是它们都有一个共同点,那就是它们都试图支持某种形式的自然语言对话。如今,这项技术已经出现在大多数日常用户面前,这种对话通常仅限于一次性的问答环节(“嘿,Alexa,几点了?”).然而,在过去的几年中,许多供应商已经提出了变得更加会话化的需求,在多个回合中保持对话,因此必须处理诸如会话上下文和回指之类的对话现象。因此,交互式语音识别开发人员在 20 世纪 90 年代和 21 世纪初学到的许多经验正在被今天的聊天机器人开发人员重新学习。布鲁斯·巴伦廷在这个
话题上的重要贡献在今天和 10-20 年前一样重要。

马克·吐温被指责几乎引用了每一句名言,据说他说过“历史不会重演,但它常常会重复”。因此,当新的对话设计者正在重复他们 20 年前的前辈的错误时,今天的区别是语音识别实际上工作得足够好,以至于基于文本的界面和基于语音的界面之间几乎没有区别。在 20 世纪 80 年代和 90 年代,NLP 在对话方面的工作通常只是假设存在完美的语音识别,这个问题需要由大楼中的其他团队来解决;但当时的高识别错误率意味着,如果在真实的口语中放任自流,这些系统从根本上说是不可行的。

但是,自那时以来,我们已经走过了漫长的道路。1992 年,美国电话电报公司推出了用于呼叫路由的语音
识别服务,证明了即使使用极其有限的五个术语词汇也可以开发出有用的应用程序:该应用程序用于对方付费和向第三方付费的长途呼叫,并识别对录音语音提示的五种不同响应:“电话卡”、“对方付费”、“第三方”、“个人对个人”和“接线员”。20 世纪 90 年代早期的 DARPA 口语系统计划,特别是 ATIS(航空旅行信息系统)共享任务,展示了在实验室中可以实现的令人印象深刻的结果,并鼓励了交互式语音识别行业的开始。即将成为基于电话的 IVR 的重量级公司 Nuance 和 SpeechWorks 都是在 20 世纪 90 年代中期在 DARPA ATIS 任务取得进展的背景下成立的;到 20 世纪 90 年代后期,越来越多的商业上有用的应用被开发出来,如上所述,结合了有限状态对话建模和基于语法的语音识别来管理语音识别错误。

今天,我们仍然没有解决长期的自然主义对话所带来的问题。但是,即使它的应用领域很窄,也很难不对谷歌双工展示的对话能力印象深刻。

文本分析

我使用术语“文本分析”来涵盖通常应用于文档的各种分类和提取过程。DARPA 资助的 MUC 会议是定义和发展这一技术领域的关键,早期的最初重点是命名实体识别。到 20 世纪 90 年代中期,开始出现旨在将这些方法商业化的商业实体。其中只有一小部分仍然作为独立的公司存在;据我所知,只有两家是成立于 1995 年的 Basis 和成立于 1996 年的 NetOwl 。然而,许多其他早期参与者已经被收购,并仍然以其他形式活跃:特别是,1998 年成立的 ClearForest,现在成为汤森路透文本分析解决方案的一部分,品牌为[路孚特](http://www. opencalais.com)。

如果您将这些老供应商与该领域的许多新进入者进行比较,产品的成熟度,尤其是在功能广度方面,是显而易见的。但老玩家没有满足于他们的荣誉:Basis 和路孚特似乎都在跟上时代,引入深度学习技术,就像新的竞争对手将这些技术作为起点一样。

也许在过去的 25 年中最显著的发展是情感分析作为一项关键技术的出现;以至于一些文本分析公司,如 Clara bridge T1,已经重生为专注于客户体验分析的 T2 技术提供商。

与其他所有事情一样,深度学习已经进入了文本分析领域,相当多的新进入者自豪地谈论他们使用这些新技术作为区分自己和保守派的一种方式。尚不清楚这些方法是否真的比那些更成熟的参与者提供了更好的结果,这些参与者当然受益于在其间的几十年中调整了他们的技术。有趣的是,早在 1995 年,Church 和 Rao 就将事件提取视为该领域的前瞻性主题:对于少数选择接受它的商业文本分析提供商来说,它仍然是一个挑战。在另一个历史押韵的例子中,地名词典——最早的命名实体识别方法的支柱——又回来了,但是是从 DBpedia 等来源构建的更丰富形式的知识图。事实证明,字符串匹配在 1995 年是一个好主意,今天仍然是一个好主意。

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

自然语言生成

1995 年,NLG 几乎没有任何商业活动。据我所知,当时活跃在该领域的唯一一家公司 CoGenTex 成立于 1990 年,主要依靠政府合同生存。但是
今天的情况很不一样;在过去的 5-10 年里,越来越多的公司宣称自己是 NLG 的供应商。叙事科学和[自动洞察](/ automatedinsights.com)是这里最引人注目的玩家,但还有阿里亚·NLGAx 语义学Yseop 等等。据我所知,这些公司中的大多数似乎都在使用某种“智能模板”来生成常规文本,如财务报告或数据驱动的新闻报道。这些供应商中的许多还在为 Tableau 和 Qlik 等商业智能工具制作[插件,为这些工具已经制作的高质量可视化内容添加叙事内容。几乎没有证据表明,商业 NLG 产品利用了更丰富的语言概念,如聚合和引用表达式生成,这些概念是在研究社区中开发的;我的感觉是,到目前为止正在探索的用例并不保证使用这些想法。随着越来越复杂的应用程序的尝试,这种情况当然会改变。](https://www.tableau.com/about/blog/2016/8/bringing-power- natural-language-tableau-58325)

更非传统形式的 NLG 的商业应用——至少从传统 NLG 研究议程的角度来看——也已经出现。仅举两个例子: Phrasee 为电子邮件生成优化的推送
消息和主题行;此外,利用图像字幕方面的最新进展,微软的视觉人工智能通过为图像制作描述来帮助那些视力受损的人。尤其是后者,在 1995 年还没有出现。

写作辅助

1995 年,自动化写作辅助包括拼写检查器、风格检查器和基于模式匹配的非常简单的语法检查器。Word Perfect 是 20 世纪 90 年代初微软 Word 的主要竞争对手,它授权并随后收购了一款名为 Grammatik 的产品;MS Word 许可了一个名为 CorrecText 的竞争工具。像当时所有可用的语法检查器一样,这些工具的灵感来自 Unix Writer’s Workbench 中使用的简单字符串匹配方法。我们不得不等到 1997 年,微软才发布了自己的基于语法的语法检查器,作为微软 Word 的一部分,使用的是由 Karen Jensen 和 George Heidorn 开发的技术,他们之前负责 IBM 的 Epistle
语法检查系统:论文发表在 20 世纪 80 年代初的 Epistle 上,但正是 Word 中基于语法的语法检查在 14 年后将 NLP 技术应用于数百万台桌面上。

到了 20 世纪 90 年代中期,Word Perfect 开始走下坡路(尽管它直到-
日仍可使用),微软似乎赢得了桌面战争。Word 的垄断意味着进一步开发语法检查功能的动力很少,而且对新玩家来说门槛很高。因此,在 2009 年 Grammarly grammar 和 style checker 出现之前,这方面的商业活动并不多。到 2017 年,Grammarly 声称拥有[690 万日活跃用户](https://producthabits.com/how-grammarly-quietly-grew-its-way-to-7- million-daily-users),其中大部分用户免费使用该服务。这与微软 2016 年[的 12 亿 Office 用户](https://www.windowscentral.com/there-are-now-12-billion-office-users-60- million-office-365-commercial-customers)相比是一个微小的用户群,但当然不是每个使用 Word 的人也使用 Word 的语法检查器;没有真正可比的数字。碰巧的是,2017 年微软[开始推出对其语法检查器](https://redmondmag.com/articles/2017/06/21/making-word-grammar-checker- better.aspx)的改进,最近在 Build 2019 大会上发布了一些重要公告。因此,经过多年的停滞,我们可能希望 Grammarly 作为一个严重的竞争对手的到来将为这一领域的发展注入新的活力。我自己的观点是,我们将在未来几年看到一些重大的产品改进,将 NLG 的想法与提供写作帮助结合起来。

总结

这就是你要去的地方:在《自然语言工程杂志》的生命周期中,商业 NLP 是如何发展的旋风之旅。很明显,NLP 行业在这段时间里已经走过了很长的路。早在 1995 年,该领域之外相对较少的人知道如何扩展缩写词“NLP ”,任何随机的个人都可能认为它指的是神经语言学编程。今天,几乎每个拥有智能手机的人都有过通过 Siri 或谷歌助手直接使用 NLP 技术的经历,这个术语被广泛理解。

在某种程度上,我们的期望已经无限增长。我们越来越习惯于向我们的智能扬声器抛出随机问题。通过基于网络的化身,我们将机器翻译视为随时可用的商品。但与此同时——我发现这是一个令人着迷的发展——我们的期望在某种程度上也更加现实。如果 Alexa 误解了我们的问题,或者 Google Assistant 给出了一个看似虚假的答案,我们不会特别不安;我们承认这些技术偶尔出错是正常的。同样,我们知道我们应该谨慎对待机器翻译的结果,怪异的翻译不再保证它们曾经产生的幽默关注。我们似乎已经到达了这样一个点,尽管不完美,但技术已经足够好,可以在日常生活中使用。通过无处不在的曝光和足够好的组合,NLP 已经成为我们日常体验中被接受的一部分。从 25 年前的角度来看,这的确令人印象深刻,而《自然语言工程》杂志在这一过程中发挥了自己的作用。

如果你想要一种简单的方法来跟上商业 NLP 世界的关键发展,可以考虑注册本周 NLP ,这是一份每周周五出版的简短时事通讯。

NLP:来自 BERT 的语境化单词嵌入

原文:https://towardsdatascience.com/nlp-extract-contextualized-word-embeddings-from-bert-keras-tf-67ef29f60a7b?source=collection_archive---------1-----------------------

使用 Keras 和 TF 从 BERT 中提取上下文化的单词嵌入

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

Photo by Eugenio Mazzone on Unsplash

毫无疑问,自然语言处理(NLP)研究在相对静止了几年之后已经有了巨大的飞跃。首先,谷歌来自 Transformer (BERT) [1]的双向编码器表示在 2018 年底成为亮点,在许多自然语言处理任务中实现了最先进的性能,不久之后,OpenAI 的 GPT-2 通过承诺更惊人的结果抢了风头,据报道,这些结果太危险了,无法发布!考虑到这些出版物背后的时间框架和参与者,不难意识到目前该领域有很多活动。

也就是说,我们将在这篇文章中关注 BERT,并试图通过提取像 ELMo [3]一样的预训练上下文化的单词嵌入来获得一小块蛋糕。

为了给你一个简要的概述,我将首先给出一点背景知识,然后对 BERT 的体系结构做一个高层次的概述,最后在解释一些棘手的部分的同时跳到代码中。

为了更加方便,我将使用 Google 的 Colab 进行编码,但是相同的代码也可以在您的本地环境中运行,无需做太多修改。

如果您只是为了编码部分而来,请跳到“ BERT 单词嵌入提取”部分。在这里找到完成的笔记本代码。

单词嵌入

首先,嵌入只是高维向量空间中一个点的(适度)低维表示。同样,单词嵌入是单词在低维空间中的密集向量表示。第一个,利用神经网络的单词嵌入模型由谷歌的研究于 2013 年发表[4]。从那以后,在今天实践中使用的几乎每个 NLP 模型中都遇到了单词嵌入。当然,坦率地说,如此大规模采用的原因是它们的有效性。通过将一个单词翻译成一个嵌入,就有可能以数字形式模拟一个单词的语义重要性,从而对其执行数学运算。为了更清楚地说明这一点,我会给你一个最常见的例子,你可以在单词嵌入的上下文中找到它

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

当 word2vec 模型首次实现这一点时,这是一个惊人的突破。从那里,许多更高级的模型浮出水面,它们不仅捕捉静态语义,还捕捉语境化的含义。例如,考虑下面的两个句子:

我喜欢苹果。

我喜欢苹果 macbooks

注意,apple 这个词在每个句子中有不同的语义。现在有了语境化的语言模型,单词 apple 的嵌入将有一个不同的向量表示,这使得它对于 NLP 任务来说更加强大。

然而,我将把如何工作的细节留在这篇文章的范围之外,只是为了保持简短和中肯。

变形金刚

坦率地说,NLP 领域的许多进展都可以归功于一般深度学习研究的进步。更特别的是,谷歌(又来了!)在一篇开创性的论文[5]中提出了一种新的神经网络架构,称为转换器,它比传统的顺序模型(LSTM、RNN、GRU 等)有许多好处。优点包括但不限于,对时间序列中的记号之间的长期依赖性进行更有效的建模,以及通过消除对先前记号的顺序依赖性来更有效地训练模型。

简而言之,转换器是一种编码器-解码器架构模型,它使用注意机制将整个序列的更完整图像一次转发给解码器,而不是按顺序转发,如下图所示。

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

Source: http://mlexplained.com/2017/12/29/attention-is-all-you-need-explained/

同样,我不会描述注意力如何工作的细节,因为这将使这个话题更加混乱,更难消化。请随意阅读参考资料中的相关论文。

OpenAI 的 GPT 是第一个创建带有微调的基于转换器的语言模型的人,但更准确地说,他只是使用了转换器的解码器。因此,使语言建模单向。放弃编码器的技术原因是,语言建模将成为一项琐碎的任务,因为要预测的单词最终会看到自己。

来自变压器的双向编码器表示(BERT)

到目前为止,模型的名称应该更有意义,并给你一个大概的概念。BERT 将所有东西结合在一起,使用编码器而不是解码器来构建一个基于双向转换器的语言模型!为了克服“看到自己”的问题,谷歌的人有了一个巧妙的想法。他们雇佣了蒙面语言建模。换句话说,他们隐藏了 15%的单词,并利用它们的位置信息进行推断。最后,他们还稍微混合了一下,让学习过程更有效。

尽管这种方法对收敛时间有负面影响,它甚至在收敛之前就超过了最先进的模型,从而确保了模型的成功。

通常,BERT 代表一种支持迁移学习和特定任务微调的通用语言建模,然而,在这篇文章中,我们将仅通过使用 Keras 和 TensorFlow 从 BERT 中获取 ELMo 类单词嵌入来触及其特征提取方面。

但是不要着急!在我们进入代码之前,让我们快速探索一下 BERT 的架构,以便我们在实现时有一些背景知识。相信我,这会让事情更容易理解。

事实上,BERT 开发人员创建了两个主要模型:

  1. 基: 变压器块数(L): 12,隐层尺寸(H): 768,注意头(A): 12
  2. 大: 变压器块数(L): 24,隐藏层大小(H): 1024,注意头(A): 16

在这篇文章中,我将使用基本模型,因为它足够了(而且更小!).

从一个非常高的角度来看,BERT 的架构是这样的:

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

这看起来很简单,但请记住,每个编码器模块都封装了一个更复杂的模型架构。

在这一点上,为了使事情更清楚,理解 BERT 作者用于微调和特定任务训练的特殊记号是很重要的。这些是:

  1. 【CLS】:每个序列的第一个令牌。一种分类令牌,通常与 softmax 层一起用于分类任务。对于其他任何事情,可以放心地忽略它。
  2. 【SEP】:序列定界符 token,用于序列对任务的预训练(即下一句预测)。需要序列对任务时必须使用。当使用单个序列时,它只是附加在末尾。
  3. **【掩码】😗*用于掩码字的令牌。仅用于培训前。

接下来,BERT 期望的输入格式如下所示:

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

Source: https://arxiv.org/pdf/1810.04805.pdf

因此,与 BERT 一起使用的任何输入都必须进行格式化以匹配上述内容。

输入层只是序列记号和特殊记号的向量。上例中的“***# #ing”*记号可能会引起一些人的惊讶,所以为了澄清,BERT 利用了 WordPiece [6]进行记号化,这实际上是将类似“playing”的记号拆分为“play”和“# ing”。这主要是为了涵盖更广泛的非词汇(OOV) 词汇。

记号嵌入是每个记号的词汇 id。

句子嵌入只是一个数字类,用来区分句子 A 和 b。

最后,变换器位置嵌入表示每个单词在序列中的位置。关于这个的更多细节可以在[5]中找到。

最后,还有最后一件事。到目前为止,一切都很好,但是我如何从中获得单词嵌入呢?!?如前所述,BERT 基本模型使用了 12 层变换器编码器,每一层的每一个输出都可以作为一个单词嵌入!你可能想知道,哪一个是最好的呢?嗯,我想这取决于任务,但根据经验,作者认为最好的选择之一是对最后 4 层求和,这就是我们将要做的

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

Source: http://jalammar.github.io/illustrated-bert/

*如图所示,最好的执行选项是连接最后 4 层,但在本文中,为了方便起见,使用了求和方法。更具体地说,性能差异不是很大,而且**更灵活地进一步截断维度,*不会丢失太多信息。

伯特单词嵌入提取

理论说够了。让我们继续练习。

首先,创建一个新的 Google Colab 笔记本。进入编辑- >笔记本设置,确保硬件加速器设置为 TPU。

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

现在,第一个任务是克隆官方的 BERT 存储库,将它的目录添加到 path 中,并从那里导入适当的模块。

*!rm -rf bert
!git clone [https://github.com/google-research/bert](https://github.com/google-research/bert)import syssys.path.append('bert/')from __future__ import absolute_import
from __future__ import division
from __future__ import print_functionimport codecs
import collections
import json
import re
import os
import pprint
import numpy as np
import tensorflow as tfimport modeling
import tokenization*

从 BERT 导入的两个模块是建模标记化。建模包括 BERT 模型实现,而标记化显然是为了标记化序列。

除此之外,我们从 colab 获取我们的 TPU 地址,并初始化一个新的 tensorflow 会话。(注意这只适用于 Colab。本地运行时,不需要)。如果您在运行下面的块时看到任何错误,请确保您使用 TPU 作为硬件加速器(见上文)

接下来,我们选择想要使用的 BERT 模型。

正如你所看到的,有三种模型可供我们选择,但实际上,在官方的 BERT GitHub 资源库中甚至有更多预先训练好的模型可供下载。这些只是已经被谷歌下载并存放在一个开放的桶中的模型,因此可以从合作实验室访问。(对于本地使用,您需要下载并提取一个预先训练好的模型)。

回想一下之前的参数:12 L(变形块)768 H(隐藏层大小)12 A(注意头像)。“不区分大小写”只适用于小写序列。在本例中,我们将使用无案例的 BERT 基本模型。

此外,我们为模型定义了一些全局参数:

上面的大多数参数都是不言自明的。在我看来,唯一有点棘手的是层数组。回想一下,我们使用的是 12 个隐藏编码器的最后 4 层。因此,层保持它们的索引。

下一部分将专门为处理前和处理后的输入定义包装类(特性)。

InputExample 类中,我们已经将 text_b 默认设置为 None ,因为我们的目标是使用单个序列而不是序列对。

而且 InputFeatures 类封装了 BERT 输入需要的特性(见上面的输入图)。 tokens 属性显然是输入记号的向量, input_ids 是与词汇表中的记号相对应的 id, input_mask 从填充中注释真实的记号序列,最后, input_type_ids 将段 A 与段 B 分开,因此它在这里实际上并不相关。

现在,添加以下代码:

这是为了设置我们的估计器。估计器只是 tensorflow 提供的模型的抽象,以及用于训练、评估和预测的 API。因此,我们的定制估算器是 BertModel 的包装器。诚然,有部分代码可以从上面删除,但我坚持谷歌提供的例子只是为了保持一致。重要的部分是第 60 行——在这里定义了 bert 模型——和第 100 行,在这里提取了前 4 层的预测。

继续添加以下内容:

这是负责输入处理的函数。换句话说,它将输入样本转换为输入特征*。*

除此之外,我们还创建了一个函数,用于将一个普通的字符串序列转换成 InputExample :

现在,对于代码的最后一位,我们定义了一个函数,该函数接受一个字符串数组作为参数,接受嵌入输出的所需维度(max 768 ),并返回一个字典,将令牌作为键,将嵌入向量作为值。

上面的代码片段简单地构建了估计器,并基于给定的输入调用预测。

让我们通过运行以下命令来测试我们的模型:

*embeddings = get_features([“This is a test sentence”], dim=50)
print(embeddings)*

如果一切顺利,您将拥有一个包含每个令牌大小为 50 的嵌入的字典。请记住,这些是上下文化的嵌入,所以如果您在不同的序列上有重复的标记,那么只有最后一个标记的嵌入会保留在字典中。要保留两者,请用不同的数据结构替换字典。

你可以在这里找到完整的笔记本。

未来的工作

现在,这些嵌入可以用作为定制任务构建的其他模型的输入特性。然而,我将把它留到另一篇文章中。或者甚至可以实现一个 BERT Keras 层来实现无缝嵌入集成。

结论

这都是我给你们的。我希望你喜欢这篇文章,并希望对伯特有一个更清晰的了解。欢迎在评论区发表您的反馈或问题。

参考资料:

[1] J.Devlin,M. Chang,K. Lee 和 K. Toutanova, BERT:用于语言理解的深度双向转换器的预训练 (2018)

[2],Alec,Wu,Jeff,Child,Rewon,Luan,David,Amodei,Dario,Sutskever,Ilya,语言模型是无监督多任务学习器 (2019)

[3] M. Peters,M. Neumann,M. Iyyer,M. Gardner,C. Clark,K.Lee 和 L.Zettlemoyer,深度语境化的词语表征 (2018),计算语言学协会北美分会

[4] T.Mikolov,I. Sutskever,K. Chen,G. Corrado 和 J. Dean,单词和短语的分布式表示及其组合性 (2013)

[5]A .瓦斯瓦尼、n .沙泽尔、n .帕尔马、j .乌兹科雷特、l .琼斯、A .戈麦斯、l .凯泽和 I .波洛苏欣,注意力是你所需要的全部 (2017)

[6]吴、舒斯特、陈、乐、、马切里、克里昆、曹、高、马切里、克林纳、沙阿、约翰逊、刘、Kaiser、S. Gouws、Y. Kato、T. Kudo、H. Kazawa、K. Stevens、G. Kurian、N. Patil、W. Wang、C. Young、J. Smith、J. Riesa、A. Rudnick、O. Vinyals、G. Corrado、M. Hughes 和 J. Dean 谷歌的神经机器翻译系统:弥合人类和机器翻译之间的鸿沟 (2016)

面向初学者的 NLP:清理和预处理文本数据

原文:https://towardsdatascience.com/nlp-for-beginners-cleaning-preprocessing-text-data-ae8e306bef0f?source=collection_archive---------2-----------------------

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

NLP 是自然语言处理的缩写。你可能知道,计算机不像理解数字那样擅长理解单词。这一切都在改变,尽管 NLP 的进步每天都在发生。事实上,苹果的 Siri 和亚马逊的 Alexa 等设备可以(通常)理解我们询问天气、方向或播放某种类型的音乐,这些都是自然语言处理的例子。你的电子邮件中的垃圾邮件过滤器和你在小学学会打字后使用的拼写检查是你的计算机理解语言的一些其他基本例子。

作为一名数据科学家,我们可能会使用 NLP 进行情感分析(将单词分类为具有正面或负面含义),或者在分类模型中进行预测,等等。通常情况下,无论我们是得到数据还是不得不搜集数据,文本都是自然的人类格式的句子、段落、推文等。在我们开始分析之前,我们必须做一些清理工作,将文本分解成计算机容易理解的格式。

对于这个例子,我们正在检查亚马逊产品/评论的数据集,可以在 data.world 上找到并免费下载。我将在 Jupyter 笔记本中使用 Python。

以下是使用的导入:

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

(如果您以前从未使用过,您可能需要在单元格中运行nltk.download()。)

读入 csv 文件,创建数据框并检查形状。我们从 10,000 行和 17 列开始。每一行都是亚马逊上不同的产品。

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

我进行了一些基本的数据清理,现在我不会详细介绍,但如果你想要一些提示,你可以在这里阅读我关于 EDA 的帖子。

为了使本例的数据集更易于管理,我首先删除了空值过多的列,然后删除了所有剩余的空值行。我将number_of_reviews列的类型从 object 改为 integer,然后创建了一个新的 DataFrame,只使用不超过 1 个 review 的行。我的新形状是 3705 行 10 列,我把它重新命名为reviews_df

注意:如果我们真的要使用这个数据集进行分析或建模,或者除了文本预处理演示之外的任何事情,我会建议 而不是 删除这么大比例的行。

下面的工作流程是我被教导使用和喜欢使用的,但是步骤只是让你开始的一般建议。通常我必须根据文本格式进行修改和/或扩展。

  1. 删除 HTML
  2. 标记化+去除标点符号
  3. 删除停用词
  4. 词汇化或词干化

在清理这些数据时,我遇到了一个以前从未遇到过的问题,并从geeksforgeeks.org那里学到了一个很酷的新技巧,将一列中的字符串按照空格或指定字符拆分成多列。

我最感兴趣的列是customer_reviews,但是,仔细一看,它目前在由//分隔的一个单元格中包含评论标题、评级、评论日期、客户名称和评论。

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

熊猫.str.split的方法可以适用于一个系列。第一个参数是你想要分割的字符串的重复部分,n=最大分割数,expand=True将分割成新的列。我将 4 个新列设置为一个名为reviews的新变量。

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

然后可以在原来的reviews_df中重命名新的 0,1,2,3,4 列,去掉原来乱七八糟的列。

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

我对新的customer_name列运行相同的方法,在\n \n上进行拆分,然后删除第一列和最后一列,只留下实际的客户名称。如果这是一篇更长的文章,我们还可以做更多的事情!马上,我可以看到名字和日期仍然可以使用一些清洗,把他们放在一个统一的格式。

删除 HTML 是我这次没有做的一个步骤,但是,如果数据来自网络抓取,从这个步骤开始是个好主意。这是我会使用的函数。

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

几乎每一步都包括创建一个函数,然后将其应用于一个系列。做好准备,lambda 函数将很快成为你的新朋友!您也可以构建一个函数来一次性完成所有这些工作,但是我想展示分解并使它们更容易定制。

去掉标点符号:

一种方法是通过 list comprehension 循环遍历整个系列,并保留不在string.punctuation中的所有内容,这是我们在开始时用import string导入的所有标点符号的列表。

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

“ “.join will join the list of letters back together as words where there are no spaces.

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

If you scroll up you can see where this text previously had commas, periods, etc.

然而,正如您在上面的第二行输出中看到的,这个方法没有考虑用户输入错误。客户输入了“孙子,am**”,一旦去掉逗号,这个单词就变成了一个单词“grandsonam”**。我仍然认为如果你需要的话,知道这些是很方便的。

符号化:

这使用正则表达式(也称为 RegEx)根据指定的模式将字符串分解成单词或片段的列表。我这次选择使用的模式(r'\w')也去掉了标点符号,尤其是对于这些数据来说,这是一个更好的选择。我们还可以在 lambda 函数中添加.lower(),让所有内容都变成小写。

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

see in line 2: “grandson” and “am” are now separate.

正则表达式的其他一些例子有:

‘\w+|\$[\d\.]+|\S+’ =按空格或不与数字相连的句点分割

‘\s+’, gaps=True =获取除空格以外的所有内容作为令牌

‘[A-Z]\w+’ =只有以大写字母开头的单词。

删除停止字:

我们在开头用from nltk.corpus import stopwords从 NL 工具包中导入了一个最常用单词的列表。您可以运行stopwords.word(insert language)来获得每种语言的完整列表。有 179 个英语单词,包括’我’,‘我’,‘我自己’,‘我们’,‘你’,‘他’,‘他的’,例如。我们通常希望删除这些,因为它们的预测能力较低。有些时候你可能想保留它们。例如,如果您的语料库非常小,删除停用词会使单词总数减少很大一部分。

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

词干化&词汇化:

这两种工具都将单词缩短回其词根形式。词干有点激进。它会根据常见的前缀和/或词尾进行删减。它有时会有所帮助,但并不总是如此,因为很多时候新单词是如此的根以至于失去了它的实际意义。另一方面,词汇化将常见单词映射到一个库。与词干提取不同,它总是返回一个可以在字典中找到的合适的单词。我喜欢比较两者,看哪一个更适合我的需要。我通常更喜欢 Lemmatizer,但令人惊讶的是,这一次,词干似乎有更多的影响。

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

Lemmatizer: can barely even see a difference

你在斯特梅尔身上看到了更多的不同,所以我会保留这一点。因为这是最后一步,所以我在函数中添加了" ".join()来将单词列表连接在一起。

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

现在你的文本已经可以被分析了!您可以继续使用这些数据进行情感分析,可以使用评级或制造列作为基于单词相关性的目标变量。也许建立一个基于用户购买或商品评论或客户分类的推荐系统。可能性是无限的!

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

https://pixabay.com/photos/thank-you-neon-lights-neon-362164/

NLP 果酱:感恩而死和费西合唱团

原文:https://towardsdatascience.com/nlp-jam-the-grateful-dead-and-phish-4933063361d2?source=collection_archive---------26-----------------------

在这篇博文中,我将分享我在数据科学训练营中完成的一个项目。

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

介绍

我的数据科学训练营班级被分配了构建 NLP 模型的任务,该模型将接收 reddit 帖子,并根据文本将其分类为属于某个子编辑。项目的第一步是选择两个不同的子街道。

感恩而死乐队和费西合唱团经常被联系在一起,因为这两个乐队有着类似的艺术手法,这与大多数音乐不同,因为他们强调现场音乐会表演而不是录音室专辑。这两个粉丝群都很早就开始使用互联网,所以他们有非常活跃的 reddit 页面以及其他几个在线论坛。作为一个对这两个乐队都着迷的人,感恩而死乐队和费西合唱团·萨伯雷迪兹乐队似乎是一个显而易见的选择。

乐队的简短描述:

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

The Grateful Dead

感恩而死在 60 年代作为旧金山反文化运动的一部分而声名鹊起。他们吸收了各种音乐的影响——蓝草音乐、古典音乐、民谣、乡村音乐、蓝调音乐、爵士乐——并形成了自己独特的音乐风格。他们开创了一种演奏独特音乐会的风格,主要是即兴演奏。由于他们的演唱会与众不同,他们吸引了粉丝,这些粉丝成为了狂热的追随者,以至于一些粉丝会和乐队一起“巡演”。感恩而死的粉丝被称为“死鬼”。

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

Phish

费西合唱团成立于 1983 年,当时他还是大学生,并很快开发了一个疯狂原创的声音和歌曲目录。在大约 10 年内,他们在全国范围内拥有了自己的铁杆粉丝。尽管有不同的音乐影响和风格,他们遵循感恩而死的模式,使他们的音乐会与众不同,并强调他们的表演即兴。显然,他们的粉丝被称为“费西合唱团头”。

如果你对这几个乐队的音乐感兴趣,我会在这篇文章的最后链接到几个签名音乐。很明显,你能从一首歌或一段音乐中分辨出的东西是有限的,但是我希望能告诉你以下几点:

就乐队的乐器构成而言,有一些音乐上的相似之处,但总体而言,音乐风格相当独特。与此同时,这些乐队有一个共同的音乐表演方法,他们用自己的歌曲作为即兴创作空间的发射台。

对我来说,这是比较费西合唱团和死者最有趣的地方之一。有时候,我觉得有一种普遍的误解,认为这两个乐队有非常相似的音乐,但我认为真正将这些乐队联系在一起的是他们的粉丝。

死脑筋和费西合唱团头脑是出了名的忠诚。两个乐队都有数百首歌曲,任何给定的音乐会都由这些歌曲的一些样本组成,无论这些歌曲的顺序是在表演时自发构建的。此外,许多歌曲都附加了即兴部分,每个人的表演都不一样。结果是每场音乐会都是一场独特的演出。这也是为什么这些粉丝会不远千里重复观看演出的原因。对我来说,这表明了这两个歌迷群体在如何联系和消费音乐,以及他们如何对待生活方面的相似之处。

由于这种相似性,我希望——除了乐队本身的主要讨论主题——这两个留言板在某种程度上是可以互换的。这两个论坛大概都包含了很多关于音乐的类似讨论。这两个论坛可能都包含了很多关于时事、个人故事、哲学等各种各样的讨论。关键是,我确信有很多帖子,即使是像我这样的相关专家也能够准确分类。最重要的是,这也是我为什么要建立一个模型来对来自这些子主题的帖子进行分类的原因——我的 NLP 分类器会像经常访问这些留言板的人一样准确吗?

也许是这样,也许不是…

假设

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

I can tell your future, just look what’s in your hand…

在进行任何数据收集之前,我对 NLP 分类模型的性能有一些想法。

  1. 我认为建立一个精确的模型是相当简单的。这是基于这样一种想法,即会有许多特定于乐队的术语反复出现。这可能是像乐队成员姓名、歌曲名称、专辑名称或乐队不重叠的年份这样的词。我认为这些子主题的大部分帖子至少会包含一些这类术语。
  2. 我认为一个模特很难对模糊的帖子进行分类。我认为会有很多帖子不会明确提到任何一个乐队。
  3. 我认为该模型在分类“交叉”帖子时会有挑战,其中一个乐队在另一个乐队的子编辑中被讨论。由于两个乐队都有很多粉丝,我知道这种讨论确实经常发生。

数据

这个分析的数据是使用 Reddit pushshift API 收集的。我从这些子主题中收集了大约 6000 篇帖子,时间跨度大约为两年。我只收录了原帖标题和“自文”,没有收集到相应的评论。

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

The data called for some routine cleaning…

一旦有了数据,我必须执行一些数据清理操作:

  • 数据包含不包含任何“自我文本”的条目。这是用户附加到帖子上的文本,独立于帖子的标题。这些空值被替换为空白单元格。
  • 许多条目包含不代表用户语言的文本,如“\n”、“[已删除]”、“[已删除]”或 URL。这些都是从数据中过滤出来的(扔掉你最终不需要的东西)。
  • 我对文本进行了词条分类,以便将具有相同词根的单词组合在一起(保留重要的内容)。

这样做之后,数据就可以进行分析了。

建模

让我们认真对待事实真相吧!

我在分析中尝试了以下模型:

  • 计数矢量化逻辑回归
  • 计数矢量化的朴素贝叶斯
  • 采用 TF-IDF 矢量化的逻辑回归
  • 带 TF-IDF 矢量化的朴素贝叶斯
  • 计数矢量化的支持向量机
  • 带计数矢量化的随机森林
  • 具有 TF-IDF 矢量化的支持向量机
  • 带 TF-IDF 矢量化的随机森林

所有的模型都表现得相当准确,而且它们都有相当大的差异。

逻辑回归模型和朴素贝叶斯模型的精确度最高,但差异最大(约 90%的测试精确度/~99%的训练精确度)。

随机森林模型减少了方差,但是具有最大的偏差(大约 90%的测试精度/大约 85%的训练精度)。

带有 TF-IDF 矢量化的支持向量机模型是我的首选模型。它具有最低的方差,并且其测试精度足够接近表现最好的逻辑回归/朴素贝叶斯模型。该模型对测试数据分类的准确率为 90%,对训练数据分类的准确率为 94%。

结果

在这一部分,我将浏览一些我认为最有趣的结果。

在每个子编辑的帖子中,哪些区别词出现得最频繁?

我想找出哪些区别词或“流行语”在这些子词中最常见。这些词特指某个乐队。它们大多是乐队成员的名字、歌曲标题和相关日期。有趣的是,这些词中有许多在两个论坛中都频繁出现,所以仅仅出现一个流行语不足以做出准确的分类,尽管它可能是一个强有力的指标。

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

Buzzwords that appeared most frequently on the Dead subreddit

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

Buzzwords that appeared most frequently on the Phish subreddit

哪些词在误分类帖子中出现频率最高?

在调查分类错误的帖子时,我研究了哪些词出现得最频繁。为了构建下面的情节,我把普通的词过滤掉了。

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

Words that appeared most frequently in misclassified posts

死子旋涡和费西合唱团子旋涡的错误分类比例是多少?

有 161 个死帖被错误分类,相比之下,费西合唱团有 142 个帖子被错误分类。这个看起来比较平衡。看看这种趋势是否能在更大样本的结果中保持下去将会很有趣。这种轻微的不平衡可能是因为费西合唱团论坛包含了更多针对乐队的讨论,因为他们仍然是一个活跃的乐队,而感恩而死乐队的成员现在在场外表演。

哪些类型的帖子容易分类错误?

浏览错误分类的帖子时,我注意到有一些常见类型的帖子模型很难正确分类:

  • 与门票交易/销售相关的帖子经常被错误分类,因为这些帖子往往主要涉及日期、地点和位置。

一些例子:

最好的换票地点?我不是要硬着头皮或超越面值,只是想用我的 GA 换一个好的硬座。矮老婆意味着我需要第一排。

有人拿到票了吗?想知道价格范围是多少,这样我就知道该把什么放在一边,谢谢!

芝加哥门票警告…对于所有寻找便宜芝加哥门票的人来说,不要从 Craigslist 购买硬票。现在 CL 上到处都是假票。就像棕色的酸。离远点。但是如果你想尝试,那就去买彩票吧。注意安全,聪明点

  • 在一个乐队的子编辑中提到另一个乐队的帖子自然容易被错误分类

一些例子:

到今天为止,特雷比杰瑞活得久。永远感激我们能够听到和看到他们每个人。他们对音乐的贡献将会持续很长时间。

我在 Dead subreddit 上发了帖子,但是还有其他以感恩而死/网络钓鱼/甜蜜乐队为主题的梦幻棒球联盟吗?

1997 年秋,1977 年春,逝者乐队发行了 1977 年 5 月的套装和今年的康奈尔。我想现在是费西合唱团发布 97 秋季套装的时候了。今年夏天我花了很多时间听这两个巡演,他们都以自己的方式分享了好的放克,有着理想的能量和紧绷感。只是想说出来。我要我那该死的套装。

  • 没有明确提到任何一个乐队的模糊帖子自然有被错误分类的倾向。

一些例子:

YouTube 上最喜欢的完整节目?考虑今晚上演一出老剧。你会推荐什么?

谁知道星期天在凤凰城的表演结束后,我可以把车停在哪里?

你在场地上对邪教有什么体验?我一直在读关于十二个部落的书,并且很有兴趣听听你和他们或者任何其他邪教的冲突。我想写一篇关于它们的研究论文。你认为它们太危险了,不能去吗?谢谢!

声明似乎最终都是徒劳的…

结论

在测试各种不同的 NLP 模型时,这是一个有用的练习。我认为我的模型的性能总体来说相当不错,但仍有改进的潜力。

总的来说,我的假设——模型可能是准确的,但在某些类型的职位上容易被错误分类——被证明是正确的。

我的第一个想法是在未来改进这个模型,获取更多的数据。为此,我要么获取更多的帖子,要么包含我在建模过程中分析的每个帖子的评论文本。拥有更大的数据集将允许模型学习更多特定于乐队的流行语,并且它将允许模型潜在地辨别任何正在进行的内部笑话或重复出现的引用,这些引用是一个子编辑或另一个子编辑所独有的。

正如我的假设所反映的那样,我认为在这些子主题之间对帖子进行分类的任何模型中都存在一些不可避免的偏差是合理的。这两个子主题都包含了大量关于音乐和音乐会的类似对话,并不一定专门针对任何一个乐队。此外,两个留言板都包含了很多关于其他乐队的对话。费西合唱团和感恩而死乐队有很多粉丝,在两个子栏目中也有很多关于这两个乐队的讨论。

有趣的是,每个乐队的一些热门词汇在两个子栏目中都很常见。由于论坛之间有很多交叉讨论,“费西合唱团”和“死亡”是这样的词,虽然特别有可能出现在各自的子主题中,但也很有可能出现在其他子主题中。这意味着,仅仅有一个“流行语”不足以对每个帖子进行正确分类。这可能是许多错误分类的一个因素。

有趣的是,用另外两个在粉丝群方面联系不那么紧密的子乐队来重复这个练习。在两个非音乐子唱片上重复这个练习也是很有趣的。我想知道准确性如何比较,以及同类模型是否会成为最佳模型。

谢谢你迁就我!我相信你和我一样觉得这很有趣。不知何故,我继续寻找新的方式来娱乐费西合唱团和死者。在发展我对 NLP 的理解以及随之而来的工具方面,我还有很长的路要走,但至少我很享受这一过程!

最后,让空气中充满歌曲…

10/18/74 Dark Star — Winterland Ballroom

10/20/13 Tweezer — Hampton Coliseum

Kaggle 的 NLP 竞赛入门

原文:https://towardsdatascience.com/nlp-kaggle-competition-a3f22ecbbe6f?source=collection_archive---------22-----------------------

NLP 入门笔记本和探索性数据分析

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

Photo by Jon Tyson on Unsplash

Quora 不真诚问题分类竞赛是一项自然语言处理任务,目标是预测问题的意图是否真诚。

Quora 是一项帮助人们互相学习的服务。在 Quora 上,人们提问和回答问题——提供这种服务的一个关键挑战是过滤掉不真诚的问题。Quora 试图过滤掉有毒和分裂的内容,以维护他们的政策:

友善点,尊重点。

什么是不真诚的问题?

一个不真诚的问题被定义为一个旨在陈述而不是寻找有用答案的问题。根据 Kaggle 竞赛的描述,一个言不由衷的问题的特征包括:

有非中性声调的:

  • 用夸张的语气来强调一群人的观点。
  • 是修辞性的,意在暗示对一群人的陈述。

具有贬义或煽动性:

  • 提出针对受保护人群的歧视性观点,或寻求对刻板印象的确认。
  • 对特定的人或人群进行诋毁性的攻击/侮辱。
  • 是基于一群人的古怪前提。
  • 贬低一种不可修正和不可测量的特性。

并不基于现实:

  • 基于错误的信息,或包含荒谬的假设。
  • 使用性内容(乱伦,兽交,恋童癖)来获得震撼价值,而不是寻求真正的答案。

基本上,任何问题的意图都是愤怒或冒犯,而不是为了获取信息。一些不真诚的问题包括:

  • 为什么中国人讨厌唐纳德·特朗普?
  • 去伊朗旅行的美国人有精神疾病吗?

我们可以清楚地看到,这些问题旨在煽动而不是获取信息,需要从 Quora 的平台上排除。

预期的困难

大型数据集

训练数据超过一百万行。我预计在处理大型数据集时会有挑战。挑战可能包括遇到内存错误和过长的处理时间。

为了应对大型数据集,可以尝试几种技术,包括使用较小的数据样本进行训练和降维。我预计功能选择和工程以及模型优化将是重要的。

不平衡数据集

数据集非常不平衡,只有 6%的样本属于目标(不真诚)类。我预计这将导致召回的挑战。最大化回忆,或真正的阳性率,在这里可能是一个困难,因为少量的虚假样本。我预计重采样技术和数据扩充可以提高模型性能。

向他人学习的重要性

正如威尔·科尔森在他的住宅信贷违约风险篇中所说:

数据科学家不是站在巨人的肩膀上,而是站在成千上万为了所有人的利益而公开其工作的个人的背上。

他称 Kaggle 竞赛为“合作项目”,这是千真万确的。Kaggle 社区非常支持,不仅是学习新技术和技能的好地方,也是挑战自我提高的好地方。

探索性分析

这个的第一个笔记本被设计用来熟悉手头的问题,并设计一个前进的策略。

一个很好的开始是想象我们目标的分解。

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

Distribution of Questions

从上面的图中我们可以看到我们有一个阶级不平衡的问题。

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

Comparison of Number of Tokens per Question

上面的图显示了每个类别中标记数量的显著差异。这可以通过完成 t 检验来证实:

  • t 值:-106.72
  • p 值:0

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

Number of Sentences per Questions (plotted on log scale)

通过 t 检验,每个问题的句子数量的差异也被确认为显著:

  • t 值:-56.09
  • p 值:0

另一件有趣的事情是在真诚和不真诚的问题中出现的最常见的单词。

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

Insincere Questions Most Common Words

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

Sincere Questions Most Common Words

阶级不平衡

正如我们上面看到的,我们有一个阶级不平衡的问题。

不平衡类是机器学习分类中的一个常见问题,其中每个类中的观察值比例不成比例。(在这篇帖子中,我探索了处理阶级不平衡的方法。)

只有 6.6%的数据集属于目标类,我们肯定会有一个不平衡的类!

这是一个问题,因为许多机器学习模型被设计成最大化整体准确性,特别是对于不平衡的类,这可能不是使用的最佳度量。

分类准确度被定义为正确预测的数量除以总预测数乘以 100。例如,如果我们简单地预测所有问题都是真诚的,我们将获得 93%的分类准确率!

竞争指标

在继续创建基线模型之前,了解我们的竞争指标很重要。

这项比赛使用 F1 分数,它平衡了精确度和召回率。

  • 精度是真正肯定的数量除以所有肯定的预测。精度也叫阳性预测值。它是对分类器准确性的一种度量。低精度表示大量的误报。
  • 召回率是测试数据中真阳性的数量除以阳性值的数量。回忆也称为敏感度或真实阳性率。它是对分类器完整性的一种度量。低召回率表示大量的假阴性。

数据准备

因为我们有一个不平衡的数据集,所以我们将对多数类进行缩减采样,使其等于少数类的大小。这不仅会平衡我们的数据集,还会由于训练数据中样本数量的减少而减少处理时间。

在建模之前,我们使用 Gensim 应用一些基本的文本预处理。

Gensim 是一个很棒的 NLP 库——它的速度非常快,并提供了文本清除和 n-gram 生成的工具——我们在这个基线建模内核中使用了这两种工具。

基线模型

对于我们的基线模型,我们将尝试:

  • 逻辑回归:分类的线性模型。它们训练和预测速度快,伸缩性好,易于解释,因此是基线模型的良好选择。
  • 朴素贝叶斯:这些分类器训练速度非常快,可以很好地处理高维稀疏数据,包括文本。它们是基于应用贝叶斯定理的,并且是“幼稚的”,因为它们假设了特征之间的独立性。Scikit-Learn 实现了几种广泛用于文本数据的朴素贝叶斯分类器,包括 Bernoulli(我们在这里使用)和多项式。
  • XGBoost(极限梯度提升):梯度提升决策树的实现,旨在提高速度和性能。因此,它经常胜过其他算法——似乎是 Kaggle 竞赛中非常受欢迎的选择。
  • 集成模型: Scikit-learn 陈述了“集成方法的目标是组合用给定学习算法构建的几个基本估计量的预测,以提高单个估计量的可推广性/稳健性。”我们将使用 scikit-learn 的投票分类器来组合上述三个模型。

解释结果—分类报告

  • 精度是真阳性的数量除以所有阳性预测。精度也叫阳性预测值。它是对分类器准确性的一种度量。低精度表示大量的误报。
  • 召回是测试数据中真阳性的数量除以阳性值的数量。回忆也称为敏感度或真实阳性率。它是对分类器完整性的一种度量。低召回率表示大量的假阴性。
  • F1-得分是精确度和召回率的调和平均值。
  • Support 是每个类的真实结果数。

基线测试集结果

  • 逻辑回归 F1: 86.9
  • 朴素贝叶斯 F1: 86.5
  • XGBoost F1: 70.9
  • 合奏 F1: 86.6

这些结果看起来很有希望。

然而,当提交给比赛时,我得到了 0.483 的公共排行榜分数。根据 F1 分数的下降,我们可以假设我们的模型不能很好地概括未知的验证数据。我们绝对有很大的提升空间!

结论

这篇文章和介绍性的内核展示了我对 Kaggle 竞赛的开始,并提供了改进的基线。在未来的内核和文章中,我们将探索其他重采样技术和深度学习,以提高我们的竞争分数。

TensorFlow.js 浏览器中的 NLP Keras 模型

原文:https://towardsdatascience.com/nlp-keras-model-in-browser-with-tensorflow-js-f4d5035466a2?source=collection_archive---------6-----------------------

如何在带有 tensorflow.js 的浏览器中使用 Keras 模型

在这篇文章中,我将尝试涵盖三件事:

  1. 如何编写简单的命名实体识别模型——典型的自然语言处理 (NLP)任务。
  2. 如何将此模型导出为 TensorFlow.js 格式。
  3. 如何制作一个简单的 WEB 应用程序在没有后端的情况下搜索字符串中的命名实体?

你可以在我的个人网站上测试一下。

首先,这篇博客是写给那些了解深度学习主要阶段(RNN,注意)和 JavaScript 基础的人的。如果你不擅长 RNN,我推荐你阅读 Andrej Karpathy 的《循环神经网络的不合理有效性》。

TensorFlow.js 是一个 JavaScript 库,用于用 JavaScript 开发和训练 ML 模型,并在浏览器或 Node.js 上部署。

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

对于这个例子,我们将使用简单的 keras 模型来解决经典的 NER 任务。我们将在 2003 年的数据集上进行训练。我们的模型只是单词嵌入、GRU 和非常简单的注意机制。之后,我们将在浏览器中可视化注意力向量。如果你熟悉解决类似任务的现代方法,你知道,这种方法不是最先进的。但是,对于在浏览器中运行它,例如,它就足够了。此外,如果您熟悉 NER 任务,您可以跳过 Keras 上关于命名实体识别、数据和 NER 神经网络模型的下两个部分,查看源代码。

任务和数据

根据你的经验,你可能以不同的名称来了解它,比如序列标签、词性标签或者像我们的任务中的命名实体识别。

通常,命名实体识别(NER)任务是 seq2seq 任务。对于来自 x_i 的每个标记,我们必须预测标记 y_i,其中 x 是输入序列,y 是命名实体的序列。

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

在本例中,我们将寻找人员(B-PER,I-PER)、地点(B-LOC,I-LOC)和组织(B-ORG,I-ORG),此外,该模型将定义特殊的实体-杂项-命名的实体,而不是人员、地点和组织。

首先,我们必须为计算机准备数据(是的,我们将使用计算机来解决这个任务:)。

在这篇博文中,我们的目标并不是在 CoNLL2003 数据集上得到 SOTA 结果,这就是为什么我们的预处理不是很好。但仅举一个例子,我们将通过 load_data 的方法加载数据:

如你所知,神经网络不能处理文字,只能处理数字。这就是为什么我们应该用数字来表示单词。这不是一个困难的任务,我们可以列举所有独特的单词,并写单词的数量,而不是单词。为了储存数字和单词,我们可以创造词汇。这个词汇表应该支持“未知”()的单词,因为当我们用词汇表中没有的新单词对一个新字符串进行预测时。单词“padded”()是因为对于神经网络来说,所有的字符串应该具有相同的大小,当一些字符串比另一个小时,我们用这个单词来填充间隙。

此外,让我们写一个简单的助手,把句子翻译成数字序列。

正如你在上面读到的,我们应该用神经网络填充序列,为此,你可以使用内部 Keras 方法pad _ sequences

模型

让我猜猜……RNN?

是的,是 RNN。更具体地说,它是 GRUs(门控循环单元)和简单的注意层。作为文字表述用手套。在这篇博文中,我将不再赘述细节,只留下模型的代码。希望很好理解。

建立模型后,要对模型进行编译、训练和保存。您可以猜测,为了在浏览器中运行这个模型,我们不仅要保存模型的权重,还要保存模型描述以及单词和标签的词汇表。让我们定义将模型和词汇表导出到 JavaScript 支持的格式(基本上是 JSON)的方法。

最后,让我们编译、训练和导出模型:

这个步骤的完整代码,你可以在我的 GitHub 资源库中找到 train.py.

发展环境

模型已经准备好了,现在,我们应该开始开发一个 web 应用程序,在浏览器中评估这种模式。我们需要一个开发环境。基本上,如何存储模型、权重和词汇并不重要,但是对于“简单开始”,我将向您展示我的解决方案——node . js 本地服务器。

我们需要两个文件: package.jsonserver.js.

在 server.js 中,我们定义了静态文件夹来存储模型、js 脚本和所有其他文件。要使用此服务器,您应该输入

npm 安装& &节点 server.js

在你的终端里。之后,您可以通过 http://localhost:8081 在浏览器中访问您的文件

网络应用

有【index.html】、 predict.js 和上一步生成的文件。如你所见,这是一个非常小的网络应用程序。index.html 包含输入字符串的要求和输入字段。

现在,博文最有趣的部分—关于 tensorflow.js .你可以通过TF . loadlayersmodel方法调用 await 操作符来加载模型。这很重要,因为我们不想在加载模型时阻塞我们的 web 应用程序。如果我们加载模型,我们将得到只能预测令牌的模型,但注意力向量呢?如何从关注中获得激活?为了从内部层获取数据,在 tensorflow.js 中,我们应该创建一个新模型,其输出层将包含原始模型的输出和其他层,如下所示:

这里, 模型 是原始模型, emodel 是以注意力向量为输出的模型。

预处理

现在我们必须像在 Python 脚本中一样实现字符串的预处理。对我们来说这不是一个困难的任务,因为 Python 和 JavaScript 上的正则表达式非常相似,其他方法也很相似。

做预测

现在我们应该提供从简单的文本字符串格式到 TF 格式的转换数据—张量。在上一节中,我们编写了将字符串转换为数字数组的助手。现在我们应该从这个数组中创建 tf.tensor 。如你所知,模型的输入层有形状 (无,113) ,这就是为什么我们要扩大输入张量的维数。好了,就这些了,现在我们可以通过 在浏览器中进行预测。预测 的方法。之后,您应该将预测数据打印到浏览器中,您的无后端神经网络 web 应用程序就准备好了。

结论

TensorFlow.js 是一个用于在 chrome、Firefox 或 safari 等浏览器中使用神经网络的库。如果你在 iPhone 或 Android 智能手机上打开这个网络应用,它也能工作。

可以通过这个链接在我的个人网站上测试:http://deep division . net/2019/03/20/NLP-keras-model-in-browser-with-tensorflowjs . html

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

此外,你可以在我的 GitHub 中找到这段带有一些补充的代码。

深度学习的文本预处理方法

原文:https://towardsdatascience.com/nlp-learning-series-part-1-text-preprocessing-methods-for-deep-learning-20085601684b?source=collection_archive---------11-----------------------

NLP 学习系列(第一部分)

深度学习的文本预处理权威指南

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

Photo by Raychan on Unsplash

最近,我在 Kaggle 上发起了一个名为 Quora 问题不真诚挑战的 NLP 竞赛。这是一个关于文本分类的 NLP 挑战,在经历了比赛以及 kaggle 专家提出的宝贵内核后,问题变得更加清晰,我想到了分享知识。

因为我们有大量的材料要覆盖,我将这篇文章分成一系列的文章。第一篇文章,即这篇文章,将基于与深度学习模型一起工作的预处理技术,我们还将讨论增加嵌入覆盖。在第二篇文章的中,我将试着带你了解一些基本的传统模型,如 TFIDF 和 SVM,它们已被用于文本分类,并试着评估它们的性能以创建一个基线。我们将在第三篇文章中更深入地研究深度学习模型,这些模型将专注于解决文本分类问题的不同架构。我们将尝试使用我们在本次比赛中未能使用的各种其他模型,如系列文章第四篇中的 ULMFit 迁移学习方法。

作为旁注:如果你想了解更多关于 NLP 的知识,我想推荐这个关于高级机器学习专精自然语言处理的超赞课程。您可以免费开始 7 天的免费试用。本课程涵盖了自然语言处理中从基础到高级的各种任务:情感分析、摘要、对话状态跟踪等等。

我可能需要一点时间来写完整个系列。在那之前,你可以看看我的其他帖子:【Kagglers 正在使用什么进行文本分类,其中谈到了 NLP 中使用的各种深度学习模型和如何从 Keras 切换到 Pytorch

首先让我解释一下文本分类的问题。文本分类是自然语言处理中的一项常见任务,它将一个长度不定的文本序列转换成一个文本类别。你怎么能利用这一点?

  • 去寻找一篇评论的感悟。
  • 在脸书这样的平台上找有毒评论
  • 在 Quora 上找不真诚的问题。kaggle 上目前正在进行的比赛
  • 在网站上寻找虚假评论
  • 文字广告会不会被点击?

这些问题都有一些共同点。从机器学习的角度来看,这些本质上是相同的问题,只是目标标签发生了变化,其他什么都没有。也就是说,添加业务知识可以帮助使这些模型更加健壮,这就是我们在预处理数据以进行测试分类时想要加入的内容。虽然我在这篇文章中关注的预处理管道主要围绕深度学习,但大多数也适用于传统的机器学习模型。

但是,在经历所有步骤之前,让我先经历文本数据的深度学习管道的流程,以获得关于整个过程的更高层次的观点。

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

我们通常从清理文本数据和执行基本 EDA 开始。在这里,我们试图通过清理数据来提高数据质量。我们还试图通过移除 OOV(词汇外)单词来提高我们的 word2vec 嵌入的质量。这两个步骤之间通常没有太多的顺序,我通常在这两个步骤之间来回切换。接下来,我们创建一个可以输入深度学习模型的文本表示。然后我们开始创建模型并训练它们。最后,我们使用适当的指标评估模型,并获得相关股东的批准来部署我们的模型。如果这些术语现在没有多大意义,也不用担心。我将在这篇文章中尝试解释它们。

在这个连接处,让我们绕一点弯子来谈谈单词嵌入。在为我们的深度学习模型预处理数据时,我们必须考虑它们。

word2vec 嵌入入门:

我们需要一种方法来表示词汇。一种方法是使用单词向量的热编码,但这并不是一个好的选择。一个主要的原因是,一个热门词向量不能准确地表达不同词之间的相似度,如余弦相似度。

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

给定一个热编码向量的结构,不同单词之间的相似度总是为 0。另一个原因是,随着词汇量的增加,这些热编码向量变得非常大。

Word2Vec 通过为我们提供单词的固定长度向量表示,并通过捕捉不同单词之间的相似性和类比关系,克服了上述困难。

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

单词向量的学习方式允许我们学习不同的类比。它使我们能够对单词进行代数运算,这在以前是不可能的。比如:什么是王者——男人+女人?它出来是女王。

Word2Vec 向量还帮助我们找出单词之间的相似性。如果我们试图找到与“好”相似的词,我们会发现“棒极了”、“棒极了”等等。word2vec 的这一特性使得它在文本分类中具有不可估量的价值。现在我们的深度学习网络明白了,“好”和“伟大”本质上是意思相近的词。

因此,简单来说,word2vec 为单词创建了向量。因此,对于字典中的每个单词(常见的二元模型也是如此),我们都有一个 **d** **维向量。**我们通常使用预先训练的词向量,这些词向量是在对维基百科、推特等大型文本语料库进行训练后由他人提供给我们的。最常用的预训练单词向量是具有 300 维单词向量的 Glove 和 Fasttext。我们将在这个岗位上使用手套。

文本数据的基本预处理技术:

在大多数情况下,我们观察到文本数据并不完全干净。来自不同来源的数据具有不同的特征,这使得文本预处理成为分类管道中最重要的步骤之一。例如,来自 Twitter 的文本数据与 Quora 或一些新闻/博客平台上的文本数据完全不同,因此需要区别对待。有益的是,我将在这篇文章中讨论的技术对于你在 NLP 的丛林中可能遇到的任何类型的数据都足够通用。

a)清除特殊字符并删除标点符号:

我们的预处理管道在很大程度上依赖于我们将用于分类任务的 word2vec 嵌入。原则上,我们的预处理应该匹配在训练单词嵌入之前使用的预处理。由于大多数嵌入并不提供标点符号和其他特殊字符的向量值,所以您首先要做的是消除文本数据中的特殊字符。这些是 Quora 问题数据中的一些特殊字符,我们使用replace函数来去除这些特殊字符。

这也可以借助简单的正则表达式来完成。但我通常喜欢上面的做法,因为它有助于理解我们从数据中删除的字符类型。

b)清洁编号:

为什么我们要用# s 来代替数字?因为大多数嵌入都这样预处理过它们的文本。

**小 Python 技巧:**我们在下面的代码中使用了一个if语句来预先检查一个数字是否存在于一个文本中。因为if总是比re.sub命令快,而且我们的大部分文本不包含数字。

c)消除拼写错误:

找出数据中的拼写错误总是有帮助的。由于这些单词嵌入在 word2vec 中不存在,我们应该用正确的拼写替换单词,以获得更好的嵌入覆盖率。下面的代码工件改编自 Peter Norvig 的拼写检查器。它使用 word2vec 单词排序来近似单词概率。因为 Google word2vec 显然在训练语料库中以频率递减的顺序排列单词。你可以用它在你的数据中找出一些拼写错误的单词。

一旦我们找到了拼写错误的数据,接下来要做的就是使用拼写错误的映射和正则表达式函数来替换它们。

d)消除收缩:

缩写是我们用撇号写的单词。缩写的例子是像“不是”或“不是”这样的词。因为我们想标准化我们的文本,所以扩展这些缩写是有意义的。下面我们使用收缩映射和正则表达式函数来完成。

除了上述技术之外,还有其他文本预处理技术,如词干提取、词汇化和停用词去除。由于这些技术没有与深度学习 NLP 模型一起使用,所以我们不会讨论它们。

表示:序列创建

让深度学习成为 NLP 的 goto 选择的原因之一是,我们实际上不必从文本数据中手工设计特征。深度学习算法将一系列文本作为输入,像人类一样学习文本的结构。由于机器不能理解文字,它们希望数据是数字形式。所以我们希望将文本数据表示为一系列数字。为了理解这是如何做到的,我们需要了解一些关于 Keras Tokenizer 函数的知识。人们也可以使用任何其他记号赋予器,但 keras 记号赋予器对我来说似乎是个不错的选择。

a)记号赋予器:

简单来说,记号赋予器是一个将句子拆分成单词的实用函数。keras.preprocessing.text.Tokenizer将文本标记化(拆分)成标记(单词),同时仅保留文本语料库中最常出现的单词。

num_words 参数只在文本中保留预先指定的字数。这是有帮助的,因为我们不希望我们的模型因为考虑很少出现的单词而受到很多干扰。在真实世界的数据中,我们使用 num_words 参数留下的大多数单词通常都是拼写错误的。缺省情况下,记号赋予器还会过滤掉一些不想要的记号,并将文本转换成小写。

一旦适合于数据,记号赋予器还保持单词的索引(单词字典,我们可以使用它来为单词分配唯一的数字),它可以被记号赋予器. word_index 访问。索引词典中的单词按频率顺序排列。

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

所以使用 tokenizer 的完整代码如下:

其中train_Xtest_X是语料库中的文档列表。

b)填充序列:

通常,我们的模型期望每个序列(每个训练示例)具有相同的长度(相同数量的单词/标记)。我们可以使用maxlen参数对此进行控制。

例如:

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

现在我们的训练数据包含了一个数字列表。每个列表都有相同的长度。我们还有word_index,它是文本语料库中最常出现的单词的字典。

嵌入浓缩:

正如我所说,我将使用手套 Word2Vec 嵌入来解释丰富。手套预训练向量在维基百科语料库上训练。(你可以在这里下载它们)。这意味着一些可能出现在数据中的单词可能不会出现在嵌入中。我们该如何应对呢?让我们首先加载手套嵌入第一。

一定要把下载这些手套向量的文件夹路径放进去。这个glove_embedding_index包含什么?它只是一个字典,其中的键是单词,值是单词向量,一个长度为 300 的np.array。这部词典的长度大约是十亿。因为我们只想要我们的word_index中的单词的嵌入,我们将创建一个只包含所需嵌入的矩阵。

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

上面的代码运行良好,但是有没有一种方法可以让我们更好地利用 GLoVE 中的预处理?是的。当对 glove 进行预处理时,创建者没有将单词转换成小写。这意味着它包含一个单词的多个变体,如“usa”、“Usa”和“USA”。这也意味着,在某些情况下,虽然存在像“word”这样的单词,但它的小写模拟词(即“Word ”)并不存在。我们可以通过使用下面的代码来解决这个问题。

以上只是一个例子,说明了我们如何利用我们的嵌入知识来获得更好的覆盖率。有时,根据问题的不同,人们也可以通过使用一些领域知识和 NLP 技能向嵌入内容添加额外的信息来获得价值。例如,我们可以通过添加 Python 中 TextBlob 包中单词的极性和主观性,将外部知识添加到嵌入本身。

我们可以使用 TextBlob 获得任何单词的极性和主观性。相当整洁。因此,让我们尝试将这些额外的信息添加到我们的嵌入中。

工程嵌入是在后期阶段从深度学习模型获得更好性能的重要部分。通常,在项目阶段,我会多次重温这部分代码,同时尝试进一步改进我的模型。你可以在这里展示你的创造力,以提高你的word_index的覆盖率,并在你的嵌入中包含额外的特性。

更多工程特性

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

人们总是可以添加句子特定的特征,如句子长度、独特单词的数量等。作为向深度神经网络提供额外信息的另一个输入层。例如,我创建了这些额外的功能,作为 Quora 不真诚分类挑战的功能工程管道的一部分。

结论:

NLP 在深度学习领域仍然是一个非常有趣的问题,因此我鼓励你做大量的实验,看看什么可行,什么不可行。我试图为任何 NLP 问题的深度学习神经网络的预处理步骤提供一个完整的视角。但这并不意味着它是确定的。如果你想了解更多关于 NLP 的知识,这里有一门很棒的课程。如果你认为我们可以增加一些东西,请在评论中提及。

尾注和参考文献:

这篇文章是许多优秀的 Kagglers 们努力的结果,我将在这一部分尝试引用他们。如果我漏掉了某个人,请理解我不是故意的。

这里的 是下一个帖子。

原载于 2019 年 1 月 17 日mlwhiz.com

传统的文本分类方法

原文:https://towardsdatascience.com/nlp-learning-series-part-2-conventional-methods-for-text-classification-40f2839dd061?source=collection_archive---------13-----------------------

NLP 学习系列(第二部分)

教机器学习文本

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

这是 NLP 文本分类系列的第二篇文章。给你一个回顾,最近我在 Kaggle 上开始了一个 NLP 文本分类比赛,叫做 Quora 问题不真诚挑战。我想通过一系列关于文本分类的博客文章来分享这些知识。的第一篇帖子谈到了各种与深度学习模型和一起工作的预处理技术,增加了嵌入覆盖率**。在这篇文章中,我将尝试带你了解一些基本的传统模型,如 TFIDF、计数矢量器、哈希等。并尝试评估它们的性能以创建一个基线。我们将在第三篇文章中更深入地研究深度学习模型,这些模型将专注于解决文本分类问题的不同架构。我们将尝试使用我们在本次比赛中未能使用的各种其他模型,如系列文章第四篇中的 ULMFit 迁移学习方法。**

作为旁注:如果你想了解更多关于 NLP 的知识,我想推荐高级机器学习专精中关于自然语言处理的这门超棒的课程。您可以免费开始 7 天的免费试用。本课程涵盖了自然语言处理中从基础到高级的各种任务:情感分析、摘要、对话状态跟踪等等。您可以免费开始 7 天的免费试用。普通

我可能需要一点时间来写完整个系列。在那之前,你也可以看看我的其他帖子:【Kagglers 正在使用什么进行文本分类,它谈论了 NLP 中使用的各种深度学习模型和如何从 Keras 切换到 Pytorch

所以我们再次从第一步开始:预处理。

文本数据的基本预处理技术(续)

所以在上一篇文章中,我们讨论了各种用于深度学习的文本预处理方法。传统方法的大部分预处理保持不变。我们仍然会删除特殊字符、标点符号和缩写。但是当涉及到传统方法时,我们可能也想做词干化/词汇化。让我们来谈谈它们。

出于语法原因,文档将使用不同形式的单词,如 organize、organize 和 organizing。此外,还有一系列具有相似含义的衍生相关词,如民主、民主和民主化。

由于我们将在特征创建步骤中为单词创建特征,因此有必要将单词简化为一个共同的标准,以便“组织”、“组织”和“组织”可以由单个单词“组织”来引用

a)词干

词干提取是使用粗略的启发式规则将单词转换成其基本形式的过程。例如,一个规则可以是从任何单词的末尾去掉“s”,这样“cats”就变成了“cat”。或者另一个规则是用“我”代替“ies ”,这样“ponies”就变成了“poni”。这里要注意的一个要点是,当我们对这个单词进行词干处理时,我们可能会得到一个像“poni”这样的无意义的单词。但是它仍然适用于我们的用例,因为我们计算特定单词的出现次数,而不是像传统方法那样关注这些单词的含义。出于完全相同的原因,它对深度学习不起作用。

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

通过在 python 中使用这个函数,我们可以非常简单地做到这一点。

b)词汇化

词汇化与词干化非常相似,但它的目的是仅当字典中存在基本形式时才删除词尾。

一旦我们完成了对文本的处理,我们的文本必然会经历以下这些步骤。

文本表示

在传统的机器学习方法中,我们应该为文本创建特征。为了实现这一目标,有很多的表现形式。让我们一个一个来说。

a)单词包—计数矢量器功能

假设我们有一系列的句子(文档)

X = [ 'This is good', 'This is bad', 'This is awesome' ]

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

单词包将创建一个所有句子中最常用单词的字典。对于上面的例子,字典应该是这样的:

word_index {'this':0,'is':1,'good':2,'bad':3,'awesome':4}

然后用上面的字典对句子进行编码。

This is good - [1,1,1,0,0] 
This is bad - [1,1,0,1,0] 
This is awesome - [1,1,0,0,1]

在 Python 中,我们可以通过使用 Python 中的 CountVectorizer 类非常简单地做到这一点。不用太担心名字重,它只是做了我上面解释的事情。它有许多参数,其中最重要的是:

  • ngram_range: 我在代码(1,3)中指定。这意味着在创建要素时,将考虑单字、双字和三元字。
  • min_df: 一个 ngram 应该出现在语料库中作为特征使用的最小次数。

然后,我们可以将这些特征用于任何机器学习分类模型,如逻辑回归、朴素贝叶斯、SVM 或 LightGBM。例如:

# Fitting a simple Logistic Regression on CV Feats 
clf = LogisticRegression(C=1.0) 
clf.fit(xtrain_cntv,y_train)

这里的是一个内核链接,我在 Quora 数据集上测试了这些特性。如果你喜欢,请不要忘记投赞成票。

b) TFIDF 功能

TFIDF 是一种从句子中寻找特征的简单技术。在计数特征中,我们计算文档中出现的所有单词/ngrams,而在 TFIDF 中,我们只计算重要单词的特征。我们如何做到这一点?如果你想一个语料库中的文档,我们将考虑关于该文档中任何单词的两件事:

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

  • **词频:**这个词在文档中有多重要?

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

  • **逆文档频率:**术语在整个语料库中的重要性如何?

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

TFIDF 就是这两个分数的乘积。

直观上,一个人可以理解,如果一个单词在文档中出现多次,它就是重要的。但是这就产生了一个问题。像“a”、“the”这样的词在句子中多次出现。他们的 TF 分会一直很高。我们通过使用逆文档频率来解决这个问题,如果这个词很罕见,那么它就很高,如果这个词在整个语料库中很常见,那么它就很低。

本质上,我们希望在文档中找到不常见的重要单词。

在 Python 中,我们可以通过使用 Python 中的 TFIDFVectorizer 类非常简单地做到这一点。它有许多参数,其中最重要的是:

  • ngram_range: 我在代码(1,3)中指定。这意味着在创建要素时,将考虑单字、双字和三元字。
  • min_df: 一个 ngram 应该出现在语料库中作为特征使用的最小次数。

同样,我们可以将这些特征用于任何机器学习分类模型,如逻辑回归、朴素贝叶斯、SVM 或 LightGBM。这里的是一个内核的链接,我在 Quora 数据集上尝试了这些特性。如果你喜欢,请不要忘记投赞成票。

c)散列特征

通常在一个文档语料库中会有很多元语法。我们的 tfidf 矢量器生成的特征数量超过了 2,000,000 个。这可能会在非常大的数据集上导致一个问题,因为我们必须在内存中保存一个非常大的词汇字典。解决这个问题的一个方法是使用哈希技巧。

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

人们可以将散列看作是将任何 ngram 映射到一个数字范围(例如 0 到 1024 之间)的单个函数。现在我们不必把语法存储在字典里。我们可以使用函数来获取任何单词的索引,而不是从字典中获取索引。

由于可能有超过 1024 个 n gram,不同的 n gram 可能映射到同一个数字,这称为冲突。我们提供的散列函数的范围越大,冲突的机会就越少。

在 Python 中,我们可以通过使用 Python 中的 HashingVectorizer 类非常简单地做到这一点。它有许多参数,其中最重要的是:

  • ngram_range: 我在代码(1,3)中指定。这意味着在创建要素时,将考虑单字、双字和三元字。
  • n_features: 你要考虑的特性的数量。上面我给的范围。

这里的是一个内核链接,我在 Quora 数据集上测试了这些特性。如果你喜欢,请不要忘记投赞成票。

d) Word2vec 功能

在之前的帖子中,我们已经谈了一些关于 word2vec 的内容。我们也可以使用单词到 vec 特征来创建句子级别的专长。我们想为句子创建一个d维向量。为此,我们将简单地对一个句子中所有单词的单词嵌入进行平均。

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

我们可以在 Python 中使用以下函数来实现这一点。

这里的是一个内核的链接,我在 Quora 数据集上测试了这些特性。如果你喜欢,请不要忘记投赞成票。

结果

以下是不同方法在 Kaggle 数据集上的结果。我做了一份五层简历。

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

这里的是代码。如果你喜欢,请不要忘记投赞成票。还要注意,我没有对模型进行调优,所以这些结果只是粗略的。您可以尝试通过使用 hyperopt 执行超参数调整或只是老式的网格搜索来获得更多性能,之后模型的性能可能会发生显著变化。

结论

虽然深度学习在 NLP 分类任务中表现得更好,但了解这些问题在过去是如何解决的仍然是有意义的,这样我们就可以了解问题的本质。我试图提供一个关于传统方法的视角,人们应该在转向深度学习方法之前也用它们进行实验来创建基线。如果你想进一步了解 NLP ,这里是一门很棒的课程。您可以免费开始 7 天的免费试用。如果你认为我可以为这个流程添加一些东西,请在评论中提及。

尾注和参考文献

这篇文章是许多优秀的 Kagglers 们努力的结果,我将在这一部分尝试引用他们。如果我漏掉了某个人,请理解我不是故意的。

这里的 是下一个帖子。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值