TowardsDataScience 博客中文翻译 2019(一百二十四)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

在 Tableau 中创建强大的动画可视化

原文:https://towardsdatascience.com/creating-powerful-animated-visualizations-in-tableau-ff30a0d861c2?source=collection_archive---------24-----------------------

Tableau 是一个很好的数据分析和可视化工具。它有一些强大的工具,使可视化的吸引力和互动性。其中一个很棒的功能是动画数据可视化。让我们通过一个有趣的案例研究来探索这是如何实现的(礼貌:Udemy )。

我们将分析世界人口统计数据(礼貌:Udemy )来理解 Tableau 中的动画可视化。这一分析的目的是通过可视化了解 53 年来全球生育率和出生时预期寿命的变化。数据因国家而异,并进一步按地区分类。分析所考虑的时间段在 1960 年至 2013 年之间。

第一步是创建一个基本图表。我制作了一个气泡图,根据不同地区绘制了特定人群的出生时预期寿命与生育率之间的关系。

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

在此图表中,颜色用于识别不同的区域,分为 7 个类别。气泡大小用来表示人口。这张图表显示了整个 53 年间的总体生育率和出生时的预期寿命。同样的可视化可以转换成令人惊叹的 5 维动画图表,显示给定时间段内的动态数据。

为了实现这一点,需要将所需的维度(Year)从主数据源中拖出来,放在“Pages”网格中。所有年份字段都会自动映射到图表中。年份图例与视频控件一起出现,用于管理动画速度和其他属性。

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

可以添加许多有趣的功能来增强动画可视化。他们中的一个在图表中留下了痕迹。通过选择“显示历史”复选框,用户可以显示给定时间段内的数据轨迹。将鼠标悬停在每个踪迹点上,用户可以看到特定年份的人口统计信息。这个特性对于只标记选定区域的历史数据非常方便。

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

可以添加注释来指示动画图表中变化的时间段。动画速度可以控制在 3 个级别之间。也可以循环连续播放。可以修改工具提示数据,使图表对用户一目了然。可以增强气泡颜色和大小等图表元素,使图表在视觉上更具吸引力。动画图表现在可以添加到仪表板中了。它可用于制作强大且令人印象深刻的演示文稿,因为它将所有必需的分析信息打包在一个图表中。

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

在从一年到下一年的气泡运动过程中,随着气泡尺寸的变化,用户可以容易地看到和理解人口统计的变化。历史线索有助于更清楚地分析数据。

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

这就是简单的图表如何在 Tableau 中在几分钟内转换成美丽的动画可视化效果。

从 AIS 数据的海洋中创建海上航线。

原文:https://towardsdatascience.com/creating-sea-routes-from-the-sea-of-ais-data-30bc68d8530e?source=collection_archive---------11-----------------------

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

海上航线是海上运输的重要特征。有时它们被官方指南“交通分隔方案”明确定义,有时它们更多的是建议。国际海事组织负责航道系统,包括分道通航制,并在国际海事组织出版物船舶航道 —目前为 2013 年版中发布。不幸的是,它们没有被数字化。

一些商业和免费增值产品是可用的,它们提供距离,有时在每条路线的基础上提供港口之间的路线。在撰写本文时,我们无法找到一个全面的离线路线库。所以我们决定建造自己的。

自动识别系统 ( AIS ) 使用的是几乎所有船只上安装的应答器。船只的唯一标识、位置、航向和速度通常定期发送。这些信号可以被附近的船只、卫星和地面天线接收到。有几家公司收集、清理和出售这些数据。

从 2016 年初到 2018 年年中,Mariquant 拥有来自 AIS 数据提供商之一的散货船和油轮的每小时数据。该数据包含来自约 19 000 艘有记录的独特船只的信息,作为未压缩的拼花文件大约占用 100 Gb。

我们有一个多边形库,有大约 8 000 个港口和 20 000 个锚地和等候区。大多数时候,锚泊多边形位于端口多边形之外,我们使用图形算法来确定哪个锚泊属于哪个端口。有了这些数据,我们开始构建路线。

抛锚和游荡。

我们将使用轨迹间距离的概念来构建路线的最佳表示,并在同一路线上分离不同的轨迹。大多数距离计算算法使用轨迹上的点之间的距离。我们发现一些噪音阻止我们获得有意义的结果来计算轨迹之间的距离。查看数据,我们发现船只花费大量时间(导致轨迹上的大量点)在港口附近停泊或移动。

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

Anchoring and ‘loitering’ near Belgium and Netherlands ports.

为了找到轨迹上的至少一些点,我们使用了随机森林分类器的 scikit learn [1]实现。有各种方法来寻找血管轨迹上的不同聚类,参见例如[2]和其中的参考文献。我们更喜欢使用稍微简单的方法,因为它易于实现,并为我们提供足够精确的结果。我们使用到港口的距离、到前一个港口的距离、船的速度、船的径向速度(好像绕着港口转)和在到港口的方向上的速度作为分类器的特征。我们人工构建了训练和测试集,分别标记‘游荡’、锚泊、进港和一般航行点。我们在训练中得了大约 6 400 分,在测试集中得了 1600 分。锚点在集合中较少出现,因为它们在距离计算中产生的问题较少。手动标记的困难导致了集合的小尺寸。

混淆矩阵显示待机、进场和一般航行点被很好地定义。即使进场点和一般航次点被错误识别,错误识别也是在它们之间,而不是兴趣点。

Confusion matrix of the Random Tree Classifier

Precision and recall

精度和召回率,以及 F1 评分表明结果是好的,但分类器还有进一步改进的空间。我们必须重申,锚定点对于计算轨迹之间的距离来说不那么麻烦,我们将继续这些结果。

我们发现到港口的距离、到前一个港口的距离、船的速度是最重要的特征,相应地得分为 0.42、0.21 和 0.28,径向速度和到港口方向的速度得分为 0.04 和 0.05。

可以使用标准的 Scikit-learn 函数来计算上面提到的分数。

**from** sklearn.metrics **import** classification_report, confusion_matrix
**from** sklearn.ensemble **import** RandomForestClassifier
**from** sklearn.model_selection **import** train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)clf = RandomForestClassifier(n_estimators=20, max_depth=6, random_state=0)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
print(clf.feature_importances_)

我们发现,无论分类器的得分如何,我们的大数据集都需要额外的清理。有时,进港轨迹的一小部分被错误地识别为游荡部分,我们不得不进行保守检查,要求轨迹的锚泊和游荡部分足够长,或者是自相交的,或者在进港方向上行驶的距离应小于行驶的总长度。

在所有这些检查之后,我们对轨迹的游荡和锚泊部分的船只位置进行平均。

路线建设。理论。

我们的方法受到了菲利普·贝斯、布伦丹·吉尤、让-米歇尔·卢贝斯和弗兰克·̧ois·罗耶等人工作的启发[3]。在最初的工作中,作为 Kaggle 竞赛的一部分,作者提出了一种称为“对称段-路径距离”的新方法,用于计算轨迹之间的距离,以聚类滑行航程,预测最终目的地点[4]。文章[3]对轨迹距离计算的各种方法进行了深入描述。

简而言之,我们的方法是

  1. 使用某种度量来计算轨迹之间的距离
  2. 根据轨迹的距离对轨迹进行聚类。
  3. 以选择集群中的“最佳”轨迹。

路线建设。练习。

我们测试了不同的距离计算方法,并决定使用带实际惩罚的编辑距离(ERP) [5]。该方法是一种扭曲距离方法,并且允许在不同长度的轨迹之间进行比较,在计算它们之间的距离期间对准轨迹。它在 O(n)时间内运行。该方法的实现是由[3]的作者创建的 trajectory_distance 包的一部分。我们稍微修改了这个包来加速 python 部分的计算,并添加了对并行计算的 DASK 支持。由于内存和计算时间的限制,我们最多选择 50 个随机轨迹,因为热门路线上的计算可能会处理数百个轨迹。这将我们引向 43847 条不同的路线,这些路线将从近一百万次旅行中重建。

同一条路线上的不同行程可以有完全不同的轨迹。因此,如果需要的话,我们需要对这些轨迹进行聚类。相似性传播聚类算法是该任务的自然选择,因为它既不需要聚类数量的初始知识,也不需要距离的三角形不等式(并非所有距离计算方法都生成满足该不等式的距离)。我们使用scikit learn【1】实现了亲和传播算法。

轨迹的重建

由于 AIS 协议的限制,卫星收集的数据通常会丢失点。我们必须找到解决这个问题的办法。

首先,我们使用考虑轨迹之间的距离(我们使用简单平均)和轨迹中缺失点的数量的成本函数来定义“最佳”轨迹。

第二,我们迭代地更新轨迹:

  1. 我们仅使用可用数据找到“最佳”轨迹
  2. 我们使用“最佳”轨迹点来增强带有缺失点的轨迹。找到离“最佳”轨迹最近的点,并且将“最佳”轨迹段添加到增强轨迹中。
  3. 我们用附加数据迭代 1 -2,直到“最佳”轨迹保持稳定并且成本函数值减小。

在轨迹增强之后,我们将轨迹集合在不同的聚类中进行分割。使用上述迭代方法找到每个聚类内的“最佳”轨迹。我们使用这些轨迹作为港口之间的路线。

结果

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

结果是亚马逊 s3 桶【http://worldroutes.s3.amazonaws.com。在知识共享署名 4.0 许可下,你可以出于任何目的获得和使用它们。你可以在这里获得关于许可证的信息。

数据由四个文件组成:

  1. 沿路线计算的港到港距离( distances.csv )。
  2. 如上所述的港到港路线( routes.csv )。
  3. 我们不能为您提供端口多边形,但是,我们提供由我们的内部索引世界端口索引索引 _ 编号端口 _ 名称组成的参考数据(如果有的话,或者我们拥有的任何可用名称)和端口多边形代表点的一个坐标元组。使用 geopandas representative_point()方法( ports.csv )获得港口多边形的代表点。
  4. 带世界地图的 HTML 文件(WorldRoutes.html)

关于 Mariquant

Mariquant 是一家专注于分析工具开发的公司。我们相信,在海事行业持续广泛地采用数据驱动的分析方法将会产生巨大的价值。然而,较差的数据质量、覆盖范围和庞大的数据量对许多人来说是一个障碍,导致他们经常走上自上而下的分析之路,其中涉及大量的手动工作。

在 Marquant,我们通过采用亚马逊(Amazon)和谷歌(Google)等公司开发的尖端技术来挑战这些障碍,但同时保持对海事行业需求的高度关注。引入全自动、数据驱动的分析允许扩展到海事中发现的单个案例的数量级,从而允许及时、准确和慎重的商业决策。

参考

  1. Pedregosa 等人sci kit-learn:Python 中的机器学习,JMLR 12,第 2825–2830 页,2011 年。
  2. 盛、潘、尹静波。“基于自动识别系统数据的轨迹聚类模型提取航线模式” 可持续性 10.7 (2018): 2327。
  3. 页(page 的缩写)Besse,B. Guillouet,J.-M. Loubes 和 R. Francois,“基于距离的轨迹聚类的回顾和展望” arXiv 预印本 arXiv:1508.04904,2015 年。
  4. ECML/PKDD 15:滑行轨迹预测(一)
  5. 长度陈和 R. Ng,“论 LP-规范和编辑距离的结合”,第三十届国际超大规模数据库会议论文集-第 30 卷。VLDB 基金会,2004 年,第 792-803 页。

使用高级 NLP 库创建智能知识库系统(KBS)

原文:https://towardsdatascience.com/creating-smart-knowledge-base-systems-kbs-using-advanced-nlp-library-b5c21dfafcd1?source=collection_archive---------11-----------------------

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

Creating and Sustaining Large Knowledge Base Systems(KBS) can be a daunting exercise even for the largest corporations in the world.

企业、机构或任何大型组织通过将知识记录为书籍、期刊/文章、文档等,在其存在的几年中积累了知识。员工、学生、教学/研究团体持续获取这些知识对于持续运营至关重要。市场上的 KM(知识管理)工具通过创建各种知识库并允许访问它,在一定程度上帮助解决了这种需求。知识管理工具要求对文档进行标记(手动或自动),以便用户可以方便地搜索到它。虽然这些工具有其用途,但组织在数字时代面临着新的挑战-

  1. 获取知识库中的上下文和语义信息
  2. 即时获取信息的能力。
  3. 需要一种自动化和持续的方法来创建这样一个系统

现状场景

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

A search result like this may not serve the purpose all the time

企业知识管理解决方案可以根据用户的查询帮助用户找到所有相关文档。但是这很难满足用户的需求,因为现在用户已经(比如说)访问了 10 个文档,他必须通读它们才能得到他正在寻找的信息。对于实时项目、研究社区等中的用户来说,这可能仍然是一项乏味且令人沮丧的任务,因为它会导致获取信息的延迟。

未来情景

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

What information can I get for you today?

从知识库中获取信息的未来场景可能就像向聊天机器人询问所需的确切信息一样简单。例如,“某项技术在多少个项目实施中使用过?”类型的查询会立即返回一个答案。虽然这对大多数人来说可能听起来太好了,不像是真的,但深度学习和自然语言处理框架的技术进步已经使这样的解决方案变得可行。此外,由于人工智能技术的民主化和人工智能开源项目的健康生态系统,这样一个未来的解决方案现在已经在小型和大型企业的掌握之中。

聊天机器人背后的精灵是谁?

很明显这一切背后并没有什么精灵。但我认为,象征性地说,一大群不懈地为 NLP 的 ML & AI 前沿工作做出贡献的研究科学家和研究机构是使这成为可能的天才,我们都应该集体感谢他们的努力。解决方案是这样的。

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

Knowledge Graph (Illustration)

聊天机器人被集成到一个巨大的图形数据库中,该数据库捕获关于各种实体的信息,例如作为节点的个人、公司、位置、技术名称等,以及作为边的所有实体之间的关系和关联。例如,在句子“公司 X 使用 XYZ技术”中,“使用”是存在于实体 X & XYZ 之间的关系,并且被存储为边缘。此外,关于实体和关系的所有其他相关信息分别存储为节点和边的属性。我们受到谷歌如何使用知识图表来存储和检索信息的启发。从本质上来说,这个解决方案可以被认为是在大量知识上构建一个类似于语义搜索引擎的 google,用于即时检索。

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

Open source library from Explosion.ai

解决方案的最关键部分或核心是从自然语言中确定哪些是实体以及它们之间的关系。这是由 spacy.io 等 NLP 库提供的,这些库使开发人员能够在任何自然语言文本上训练定制的 NER(命名实体识别)和依赖解析器模型。这些模型的结果是良好识别的实体和它们的关系,捕获文档中实体和关系之间的语义上下文。实体之间的这种语义知识然后被馈送到知识图。

一旦上述流程流被自动化到管道中,知识图就可以在处理后续文档时吸收未来的添加或重叠。当它识别同一个实体时,它会重用它,并且只有当它对知识图来说完全是新的时候才创建新的实体。通过这种方式,知识库可以在未来以可持续的方式为所有后续添加内容进行有机增长,同时保留与现有知识的关系。

挑战和其他考虑

如同任何技术一样,实施智能知识库系统(KBS)有其自身的一系列挑战。

  1. 变革管理 —该解决方案需要企业中文档数字化和处理的新流程,需要组织中知识型中小企业的积极参与,更不用说这可能还需要在组织中创建新的角色
  2. 垃圾进垃圾出——这是一句著名的谚语。因此,确保文档的数字化和信息的准确提取对于该计划的成功至关重要。此外,需要准确标记实体&关系
  3. 并非所有组织都需要这种解决方案,因为信息提取的延迟不是一个巨大的障碍,所以投入时间&资源可能会被证明是违反直觉的
  4. 数据科学团队 —必须有一个经验丰富的数据科学团队来监督实施,即使这意味着从外部聘请专家
  5. 技术基础设施 —该解决方案需要在本地或云技术基础设施上进行合理的重大投资。如果您已经与任何云服务提供商建立了持续的关系,那么针对这一需求的供应将是无缝的
  6. 最后,甚至在设计阶段就让最终用户参与到解决方案中,以鼓励大规模采用,并避免在后期出现任何不匹配的期望

喜欢我的文章吗?请点击拍手按钮帮助其他人也找到它,请查看我的Raj Kumar Kaliyaperumal下面的其他热门帖子

  1. 从商业智能到数据科学&机器学习
  2. ML&DL 学习路径

我在Linkedin上发表了这篇文章。

在 SQL 中创建表

原文:https://towardsdatascience.com/creating-tables-in-sql-96cfb8223827?source=collection_archive---------15-----------------------

理解 SQL 的语法非常简单。它遵循一个简单的结构,允许我们对不同的变量重用语法。以下是创建表格的一些基本语法。

正在创建数据库

CREATE DATABASE database_name;

创建表格

CREATE TABLE movies
(
     movie_name   VARCHAR(200),
     movie_year   INTEGER,
     country      VARCHAR(100), 
     genre        VARCHAR NOT NULL, 
     PRIMARY KEY  (movie_name, movie_year)
);

在括号内注明列名、列类型和长度。您可以声明 NOT NULL 以确保它总是被填充。

插入数据

INSERT INTO movies VALUES
('SE7EN', 1995, 'USA', 'Mystic, Crime'),
('INSTERSTELLAR', 2014, 'USA', 'Science Fiction'),
('The Green Mile', 1999, 'USA', 'Drama'),
('The Godfather', 1972, 'USA', 'CRIME')

如果输入的值类型不正确或者为空,并且不为 NULL,SQL 将抛出错误。

更新数据

如果您忘记添加一个值,您可以使用 update 更新它。

UPDATE movies
SET country = 'USA'
WHERE movie_name = 'The Godfather' AND movie_year = 1972;

更改表格

您可以更新项目并将其设置为默认值。

ALTER TABLE movies
ALTER COLUMN country SET DEFAULT 'USA';

测试默认选项。现在,无论何时你提到违约,你都会得到美国。

INSERT INTO movies VALUES
('test', 2010, DEFAULT, 'test')

添加列

ALTER TABLE movies
ADD COLUMN director VARCHAR(150)

更新表格

如果要为任何列添加新值,可以使用 UPDATE。

UPDATE movies
SET director = 'Christopher Nolan'
WHERE movie_name = 'Interstellar';

删除行

如果要删除一行,可以使用 WHERE 引用它。

DELETE FROM movies
WHERE movie_name = 'test'

删除列

ALTER TABLE movies
DROP director;

还有另一种方法你可以放下一个项目,它被称为下降级联。

DROP CASCADE →删除选定的项目以及依赖于它的所有内容。例如,如果我们在整个电影的数据库中使用 DROP CASCADE,所有内容都将被删除。

用 Python 和朴素贝叶斯分类创建一个 Twitter 情感分析程序

原文:https://towardsdatascience.com/creating-the-twitter-sentiment-analysis-program-in-python-with-naive-bayes-classification-672e5589a7ed?source=collection_archive---------0-----------------------

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

Photo by Hello I’m Nik on Unsplash

如果你在科技领域呆得够久,你一定听说过情绪分析这个术语。它是预测一条信息(最常见的是文本)是否表明对该主题的积极、消极或中性情绪的过程。在这篇文章中,我们将通过制作一个 Python 程序来分析关于特定主题的推文的情感。用户将能够输入一个关键字,并根据包含输入关键字的最新 100 条推文获得对它的看法。

情感分析简介

也被称为“观点挖掘”,情感分析指的是使用自然语言处理来确定在线提及中的发言者、作者或其他主题的态度、观点和情绪。

本质上,它是决定一篇文章是正面还是负面的过程。这也叫内容的极性。

作为人类,我们能够下意识地将文本分为正面/负面。例如,句子“这个孩子脸上有一个灿烂的笑容”,最有可能给我们一个积极的情绪。用外行人的话来说,我们通过检查单词并平均正面和负面来得出这样的结论。例如,单词“华丽”和“微笑”更可能是积极的,而单词“the”、“kid”和“face”实际上是中性的。因此,句子的整体情绪很可能是积极的。

这项技术的一个常见用途是将其部署在社交媒体领域,以发现人们对某些话题的感受,特别是通过用户在文本帖子中的口碑,或者在 Twitter 的背景下,他们的推文

先决条件

  • 基本编程知识:

虽然 Python 在这个迷你项目中的参与度很高,但并不要求对该语言有很深的了解,只要你有基本的编程知识就可以了。

  • 安装的工具:

对于这个程序,我们需要在计算机上安装 Python。我们将使用库twitternltkrecsvtimejson。您可能必须安装前两个库。其余的已经随 Python 解释器一起提供了。不过,检查它们是否是最新的也无妨。

  • 数据集分割概念:

这对于全面了解流程管道至关重要。你只需要知道训练和测试数据集之间的区别,以及每一个在什么样的上下文中使用。

  • 基本的 RESTful API 知识:

这并不重要,但会有所帮助。我们将在代码中到处使用 Twitter API,对 API 进行正常调用,并处理它返回的 JSON 对象。如果你需要,你可以在这里找到官方的 Twitter API 文档。

生产过程说明

A 区:准备测试集

  • 步骤 A.1:获取身份验证凭据
  • 步骤 A.2:认证我们的 Python 脚本
  • 步骤 A.3:创建构建测试集的函数

B 区:准备训练集

C 部分:预处理数据集中的推文

D 部分:朴素贝叶斯分类器

  • 步骤 D.1:建立词汇
  • 步骤 D.2:根据我们的词汇匹配推文
  • 步骤 D.3:构建我们的特征向量
  • 步骤 D.4:训练分类器

E 部分:测试模型

在我们开始之前:

A 部分:准备测试集

因为我们的情感分析的任务主要集中在文本数据上,所以会有大量的文本处理。这肯定是正确的。事实上,我们的测试和训练数据将仅仅由文本组成。

我选择从测试集开始,是为了让大家为训练集提取部分做好准备,因为它更依赖于 API。下面是我们将要做的事情的一点概述:

1-注册 Twitter 应用程序以获得我们自己的凭证。

2-使用凭证通过 API 验证我们的 Python 脚本。

3-创建基于搜索关键字下载推文的功能。

向 Twitter 注册应用程序至关重要,因为这是获得认证凭证的唯一途径。我们一拿到证书,就开始写代码。步骤 3 是测试集所在的地方。我们将根据我们试图分析情绪的术语下载推文。

步骤 A.1:获取认证凭证

首先,我们需要访问 Twitter 开发者网站,并通过以下链接登录我们的帐户:

[## Twitter 开发者平台

Twitter 是世界上企业和个人联系的最佳场所。自从早期的 Twitter 人…

developer.twitter.com](https://developer.twitter.com/content/developer-twitter/en.html)

在右上角,点击应用程序按钮,创建一个应用程序,应用,然后继续,如下所示:

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

接下来,我们将选择“我请求访问供我个人使用”选项:

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

在同一个网页上,向下滚动一点,输入您的帐户名称和国家/地区,然后单击继续,您将被重定向到下一个网页。在这里,您可以选择任何您感兴趣的用例。对于我们的案例,我选择了以下内容:

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

做出选择后,向下滚动并填写所需的用例兴趣段落。Twitter 现在非常重视这一点(我猜他们从脸书的错误 xD 中吸取了教训),所以确保你强调该应用程序是一个自学/学术相关的项目。政府参与问题选择“否”,按“继续”。

在下一个网页上,阅读条款和条件列表,同意他们,然后提交申请。

接下来,打开您的电子邮件,通过发送给您的电子邮件中包含的链接验证您的 Twitter 开发人员帐户。最后,您将收到类似以下内容的消息:

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

你现在能做的就是等待几个小时,让申请获得批准(如果你的解释没有违反 Twitter 的条款和条件,几乎肯定会获得批准)。

当您收到批准电子邮件时,单击其中包含的登录链接。您将被重定向到以下网页,在这里您应该选择“创建应用程序”:

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

在下一个网页上,点击右上角的“创建应用程序”。重定向后,填写所需的应用程序详细信息,包括——如果你愿意——这是为了自学。点击“创建”。

下一个网页将包括您刚才输入的应用程序详细信息、访问令牌和权限。进入“密钥和令牌”选项卡。将 API 密匙和 API 秘密密匙复制到一个安全的地方(如果你愿意的话,可以是一个文本文件),因为我们稍后会用到它们。

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

完成所有设置后,单击“创建”以生成访问令牌凭证。将访问令牌和访问令牌密码也复制到一个安全的地方。我们已经完成了凭证获取部分!

步骤 A.2:认证我们的 Python 脚本

既然我们现在有了 Twitter 开发人员的登录凭证(即 API 密钥和访问令牌),我们就可以继续认证我们的程序了。首先,我们需要导入 Twitter 库,然后创建一个 Twitter。API 对象和我们讨论过的“安全”位置的凭证,如下所示:

前面代码片段中的最后一行只是为了验证我们的 API 实例是否工作。这将根据我们得到的输出来确定。运行上面的代码,您应该得到类似下面的 JSON 响应:

{"created_at": "Tue Feb 12 17:48:27 +0800 2019" 'default_profile": true ............} 

这没什么疯狂的,只是一些关于通过你的 Twitter 账户访问 API 的数据。如果你到了这里,你就可以走了。

步骤 A.3:创建构建测试集的函数

现在,我们可以开始创建一个函数来下载我们讨论过的测试集。基本上,这将是一个函数,以搜索关键字(即字符串)作为输入,搜索包含该关键字的推文,并将它们作为 twitter 返回。我们可以迭代的状态对象。

不过,这里需要注意的是,出于安全考虑,Twitter 限制了通过 API 发出请求的数量。此限制为每 15 分钟窗口 180 个请求。

这意味着,我们每 15 分钟只能使用我们的搜索功能获得多达 180 条推文,这应该不是问题,因为我们的训练集无论如何都不会那么大。为了简单起见,我们现在将搜索限制在 100 条 tweets,不超过允许的请求数。我们搜索推文(即测试集)的功能是:

正如您所料,这个函数将返回包含我们的搜索关键字的 tweets 列表。

请注意,我们将每条 tweet 的文本都耦合到了一个 JSON 对象中,标签目前为空。这仅仅是因为我们稍后会将每条推文分类为正面或负面,以便根据多数计数来确定对搜索词的情绪是正面还是负面。这就是情感分析的实际工作方式。

在我们继续之前,让我们通过在函数体后面添加以下代码来测试我们的函数:

这应该会在您的 IDE 终端上打印出五条包含我们的搜索关键字的 tweets(如果您正在使用的话)。现在一切都准备好了。我们有了测试集,可以继续构建我们的训练集了。

B 部分:准备训练集

注意,到目前为止,我们还没有写很多代码。这要归功于 Python 简洁的语法之美,以及外部程序就绪库的使用,比如 RESTful APIs(在我们的例子中是 Twitter API)。

在这一节中,我们还将使用上一节中的 Twitter API 实例。然而,我们需要先解决一些事情。我们将使用可下载的训练集。根据内容的不同,这些微博都被标上了正面或负面的标签。这正是训练集的用途。

训练集对模型的成功至关重要。数据需要正确标记,不能有不一致或不完整的地方,因为培训很大程度上依赖于这些数据的准确性和获取方式。

对于这项任务,我们将使用令人惊叹的 Niek Sanders 的超过 5000 条手动分类推文的语料库,这使得它非常可靠。这里还有一个问题。Twitter 不允许在个人设备上存储推文,尽管所有这些数据都是公开的。因此,语料库包括每个 tweet 的关键字(tweet 的主题)、标签(pos/neg)和 tweet ID 号(即我们的 CSV 语料库中的行)。你可以从原始站点获得包含语料库的文件,或者通过个人知识库的这个链接。

让我们往回走一点。还记得我们说过的 Twitter API 限制吗?这也适用于这里,因为我们将使用 API 通过语料库中包含的每个 tweet 的 ID 号来获取实际的 tweet 文本。这意味着,要下载 5000 条推文,我们需要遵循:

max_number_of_requests = 180
time_window = 15 minutes = 900 secondsTherefore, the process should follow:Repeat until end-of-file: {
    180 requests -> (900/180) sec wait
}

现在,让我们编写代码来实现这一点。让我们不要忘记将通过 API 获取的 tweets 保存到一个新的 CSV 文件中,这样我们就不必在每次运行代码时都下载它们。我们的职能如下:

这很难,但是如果我们把它分解成几个部分,就相当简单了。首先,我们定义函数来接受两个输入,这两个输入都是文件路径:

  • corpusFile是我们下载的 Niek Sanders 的 CSV 语料库文件的字符串路径。如前所述,这个文件包括 tweet 的主题、标签和 id。
  • tweetDataFile是我们想要保存完整推文的文件的字符串路径。与corpusFile不同,这个文件将包括每条推文的文本以及主题、标签和 id。

接下来,我们从一个空单corpus开始。然后我们打开文件corpusFile,将文件中的每条推文添加到列表corpus

代码的下一部分处理基于 id 获取 tweets 的文本。我们循环遍历 corpus 中的 tweet,调用每个 Tweet 上的 API 来获取 Tweet。特定推文的状态对象。然后,我们使用同一个对象(status)获取与之相关的文本,并将其推入trainingDataSet,然后休眠(即暂停执行)五分钟(900/180 秒),以遵守我们讨论过的请求限制。

现在让我们花点时间离开我们的脚本,在最后一个函数之后下载推文(这将花费几个小时)。我们可以使用下面的代码片段来做到这一点:

代码一执行完,您的tweetDataFile CSV 文件就会充满 tweets(事实上大约 5000)。如果你走到这一步,恭喜你!—我第一次花了很长时间才顺利到达这里。现在我们完成了相对无聊的部分。让我们为即将到来的部分做好准备。

C 部分:在数据集中预处理推文

在我们进入实际的分类部分之前,有一些清理工作要做。事实上,这一步非常关键,在建立机器学习模型时通常需要很长时间。然而,这在我们的任务中不是问题,因为我们拥有的数据是相对一致的。换句话说,我们确切地知道我们需要从它那里得到什么。我稍后会就此事发表意见。

下面说说情感分析中什么重要,什么不重要。单词是最重要的部分(在某种程度上,我们将在接下来的部分中讨论)。然而,当涉及到标点符号之类的东西时,你无法从标点符号中获得情感。所以标点对情感分析来说无所谓。此外,图片、视频、网址、用户名、表情符号等推文组件。不要助长推文的极性(无论是正面还是负面)。然而,这只适用于这个应用程序。例如,在另一个应用程序中,你可以有一个深度学习图像分类器,它学习并预测推文中包含的图像是代表积极的东西(例如彩虹)还是消极的东西(例如坦克)。说到技术性,情感分析和深度学习都属于机器学习。事实上,你可以通过深度学习进行情感分析,但那是另外一个故事了。

因此,我们知道我们需要在现有的推文中保留什么,需要去掉什么。这适用于训练集和测试集。因此,让我们创建一个预处理器类:

这很难,所以让我们把它分成几部分。我们从导入的库开始。re是 Python 的正则表达式(RegEx)库,它负责解析字符串并以有效的方式修改它们,而不必显式地遍历组成特定字符串的字符。我们还导入了自然处理工具包ntlk,这是最常用的 Python 库之一。它负责我们需要对文本执行的任何处理,以改变其形式或从中提取某些成分。类别建构函式会移除停用字词。这是一个相对较大的主题,您可以稍后阅读,因为它更多地涉及自然语言处理,而与我们的主题关系不大。

processTweets函数只是遍历输入其中的所有 tweet,在列表中的每个 tweet 上调用它的相邻函数processTweet。后者通过首先将所有文本转换成小写字母来进行实际的预处理。这仅仅是因为,在几乎所有的编程语言中,“car”与“cAr”的解释方式不同。因此,最好将所有数据中的所有字符都规范化为小写。其次,URL 和用户名从 tweet 中删除。这是出于我们在文章前面披露的原因。之后,数字符号(即#)从每个标签中移除,以避免标签被不同地处理。最后但并非最不重要的一点是,删除重复字符,以确保没有重要的单词未经处理,即使它以不寻常的方式拼写出来(例如,“caaaaar”变成了“car”)。最后,tweet 的文本被分解成单词(标记化),以便在接下来的阶段中简化处理。

我们举个例子。数据集中可能会出现以下推文:

"@person1 retweeted @person2: Corn has got to be the most delllllicious crop in the world!!!! #corn #thoughts..."

我们的预处理器将使推文看起来像这样:

“AT_USER rt AT_USER corn has got to be the most delicious crop in the world corn thoughts”

最后,标记化将导致:

{“corn”, “most”, “delicious”, “crop”, “world”, “corn”, “thoughts”}

请注意,我们的代码删除了前面提到的单词中的重复字符(即“delllllicious”变成了“delicious”)。但是,它没有从文本中删除重复的单词(即“玉米”),而是保留了它们。这是因为重复词在确定文本的极性中起作用(我们将在下一节中看到)。

我们已经准备好使用我们的预处理器类。首先,我们将创建一个引用它的变量(一个对象),然后像前面讨论的那样在训练集和测试集上调用它:

现在我们可以进入最激动人心的部分——分类。但是首先,让我们重温一下我们的算法:朴素贝叶斯分类器。

D 部分:朴素贝叶斯分类器

毫无疑问,计算机科学和机器学习中最重要的概念之一。直接进入 It 的数学领域可能会令人沮丧。因此,我不会从数学的角度来解释它。

成为计算机科学家不需要懂数学。然而,要成为一个真正优秀的人,你确实需要了解数学。

我想强调的事实是,我在这里只简要地解释朴素贝叶斯分类,因为深入的解释值得自己的长篇大论。

朴素贝叶斯分类器是一种基于贝叶斯定理的分类算法。该定理提供了一种计算称为后验概率的类型或概率的方法,其中事件 A 发生的概率依赖于概率已知背景(例如事件 B 证据)。比如,如果 Person_X 只在外面不下雨的时候打网球,那么,根据贝叶斯统计,Person_X 在不下雨的时候打网球的概率可以给出为:

P(X plays | no rain) = P(no rain | X plays)*P(x plays)/P(no rain)

遵循贝叶斯定理:

P(A|B) = P(B|A)*P(A)/P(B)

对于我们的任务,你只需要知道朴素贝叶斯分类器依赖于著名的贝叶斯定理。在我们继续之前,让我们快速概述一下接下来要采取的步骤:

1-建立驻留在我们的训练数据集中的所有单词的词汇表(单词列表)。

2-将 tweet 内容与我们的词汇表进行逐字匹配。

3-建立我们的单词特征向量。

4-将我们的特征向量插入朴素贝叶斯分类器。

这可能看起来很多,但不要担心。它实际上非常简单,而且尽可能的短。让我们一步一步地把它记下来。

步骤 D.1:构建词汇

自然语言处理中的词汇表是模型可用的所有语音片段的列表。在我们的例子中,这包括我们拥有的训练集中的所有单词,因为模型可以相对平等地使用所有这些单词——在这一点上,至少可以这样说。代码看起来会像这样:

这只是创建一个我们在训练集中拥有的all_words列表,将它分解成单词特征。这些word_features基本上是不同单词的列表,每个单词都有其频率(在集合中出现的次数)作为key

步骤 D.2:根据我们的词汇表匹配推文

这一步至关重要,因为我们将检查我们的训练集(即我们的word_features列表)中的所有单词,将每个单词与手头的推文进行比较,将一个数字与下面的单词相关联:

label 1 (true): if word in vocabulary is resident in tweet
label 0 (false): if word in vocabulary is not resident in tweet

这很容易编码:

给定最后一个代码片段,对于 word_features 中的每个单词,我们将拥有 JSON 键‘contains word X’,其中 X 是单词。根据我们之前所说的标签,其中的每个键都将具有值 True/False——True 表示“存在”, False 表示“不存在”。

步骤 D.3:构建我们的特征向量

现在让我们调用我们编写的最后两个函数。这将建立我们的最终特征向量,我们可以继续进行训练。

NTLK 内置函数apply_features从我们的列表中提取实际的特征。我们最终的特征向量是trainingFeatures

步骤 D.4:训练分类器

我们终于完成了我们任务中最重要的——讽刺的是最短的——部分。多亏了 NLTK,我们只需要一个函数调用就可以将模型训练成朴素贝叶斯分类器,因为后者内置于库中:

我们快完成了!我们剩下的就是运行分类器训练代码(即nltk.NaiveBayesClassifier.train())并测试它。请注意,执行这段代码可能需要几分钟时间。

E 部分:测试模型

关键时刻到了。让我们根据我们的搜索词,通过对我们从 Twitter 下载的 100 条推文运行分类器(即NBayesClassifier)来完成我们的工作,并获得分类器返回的标签的多数投票,然后输出推文的总正面或负面百分比(即分数)。这也很简单:

就是这样!恭喜你。您已经创建了一个 Twitter 情绪分析 Python 程序。请注意,我们没有触及准确性(即评估模型),因为这不是我们今天的主题。稍后我会在一篇文章中解释机器学习中的整个模型/假设评估过程。让我们最后看一下我们为此任务编写的完整代码:

结论

情感分析是一种有趣的方式,可以用来思考自然语言处理在对文本做出自动结论方面的适用性。它被用于社交媒体趋势分析,有时也用于营销目的。由于现代现成的库,用 Python 编写情感分析程序并不是一件困难的事情。这个程序简单地解释了这种应用程序是如何工作的。这只是出于学术目的,因为这里描述的程序绝不是生产级的。

为游戏创建语音助手(国际足联教程)

原文:https://towardsdatascience.com/creating-voice-assistant-for-games-tutorial-for-fifa-71cfbe428bd1?source=collection_archive---------21-----------------------

使用深度学习驱动的唤醒词检测引擎,通过语音命令玩游戏。

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

Enabling the “rainbow flick” skill in the game by giving voice command “flick right”.

像亚马逊 Alexa 和谷歌 Home 这样的语音助手已经广泛流行,用于自动化和简化日常任务的执行。它们允许用户通过使用他们的声音快速完成事情,而不必通过他们的手机或电脑进行多次交互。

它们越来越受欢迎,最近被广泛采用,这在很大程度上要归功于语音识别技术的进步,这是由深度学习的进步推动的。

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

Popular voice assistants: Amazon Echo, Anki Vector and Google Home Mini.

我想探索我们如何利用这项技术,通过添加一种新的输入方法来配合传统的游戏手柄控制系统,从而改善我们的游戏体验。因此,我为足球/橄榄球模拟游戏 FIFA 创建了一个语音助手,它可以改变你的球队的战术,或者在比赛中表演技巧动作和庆祝进球,所有这些都只需要语音命令。

在本教程中,我将介绍如何为 FIFA 重新创建相同的命令,但你也可以按照相同的步骤创建自己的自定义语音命令,并将其添加到任何你喜欢的游戏中!

动机:我为什么选择国际足联?

如果你像我一样多年来一直在玩国际足联,你会知道为了改变游戏中的战术你需要记住不同的组合键。要在游戏中改变阵型或替换球员,你需要暂停游戏并进入菜单,这打破了游戏的流程,变得非常烦人,尤其是在在线模式下。此外,对于不同的目标庆祝,需要记住更多的组合键,而你通常只能记住其中的几个。游戏技巧也是如此,给出了近百种不同的组合键来记忆。

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

What if you could simply activate these skill moves by speaking out their names to a voice assistant without having to remember the 100 different key combinations?

我们先来看看语音识别引擎在语音助手中是如何工作的。

语音识别算法是如何工作的?

假设我们想要检测唤醒词“Okay EA”。

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

Converting raw audio to text using an RNN.

我们从麦克风捕捉原始音频,并将其转换为声音中不同频率频谱的可视化表示,称为声谱图。这是受人类的耳朵如何捕捉音频的启发。接下来,我们将该谱图的薄片作为连续时间步长馈送给递归神经网络模型。该模型被训练来预测在该时间范围内说出字符的可能性。将这样的可能性放在一个序列中给我们音频输入中所说的单词的文本形式,从而将语音转换为文本。

我们将使用名为 Porcupine 的库,该库声称利用这样的深度学习模型来执行对关键词的实时检测,我们可以使用这些关键词来识别语音命令。克隆下面的库,我们将使用它来创建自定义语音命令。

[## 皮科语音/豪猪

由深度学习支持的设备上唤醒词检测。-皮科语音/豪猪

github.com](https://github.com/Picovoice/Porcupine)

辅导的

在本教程中,我将展示我们如何创建一个自定义的唤醒词(如“Alexa”或“Okay Google”),然后发出命令在游戏中执行技能移动。

步骤 1:创建自定义语音命令

从克隆的 porcupine 存储库的主目录,在终端中运行以下命令,创建一个唤醒词检测文件来激活助手。我用的是“Okay EA”(因为 EA 是 FIFA 系列的发行商)。该命令生成的文件将存储在名为 output 的目录中。

tools/optimizer/windows/amd64/pv_porcupine_optimizer -r resources/ -w "Okay E A" -p windows -o output/

接下来,创建执行“彩虹轻弹”技能移动的命令。

tools/optimizer/windows/amd64/pv_porcupine_optimizer -r resources/ -w "flick right" -p windows -o output/

这会给我们两个*。输出目录中的 ppn* 文件。

步骤 2:设置豪猪检测引擎

步骤 3:从麦克风设置实时命令检测

这里下载帮助文件 directkeys.py。这个文件帮助模拟键盘按键,以便 python 脚本可以与游戏交互。然后,执行以下命令,在连续循环中检测关键字,并在检测到适当的命令时激活相关的技能移动。

请注意,第 38 行到第 48 行需要匹配游戏中执行技能移动所需的按键。您可以通过使用它们各自的组合键来添加更多这样的移动。

这就是全部,你现在可以使用这个脚本来检测语音命令并激活游戏中的技能!在我的 GitHub 库下面找到更多支持动作的完整代码。

[## ChintanTrivedi/DeepGamingAI _ FIFA va

国际足联(windows 平台)游戏的语音助手,用你的声音控制游戏动作。…

github.com](https://github.com/ChintanTrivedi/DeepGamingAI_FIFAVA)

结果

进球庆祝:

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

Using the command “work out” to perform a goal-scoring celebration.

在比赛中改变战术:

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

Using the command “high pressure” to change tactics of how the team plays the match.

更多这样的结果可以在我的 YouTube 频道上找到,视频嵌在下面。

结论

如果 EA 能在未来的 FIFA 版本中加入这样的语音助手就太好了。发出类似于*“用佩德罗替换威利安”“将阵型改为 4–4–2”*的命令,就可以立即看到比赛中的变化,而不必进入暂停菜单。此外,制作这样的语音助手可以简化游戏中的控制,并可以作为休闲游戏玩家的完美补充输入方法。

你们是怎么想的,是想用语音作为一种额外的输入方式来控制游戏,还是对现有的游戏手柄控制感到满意?下面让我知道!

感谢您的阅读。如果你喜欢这篇文章,请在媒体GitHub 上关注我,或者订阅我的 YouTube 频道。哦,还有 2019 新年快乐!

用 D3 Observable 创建 Web 应用程序

原文:https://towardsdatascience.com/creating-web-applications-with-d3-observable-d5c53467ff12?source=collection_archive---------11-----------------------

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

什么是 D3 可观测?

我以前写过关于将 D3 引入 web 应用程序的文章这里,看看如何将 D3 视觉效果绑定到 UI 元素。目的是鼓励超越独立的视觉效果,让人们原型化更完整的应用程序。真正的应用程序会征求反馈,因为它们使用了*,帮助我们验证超出常规统计方法的分析。在我看来,如果你没有在构建一个真正的产品,你就没有真正在学习/做数据科学。*

前一篇文章仍然有效,但是 D3 正朝着它所谓的可观察(正式名称为 d3.express)的方向转变。Observable 提供了一个各种各样的游乐场,允许用户在一个笔记本中在线修改 D3 代码。对于那些使用 Jupyter 笔记本的人来说,你会发现体验是相似的。它本质上是一个做 D3 的 REPL。

Observable 向真正的开发开放了 D3,因为它现在提供了下载您定制的 D3 visual 作为一个独立的“包”(一个 tarball 文件),您可以将它嵌入到您的应用程序中。Observable 自带运行时标准库,为使用 HTMLSVG生成器文件承诺提供了有用的功能。

以下是可观察到的文档:

* [## 可观察:用户手册

可观察:用户手册👋欢迎来到 Observable -网络神奇笔记本之家!有很多东西要学…

observablehq.com](https://observablehq.com/@observablehq/user-manual)

…以及一篇关于他们方法的自以为是的文章:

[## 更好的编码方式

介绍 d3.express:集成发现环境。

medium.com](https://medium.com/@mbostock/a-better-way-to-code-2b1d2876a3a0)

你可以在这里找到视觉效果 的例子,你可以立即在你的浏览器中开始玩。当您希望创建新的可视化效果时,请访问以下网站,选择一个项目,根据需要编辑可视化效果,并嵌入到您的应用程序中。

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

概观

在本文中,我们将探讨以下主题:

  • 创建一个快速的应用程序布局基于 2 个简单的样机;
  • 为我们的应用程序的 UI 元素制作组件;
  • 在我们的 app 内嵌入 可观察
  • 在我们的 app 和 Observable 之间发送 数据
  • 使用谷歌的图书 API

你可以在这里查看简单应用

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

Figure 1

让我们开始吧。

应用程序

让我们制作一个简单的应用程序,它使用 Kaggle 上托管的 Goodreads 数据集 来允许人们探索书名。数据集列出了书名、作者、ISBNs 和一些简单的特性,比如评级。

模型

我们将允许用户查看原始数据的表格,并提供过滤功能,以便用户可以通过作者ISBN 号和语言来搜索表格。

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

Figure 2

我们还将从谷歌的图书 API 中获取图书属性,并在条形图中展示它们。该 API 还提供了所选图书的图片 URL,因此当用户通过 ISBN 搜索时,我们将显示图书封面:

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

Figure 3

我们将使用 Azle 把 Observable 和 Google 的 Book API 缝合成一个真正的应用程序。

目录结构

我们首先为我们的应用程序创建下面的目录结构:

**app**
├── **data** ├── **scripts** ├── **d3_visuals** ── **table** ── **bar_chart** ├── index.html

粗体名称是空文件夹,index.html 文件是通常的 Azle 起点:

codeblock 1

我们将在本文中添加所需的文件。现在通过在终端会话中运行以下命令,在 app 文件夹中启动一个简单的 web 服务器:

python3 -m http.server

…然后将您的浏览器指向本地主机:

[http://localhost:8000](http://localhost:8000/)

步骤 1:创建应用程序布局

我将使用 Azle 来创建我的应用程序的框架。我创建 Azle 是因为它使用快速、易于理解、轻量级、灵活且免费,并且使得将库和框架缝合在一起变得容易。但是你可以使用任何你喜欢的 JS 工具。

1.1 创建应用程序布局

我们使用 Azle 的 az.add_layout 函数创建布局。这就是我们如何在页面上创建网格。我将把我的布局代码放在 Azle 的 index.html 文件中:

codeblock 2

通读上面的代码,你可以很容易地知道页面是如何构建的。每个 Azle 函数都带一个“ target_classtarget_instance 来向 DOM 添加元素。它还接受一个具有属性的对象。如果我们添加一个元素,它是一个内容对象,如果我们设计一个元素,它是一个样式对象(通常的 CSS 样式)。

上述代码产生以下内容:

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

Figure 4

我们可以看到布局如何允许我们通过在屏幕上划分区域来定位元素。让我们给我们的主体部分涂上颜色,这样它就能和身体的颜色融为一体了。我们将通常的 CSS 样式作为属性传递给样式对象:

**az**.**style_sections**('my_sections', 1, {
  "background": "rgb(51, 47, 47)",
  "height": "auto"
 })

让我们也添加一个深色的背景,我们的视觉 _ 布局:

**az.style_layout**('visual_layout', 1, {
  "align": "center",
  **"background": "rgb(39, 36, 36)"**,
  "border-radius": "4px",
  "height": "460px",
  "margin-top": "10px",
  "column_widths": ['65%', '35%'],
  "border": 3
 })

现在我们的应用程序看起来像这样:

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

Figure 5

我们所有的布局单元格都在等待它们的内容。这就是组件出现的地方。

1.2 创建应用程序组件

组件由 UI 元素样式事件组合而成。这就像将创建应用程序特定部分所需的所有代码打包在一起。例如,如果我们想在我们的应用程序中有一个日历,我们将创建一个日历组件,并将其放置在我们的布局单元格之一。

创建组件使我们的代码模块化,易于重用,易于维护,并使我们能够在想法改变时更容易地调整应用程序。虽然我们将在 Azle 中创建我们的组件,但这些也可能是添加到 Azle 布局中的 React 组件。

从上面的模型中,我们知道我们需要搜索栏、图标、下拉菜单、图像和 D3 视觉效果。展示我们如何为这个应用程序创建每个组件超出了本文的范围。你可以在这里查看完整应用代码 。我们将在本文中创建几个主要的。

我们将所有组件代码放在 az.components 对象中:

az.components = {}

创建一个名为 component.js 的文件,并添加以下代码:

codeblock 3

看起来很多,但读起来很容易。注意我们如何首先添加和样式化一个布局,就像我们上面做的一样,这一次是为了保存我们的输入框和搜索图标。然后,我们将一个输入元素添加到第一个布局单元格中,并将搜索图标添加到第二个布局单元格中。最后,我们将一个事件添加到我们的搜索图标中,这样当用户点击它时,就会发生一些事情。

不要担心在我们的点击事件中发生的所有事情,我们会在嵌入 D3 视觉效果后解决这些问题。现在让我们创建组件,为我们的应用程序添加 D3 视觉效果。下面是的例子:

codeblock 4

它看起来有点回调地狱,但它是可读的。我们添加并样式化一个 iframe,等待 iframe 完成加载,确保完整的数据集可用,然后将我们的消息发送到 iframe。消息发布是我们与 D3 交流的方式。我们将在下一节讨论这一点。

添加组件的方式与 Azle 向应用程序添加元素的方式相同:

**az.components.d3_table**(target_class, target_instance)

因此,上面的代码行将我们的 iframe 添加到我们的应用程序框架的一个单元中。这些框架中还没有任何视觉效果可以显示,所以让我们去抓取我们可观察到的视觉效果,然后我们将它们定位到它们适当的单元格中。

步骤 2:在应用程序中嵌入 D3

嵌入 Observable 非常简单,只需下载所需视觉对象的 tarball,然后在 iframe 中托管其 index.html 文件。这并不是将 Observable 引入应用程序的唯一方法,但是它很快,并且对于快速原型开发很有效。

2.1 从可观察的事物中获得视觉效果

我们需要一张条形图。这些都可以在网上搜索到:

[## 带 D3 的基本表

普斯塔法的可观察的笔记本。

observablehq.com](https://observablehq.com/@pstuffa/tables-with-nested-data) [## 条形图

条形图这个图表显示了英语中字母的相对频率。这是一个垂直条形图…

observablehq.com](https://observablehq.com/@d3/bar-chart)

我们通过点击右上角的 3 个点下载 他们的 tarballs :

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

Figure 6

下载完成后,解压压缩包并放入各自的文件夹:

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

2.2 在 App 和 D3 之间建立通信

我们需要我们的应用程序与我们可观察到的视觉效果进行交流。在上一节中,我们提到了使用az . post _ message _ to _ frame来做这件事。下面是函数:

codeblock 5

Azle 的 post_message_to_frame 允许我们的应用程序在 iframe 内部发送数据和函数(只要所有东西都在同一个服务器上,就不会有 CORS 问题)。

main.redefine 来自可观察本身,也是我们如何在 D3 可视化中重新定义变量和数据。D3 表以名为“fakeData”的数据对象开始,因此我们需要用 Kaggle 数据集中的图书数据替换它。你会注意到我们传入了一个名为 filter_by_author 的父函数,而不是数据本身。我们稍后会讨论这个问题。

这个等式的另一半是 D3 如何接受发布的消息。为了让托管的可观察对象接受来自应用程序的传入消息,我们必须向可观察对象的 index.html 文件中添加一个事件监听器:

codeblock 6

Azle 图书馆在最上面:

<script src='[https://azlejs.com/v2/azle.min.js'](https://azlejs.com/v2/azle.min.js')></script>

所以我们的 D3 表 index.html 文件应该是这样的:

codeblock 7

为了清楚起见,我们将向该文件添加:

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

这种通信是可行的,因为我们使用 Azle 的 post_message_to_frame 在我们的框架内发送 Observable 的 main.redefine ,此时我们的框架接受该消息并执行 parent.filter_by_author 函数(如代码块 5 所示)。下图描述了这个概念:

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

Figure 7

在我们讨论父函数之前,让我们来设计一下 D3 的视觉效果。

2.3 向 D3 Observable 添加样式

因为我们下载了整个笔记本,所以会有我们不希望在应用程序中出现的笔记本单元格(它们用于将视觉效果调整为 REPL)。我们应该移除那些细胞。

我们可以通过删除【Observable 的index.html 文件中的下面一行:****

const main = runtime.module(define, Inspector.into(document.body));

包含以下内容:

const main = runtime.module(define, name => {
  if (name == 'chart') {
    return new Inspector(document.body)
  }
});

这样只会画出图表。

我们也可以设计 D3 视觉效果让它看起来更现代。检查表文件夹中的table-with-nested-data . js文件。比较原始文件和我在这里准备的文件,看看我添加的样式。

codeblock 8

区别在于:

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

如果您检查 bar_chart 文件夹中的 bar-chart.js 文件,您会看到类似的变化。

步骤 3:创建父函数

我们上面提到了父函数的使用。在图 7 中,我们看到了我们的应用程序和 Observable 之间的双向通信。父函数是我们在应用程序中从可观察对象调用函数的方式。

我们希望 Observable 使用新的、经过过滤的数据重新绘制它的 D3 视图。因此,我们将使用从 iframes 内部调用的函数来过滤原始数据集(我们之前读到的)。

创建一个名为 parent_functions.js 的文件,放在 scripts 文件夹中:

**app**
├── **data** ├── **scripts** ── parent_functions.js
├── **img** ├── **d3_visuals** ── **table** ── **bar_chart** ├── index.html

下面是前 3 个父函数,它们返回完整的数据集、按语言过滤的数据或按作者过滤的数据。

codeblock 9

我们的框架将通过代码块 6 调用这些函数,并用新返回的数据替换默认的可视化数据集。

步骤 4:定位我们的组件

至此,我们已经基于实体模型构建了一个简单的应用程序布局,精心制作了组件,在包含 main.redefine 的组件中设置了单击事件,向 D3 索引文件添加了事件处理程序,并创建了用于返回完整和过滤数据的父函数。此外,我们有我们的 D3 可视图像在他们的文件夹中等待。

D3 部分剩下的就是将我们的组件放入它们的目标单元。我们像任何其他 Azle 函数一样,使用目标布局单元格的 target_classtarget_instance 来定位我们的组件。

首先,我们需要将数据集加载到应用程序中。

我下载了 CSV 格式的 Kaggle Goodreads 数据集,然后使用在线转换器将其转换成 JSON。然后我下载了新的 JSON 文件,并保存到我们的 app 目录的 data 文件夹中,命名为 books.json

现在我们可以使用 Azle 的 read_local_file 函数来读取我们的数据集。将它放在 index.html 文件的顶部:

codeblock 10

我将数据保存为一个名为 az.hold_value.full_dataset 的新对象。可以使用 az.hold_value。[变量名称]使任何变量或对象在 Azle 名称空间内全局可用。请注意,我还对数据进行了“切片”,以限制应用程序中显示的行数。您可以删除它以显示所有数据(或者更好的是,创建一个允许用户控制加载多少行的组件:)

现在,我将使用 Azle 的 call_once_satisfied 函数来确保在调用我们的组件之前已经加载了完整的数据集:

codeblock 11

一旦定义了现有数据对象的条件,这将把所有组件添加到我们的应用程序布局中。

我们的看起来是这样的:

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

如果你玩应用,你会看到用户可以通过作者姓名和语言过滤 D3 表格。许多 B2B 应用程序受益于这种功能。

当用户通过 ISBN 搜索时,我们仍然需要实现我们的原型承诺,显示信息的条形图和书的封面。让我们现在做那件事。

步骤 5:调用 Google 的图书 API

如前所述,我们可以使用免费的谷歌图书 API 从 ISBNs 获取图书封面。快速的谷歌搜索会让我们看到显示如何使用它的堆栈溢出答案(通常比通常的文档更快):

[## 通过 ISBN 搜索谷歌图书 API

我试图弄清楚如何使用谷歌图书 API 通过 ISBN 搜索一本书。我需要写一个程序…

stackoverflow.com](https://stackoverflow.com/questions/7908954/google-books-api-searching-by-isbn)

我们希望条形图和图书封面出现在用户通过 ISBN 搜索后。如果您查看 components.js 中的 search_by_isbn 函数并检查它的 click 事件,您将会看到这是如何处理的。

当用户粘贴 ISBN #并点击搜索图标时,会发生 4 种情况:

  • 调用 fetch_book_cover 组件;
  • 使用 az.style_iframe 中的 CSS display 属性切换 iframe 的显示;
  • 一条消息被发送到保存条形图的 iframe,数据由 ISBN 过滤;
  • 伴随条形图调用 add_chart_buttons 组件。

fetch_book_cover 组件解析从 Google 的 Book API 返回的数据,并检索所需的图片 URL:

data.items[0].volumeInfo.imageLinks.thumbnail

…在我们将图书封面添加到应用程序时,我们可以将它用作图片 URL:

**az.add_image**('visual_layout_cells', 2, {
     "this_class": "cover_img",
     "image_path": data.items[0].volumeInfo.imageLinks.thumbnail
})

如果你查看应用程序代码的 component.js ,你会看到一个调用谷歌图书 API 的函数。它使用 Azle 的 call_api 函数以及以下 URL:

"https://www.googleapis.com/books/v1/volumes?q=isbn:" + **az.grab_value**('search_isbn_bar', 1)

这只是将 API url 和用户添加的 ISBN 连接到类名为“search_isbn_bar”的输入字段。

用户因此可以从表格中复制一个 ISBN 号,并将其粘贴到通过 isbn 输入字段进行搜索,这将绘制条形图并显示该书的封面:

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

用户还可以使用条形图下方的细按钮来更改条形图视图。这里又是 app gif:

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

如前所述,您可以通读完整的代码库,看看完整的应用程序是如何构建的。如果你看到一个看起来不熟悉的函数,参考 Azle 的文档。本文想要展示将 D3 Observable 引入一个真正的 web 应用程序所需的核心部分。

摘要

在本文中,我们研究了在 web 应用程序中嵌入 D3 Observable。我们使用 Azle 将 Observable 和 Google 的 Book API 结合在一起,创建了一个真正的应用程序,允许用户搜索和浏览书名。

我们的任务包括基于 2 个简单的实体模型创建一个快速布局,制作并定位组件,在框架中嵌入一个可观察的表格图表,使用消息 发布事件 处理程序在应用程序和可观察对象之间进行通信,最后使用 Google 的 Book API

我们只讨论了将 D3 连接到应用程序所需的主要部分。您可以在 GitHub 项目上探索更多代码。我鼓励你创建自己的应用程序,并通过真实的产品将你的分析带给用户。

如果你喜欢这篇文章,你可能也会喜欢:

[## 学习建立机器学习服务,原型真实的应用程序,并部署您的工作…

在这篇文章中,我将向读者展示如何将他们的机器学习模型公开为 RESTful web 服务,原型真实…

towardsdatascience.com](/learn-to-build-machine-learning-services-prototype-real-applications-and-deploy-your-work-to-aa97b2b09e0c) [## 机器学习工作流的 GUI 化:快速发现可行的流水线

前言

towardsdatascience.com](/gui-fying-the-machine-learning-workflow-towards-rapid-discovery-of-viable-pipelines-cab2552c909f) [## 创建 R 和 Python 库的分步指南(在 JupyterLab 中)

r 和 Python 是当今机器学习语言的支柱。r 提供了强大的统计数据和快速…

towardsdatascience.com](/step-by-step-guide-to-creating-r-and-python-libraries-e81bbea87911) [## 用 D3.js 从玩具视觉过渡到真实应用

我们经常孤立地学习技术和方法,与数据科学的真正目标脱节;至…

towardsdatascience.com](/combining-d3-with-kedion-graduating-from-toy-visuals-to-real-applications-92bf7c3cc713)*

用 python 创建单词云

原文:https://towardsdatascience.com/creating-word-clouds-with-python-f2077c8de5cc?source=collection_archive---------5-----------------------

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

Image from culturacolectiva

在最近的一个 NLP 项目中,我看到了一篇文章,文章中用美国总统就职演说中的单词创建了单词云。虽然我使用了单词云来可视化文档中最常见的单词,但我没有考虑过使用它和遮罩来表示主题。这让我开始思考…

几个月前,在《权力的游戏》第一季到第七季的最后一集播出前不久,我急切地等待着大结局——以至于我去寻找任何我能在网上找到的《权力的游戏》数据,以预测谁将在第八季的混乱中幸存下来,以及 7 个王国将会发生什么。不幸的是,我没有时间了,但我确实找到了人们收集的大量数据和可视化。当我偶然发现就职词云时,我想知道我是否可以使用《权力的游戏》的数据,特别是剧本,以及角色的图像遮罩来创建一些非常酷的可视化效果。在本文中,正如在最近的一次技术会议上展示一样,我将逐步使用 python 创建《权力的游戏》单词云。

入门指南

在处理基于文本的数据时,遵循与就职词云文章相似的方法,涉及几个步骤。这些步骤是:

  1. 查找相关数据
  2. 清理数据
  3. 从图像创建遮罩
  4. 生成单词云

因为我将在本教程中使用 python,所以有许多库可以帮助完成上述步骤,另外 Dipanjan Sarkar 的自然语言处理指南提供了文本分析技术的全面介绍,如果你正在寻找关于该主题的进一步阅读。

在开始第一步之前,我定义了项目的目标,以确保不会遗漏任何重要步骤,并对目标有一个清晰的愿景。

**项目目标:**为《权力的游戏》中被图像掩盖的角色创建文字云。

1.查找相关数据

网上有大量的《权力的游戏》数据——我通常首先在 GitHub 和 Kaggle 上搜索数据集——我很快找到了一个包含脚本的数据集。

为了实现项目目标,每个角色的台词都需要陈述——第一个问题是:角色台词可用吗?

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

Snippet of Game of Thrones script

看第一集的一个片段,人物数据是有的!然而,在探索下一集和下一季时,角色名字的格式会有所不同。

在上面的例子中,只使用了角色的名字,而且都是大写的,而在其他季节中,角色的全名都是大写的。舞台指示也可以包含在角色名称中。

因此,通过字符名称搜索所有行,可以使用带有字符名称的正则表达式:

re.findall(r'(^'+name+r'.*:.*)', line, re.IGNORECASE)

这个表达式搜索一行的开始(^),后面是我们作为变量输入的字符名,后面是任何文本(。),然后是一个冒号,表示这是一个字符行(😃,后跟任何文本(。).通过将该正则表达式包含在括号中,返回整行。最后忽略大小写,所以角色名可以是大写/小写/字母大小写。

使用下面的函数将返回一个字符的所有行:

# final_data taken from:  
# [https://github.com/shekharkoirala/Game_of_Thrones](https://github.com/shekharkoirala/Game_of_Thrones)# get data for characters
def get_char_lines(char):    
    output = []          
    print('Getting lines for', char)        

    with open('final_data.txt', 'r') as f:
        for line in f:
            if re.findall(r'(^'+char+r'.*:.*)',line,re.IGNORECASE):
                output.append(line)
    f.close()
    print(char, 'has ', len(output), 'lines')return output# get lines using
get_char_lines('arya')

2.清理数据

现在我们有了角色的线条,这些需要被清理。

以下技术用于清洁生产线,这些相同的技术也在上面提到的 NLP 指南中详细描述。正则表达式在替换或删除字符时也很有用:

  • 移除线路信息,例如JON:
re.sub(r'.*:', '', text)
  • 删除括号—从字符行中删除任何舞台方向
re.sub('[\(\[].*?[\)\]]', ' ', text)
  • 删除重音字符,并使用unicodedata库进行规范化
unicodedata.normalize('NFKD', text).encode('ascii', 'ignore').decode('utf-8', 'ignore')
  • 扩展任何缩略词,例如,不要→不要
    这里有一个 python 库,将contractions.py复制到您的工作目录,来自:
    https://github . com/dipanjanS/practical-machine-learning-with-python/

  • (可选):在一个单词被词干化为字典中的一个词根的情况下应用词条解释,例如 is,are → be
    当前没有使用词条解释,因为它不能很好地处理一些单词,例如 Stannis → Stanni

  • 将所有文本转换为小写

text.lower()
  • 删除特殊字符(*、。!?)以及删除数字的选项—默认设置为 false
pattern = r'[^a-zA-Z0-9\s]' if not remove_digits else r'[^a-zA-Z\s]'    re.sub(pattern, '', text)
  • 删除停用词,使用nltk库中的停用词,首先对文本进行标记,将字符串分割成子字符串列表,然后删除所有停用词
stopword_list = stopwords.words('english')    
tokens = nltk.word_tokenize(text)    
tokens = [token.strip() for token in tokens]    
' '.join([token for token in tokens if token not in stopword_list])

这些清洁技术基于几种不同的来源,并且这些步骤有许多变化以及可以使用的其他清洁技术。这些初始清洁步骤已经在这个项目中使用。

3.从图像创建遮罩

基于就职词云,PIL库用于打开图像,从图像创建numpy数组以创建遮罩。

char_mask = np.array(Image.open("images/image.jpeg"))    image_colors = ImageColorGenerator(char_mask)

可选地,numpy阵列可以和wordcloud.ImageColorGenerator一起使用,然后recolor单词云代表图像的颜色,或者其他。这将在下一节中讨论。

在最初将一幅图像作为文字云遮罩进行测试后,图像中的背景产生了太多的噪声,以至于字符的形状没有被很好地定义。为了避免这种情况,移除图像背景并替换为白色背景会很有用。

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

Remove background from image and replace with white background

4.生成单词云

最后一步是使用generate()函数创建单词云。

wc = WordCloud(background_color="white", max_words=200, width=400, height=400, mask=char_mask, random_state=1).generate(text)# to recolour the image
plt.imshow(wc.recolor(color_func=image_colors))

单词云将被图像掩盖,文本的大小将基于词频。

可以调整单词云的参数——尝试增加max_words来查看一些不常用的单词,注意,这应该少于文档中唯一单词的数量。

如前一节所述,recolor步骤是可选的,这里用于表示原始图像颜色。

权力的游戏单词云

对《权力的游戏》角色的图像使用上述步骤,生成的单词云呈现如下:

艾莉亚

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

Arya word cloud

琼恩·雪诺

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

Jon Snow word cloud

丹妮莉丝

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

Daenerys word cloud

达沃斯爵士

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

Ser Davos word cloud

这也被扩展到基于房屋生成单词云:

兰尼斯特家族

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

Lannister word cloud

史塔克家族

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

Stark word cloud

有了这些单词云,项目的最初目标就达到了!

丰富

有几种方法可以改进这些单词云。

  • **常用字:**在所有的汉字书写中,都有一些重复出现的常用字。目前,词云是基于词频生成的,然而,另一种方法是 TFIDF,它基于词在文档中的频率和相对于语料库的频率对词进行加权。或者,可以生成一个自定义停用词表来删除其他常用词
  • 词汇匹配/词干匹配:词汇匹配在上面的例子中没有使用,因为一些《权力的游戏》特有的单词在测试时被缩短了(Stannis → Stanni),然而这确实意味着来自同一个词根的单词没有联系,并且在单词云中出现了几次,例如 say,said。可以使用替代的引理方法或词干技术。
  • **文本清理:**还可以使用进一步的清理或数据准备步骤
  • **单词云功能:**我用不同的单词颜色、背景颜色和单词云参数进行了测试,灰色和黑色背景在这种情况下可以工作,但一些参数可以进一步优化
  • **进一步的文本分析:**从这个数据集中可以得出很多真知灼见。更大的分析范围!

延伸——陌生的事物

通过进一步观察,我最终发现了更奇怪的东西脚本——尽管它们缺少字符行,但数据仍可用于生成单词云……

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

Stranger Things word cloud

摘要

在这篇文章中,我已经完成了生成单词云的基本步骤,这些单词云被一个图像所掩盖。

这只是我尝试单词云的开始!该项目还有很大的发展和改进空间,我希望您能按照步骤使用 word clouds 创建自己的项目!\

感谢您的阅读!如果你喜欢我的文章,那么订阅我的每月简讯,在那里你可以将我的最新文章和顶级资源直接发送到你的收件箱!

你可以在 Medium 上关注我以获取更多文章,在 Twitter 上关注我或者在我的网站上了解更多关于我正在做的事情。

为不在词汇表中(OOV)的单词(如新加坡英语)创建单词嵌入

原文:https://towardsdatascience.com/creating-word-embeddings-for-out-of-vocabulary-oov-words-such-as-singlish-3fe33083d466?source=collection_archive---------7-----------------------

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

Photo by Dmitry Ratushny on Unsplash

介绍

在这篇文章中,我将分享我如何创建用于下游自然语言处理(NLP)任务的新加坡英语单词嵌入。

但是为什么你可能会问?

要理解我做这个任务的动机,你首先需要理解什么是单词嵌入以及它们在 NLP 中的重要性。

谈到自然语言理解(NLU),这需要一台机器来理解人类语言。为了完成这样的壮举,机器需要将语言(用文字书写)转换成最能代表特定单词的含义、关系和上下文的数值。

这些“数值”可以被视为 NLP 中的单词嵌入——单词映射到 n 维空间中的实数向量。

简而言之,想象一个三维窗格(x 轴、y 轴和 z 轴)上的散点图。图上的每个点代表一个英语单词,即“国王”、“王后”。您还会注意到,这些点彼此距离非常近。此外,这些点也离“猫”或“狗”之类的词相当远。

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

Figure 1 — Word Embeddings for “King”, “Queen”, “Cat” and “Dog”. Source: https://arxiv.org/ftp/arxiv/papers/1901/1901.07176.pdf

为了实现这样的情节,单词“国王”、“王后”、“猫”和“狗”被赋予了单词嵌入(X、Y 和 Z 数值),以最好地表示它们之间的关系。

在图 1 中,我们可以看到与人类相关的单词被分组在一起(红色),而与动物相关的单词被分组在一起(蓝色)。为什么?因为生成这些单词嵌入的机器已经通过遍历大型文本语料库的多次迭代学习了这些复杂的关系。它给所有它见过和训练过的单词赋予了数字表示。

这就像一台机器在说:

“哎!我已经多次通读了你的文本语料库,以下是我认为最能代表每个单词的数值!”

作为一个人,我们需要证实这样的说法?一种方法是在向量空间中可视化这些单词,即散点图,以查看这些单词在该窗格中的位置。

如果相关的单词有点像图 1 中那样彼此靠近,那么我们可以验证机器确实已经学习了足够多的知识来将单词表示为数字。

简而言之…

单词嵌入是允许机器**基于上下文理解单词之间的关系或含义的值。**即“国王”和“王后”彼此相似(更接近),而与“猫”和“狗”等词不同(更进一步)。

当然还有比我上面给出的例子更多的单词嵌入,但是…

我想强调的一点是。

机器和数字而不是单词一起工作。单词嵌入很重要,因为它们是单词的数字表示,这是进行任何下游 NLP 任务之前需要的第一步。

自然语言处理任务,如实体提取、文本摘要、情感分析、文本分类、语音转文本、图像字幕、语音转文本以及许多其他下游任务,都需要良好的单词嵌入来获得准确的结果。

到目前为止有意义吗?

既然我们已经了解了单词嵌入及其重要性,那么我们就来简单谈谈新加坡式英语吧。

新加坡式英语?什么是新加坡式英语?

对于我的非新加坡读者来说,“新加坡式英语”本质上是新加坡口语。它是英语、马来语、泰米尔语、普通话和许多其他方言如闽南语的混合体。

我在网上找到的最好的例子之一就是这个。

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

Figure 2 — Example of Singlish

我一直以来最喜欢的新加坡式英语的另一个例子是这个。

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

Figure 3 — The power of “Can”. Source: www.Angmohdan.com

你看,新加坡式英语不仅仅是不同语言的混合。从普通话改编而来的新加坡英语单词的使用可以根据新加坡英语术语的语调改变前一个单词的意思。即“我能吗?”vs“残博?”

在英语中,“Can”这个词就是“能够”。在新加坡式英语中,这个意思根据随后用某种语调说的新加坡式英语术语而变化。

你可以明白为什么在 NLP 中使用新加坡式英语是一件痛苦的事情。

那好吧。

既然介绍已经结束了,让我们进入正题打败匈奴…开个玩笑!(我希望你能从《花木兰》中找到参考文献……)

接下来的几个部分是我所做的事情的基本细节。这可能是也可能不是技术性的,但我会尽力用简单的术语解释我所做的事情。

但首先,总结一下。

摘要

  1. 机器看不懂文字,但看得懂数字。因此,单词嵌入很重要,因为它们是文本的数字表示。
  2. 许多下游 NLP 任务都是从单词嵌入开始执行的。
  3. 新加坡英语是一种非常本地化的语言。据我所知,新加坡英语没有任何现成的单词嵌入。有必要为任何未来的 NLP 作品创建新加坡英语单词嵌入。

方法学

在这一节中,我将首先解释我从哪里得到这些数据。然后,我将谈论用于创建新加坡式英语单词嵌入的模型。之后,我将回顾我的初步发现,我从这些发现中意识到的问题,在最终揭示我的最终结果之前,我是如何纠正这个问题的。

数据收集—硬件区域论坛

这些数据是从我们一直最喜欢的新加坡论坛“硬件区”(【https://forums.hardwarezone.com.sg/】T2)上删除的。这是一个最初以信息技术为导向的论坛,但和所有论坛一样,它已经偏离成为许多新加坡人谈论世界上任何事情的地方。

最精彩的部分?

他们在论坛上大多使用新加坡式英语。非常适合任何深度学习任务。下面是一个线程注释的例子。

['got high ses lifestyle also no use treat chw like a dog if me i sure vote her she low ses man take people breakfast ask people buy ckt already dw pay up tsk tsk tsk\n',
 '                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   children big liao no need scare tio pok\n',
 'she low ses man take people breakfast ask people buy ckt already dw pay up tsk tsk tsk i dont get her thinking actually if she is rich she could even fly over to kl to eat buffet and then fly back in 1 hour dunno why want to save over this kind of small thing to ppl like her like food\n']

这看起来像是蹩脚的英语,但实际上,对于一个新加坡人来说,我们理解这里使用的俚语和英语的隐含意义。

数据收集方面,废弃了 46 个主线程,共有 7,471,930 个条目。以下是按条目分列的线程数量。

Eat-Drink-Man-Woman                                    1640025
Travel and Accommodation                                688253
Mobile Communication Technology                         582447
Mass Order Corner                                       574927
MovieMania                                              451531
Gaming Arena                                            426976
Campus Zone                                             322146
General Merchandise Bazaar                              286604
Money Mind                                              264523
Internet Bandwidth & Networking Clinic                  243543
Music SiG                                               227198
Hobby Lovers                                            224994
Headphones, Earphones and Portable Media Devices        206141
Notebook Clinic                                         184116
HomeSeekers and HomeMakers                              153683
Apple Clinic                                            139810
Hardware Clinic                                         133421
Cars & Cars                                             115286
The Tablet Den                                          108793
Fashion & Grooming                                       98211
Electronics Bazaar                                       75192
Degree Programs and Courses                              49734
Football and Sports Arena                                47769
Software Clinic                                          43553
Health & Fitness Corner                                  21665
The "Makan" Zone                                         21358
National Service Knowledge-Base                          16545
Current Affairs Lounge                                   16259
Home Theatre & Audiophiles                               14888
The House of Displays                                    13987
Employment Office                                        12146
Other Academic Concerns                                   9927
Tech Show Central (IT Show 2018)                          9895
Parenting, Kids & Early Learning                          9756
Pets Inner Circle                                         6525
Wearable Gadgets and IoT                                  5735
The Book Nook                                             5238
Digital Cameras & Photography                             4714
Ratings Board                                             3858
IT Garage Sales                                           3549
Diploma Programs and Courses                              2348
Certified Systems, IT Security and Network Training       1798
Post-Degree Programs & Courses                            1724
Online Services & Basic Membership Support/Feedback        876
Design & Visual Art Gallery SiG                            246
HardwareZone.com Reviews Lab (online publication)           18

手动审查每个线程的数据质量后,一些线程(如“差旅和住宿”)主要用于销售,因此被排除在分析之外。

我最终只使用了来自“MovieMania”的数据,其中不包括任何形式的广告,也不包括线索中的销售。我还认为 451,532 个条目足以训练合适的单词嵌入。

这个帖子中每个条目的平均长度是 27.08 个单词。这给了我 12,675,524 个单词的语料库。就使用的独特词汇数量而言,这个数字下降到 201,766 个。我根据频率保留了前 50,000 个单词,并用“未知”标记来标记剩余的单词进行训练。

保留不常用的单词用于训练是没有意义的。如果这个单词只出现了几次,就没有学习的机会。因此,我用一个“未知”标记替换了所有不常用的单词。

我还通过简单地删除所有形式的标点符号和通过小写来标准化大小写来清理数据。

技术总结:

字数:12675524
句数:427735
平均。每句话字数:27.05
使用的独特词汇字数:5 万

既然数据已经出来了,下一部分将讨论用于训练单词嵌入的实际模型。

介绍跳跃图!

skip-gram 模型是一种无监督的机器学习技术,用于查找与给定单词最相关的单词。

以这个短语为例,

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

Figure 4 — Skip-gram example

跳过语法模型试图预测给定输入单词的上下文单词。在这种情况下,给定单词“狐狸”,预测“快”、“棕色”、“跳跃”和“结束”。

现在想象一下,模型从硬件区扫描我的整个训练语料库。对于每个句子(427,735 个句子),遍历每个单词,提取出它的上下文单词,并使用输入单词来预测这些上下文单词。

还计算每个句子的误差函数。该模型的目标是通过缓慢调整模型内的权重,通过多次迭代来最小化该误差函数。

我重复这种“学习”,直到误差函数开始稳定,然后用模型作为我的单词嵌入来提取权重。

我上面试图解释的,本质上是神经网络是如何工作的。从体系结构上来说,它看起来会像这样:

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

Figure 5- Skip-Gram Architecture.

跟了这么远?

太好了!在得出结果之前,让我们回顾一下模型构建过程中的一些技术规范。

技术规格: Context size = 3
学习率= 0.025
学习率衰减= 0.001
历元数= 25
字数= 100
负样本数= 3
总训练时间= 17 小时 05 分钟(每个历元约= 41 分钟)

对于那些想知道这些技术术语指的是什么的人来说,上下文大小指的是要预测的单词数,即“quick”、“brown”、“jumps”、“over”是 2 的上下文大小,即输入单词前两个单词,“Fox”后两个单词。

学习率衰减指的是模型如何在迭代过程中调整其权重。即每次迭代学习了多少。

历元指整个训练集要循环多少次。例如,在我的训练集中有 427,735 个句子,我循环了 25 次。

单词尺寸是指最能代表一个单词的数值个数。在我介绍的例子中,我用了 3 个维度来保持简单易懂。事实上,我们可以到达 300 个维度。

负样本量是一个来自负采样的参数,负采样是一种用于训练机器学习模型的技术,与正观测相比,机器学习模型通常具有更多的负观测。回想一下,我保留了 50,000 个词汇以供使用。

如果我用“狐狸”来预测“快”,只有一个正确答案,而有 49,999 个错误答案。获得“快速”正确预测的概率会低得惊人。

因此,为了加快学习过程,使用负采样来减少负水平的数量。即,我只查看 3 个随机错误答案,而不是查看 49,999 个错误答案。因此,阴性样本数= 3。

还和我在一起吗?太棒了。让我们继续吧!

初步结果

这是第一次尝试为新加坡式英语生成单词嵌入的结果。

你在下面看到的是词对之间的相似性得分(0 到 1)和最接近感兴趣的词的前 10 个词。数字越高,单词在上下文方面越相似。

在研究新加坡英语单词之前,作为初步测试,我决定看看像“她”对“她”和“他的”对“他”这样的单词的分数。如果这些分数不高,我会认为模型训练得不够好。

令人欣慰的是,分数相当高,相当不错。

Similarity between 'her' & 'she': 0.9317842308059494
Closest 10:
her 0.9999999999999994
she 0.9317842308059496
who 0.8088322989667506
face 0.7685887293574792
and 0.731550465085091
hair 0.7196624736651458
shes 0.7191209881379563
when 0.7119862209278394
his 0.7107795929496181
that 0.7091856776526962
********************************************************
Similarity between 'his' & 'he': 0.897577672968669
Closest 10:
his 1.0
he 0.8975776729686689
him 0.8446763202218628
who 0.775987111217783
was 0.7667867138663951
that 0.7528368024154157
father 0.749632881268601
son 0.7281268393201477
become 0.7264880215455141
wife 0.711578758349141
********************************************************
Similarity between 'jialat' & 'unlucky': 0.011948430628978856
Closest 10:
jialat 1.0
sia 0.8384455155248727
riao 0.8266230148176981
liao 0.8242816925791344
sibei 0.814415592977946
hahaha 0.8064565592682809
ya 0.8045512611232027
meh 0.7954521439129846
lol 0.7936809689607456
leh 0.7920613014175707
********************************************************
Similarity between 'jialat' & 'bad': 0.6371130561508843
Closest 10:
bad 1.0
quite 0.8823291887959687
good 0.8762035559199239
really 0.8758630577100476
very 0.8731856141554037
like 0.8728014312651295
too 0.8656864898051815
damn 0.8599010325212141
so 0.8486273610657793
actually 0.8392110977957886
********************************************************
Similarity between 'bodoh' & 'stupid': 0.1524869239423864
Closest 10:
bodoh 0.9999999999999998
628 0.4021945681425326
u4e3au56fdu5148u75af 0.3993291424102916
beck 0.39461861903538475
recieve 0.39110839516564666
otto 0.3839416132228821
gaki 0.34783948936473097
fapppppp 0.3418846453140858
bentley 0.3344963328126833
hagoromo 0.3331640207541007
********************************************************
Similarity between 'bah' & 'ba': 0.5447425470420932
Closest 10:
bah 0.9999999999999998
lei 0.7051290703273838
nowadays 0.698360482336586
dun 0.6968374466521237
alot 0.6767383433113785
type 0.6745085658120278
cos 0.6711909808612231
wat 0.6682283480973521
ppl 0.6675756452507112
lah 0.6671682261049516
********************************************************
Similarity between 'lah' & 'la': 0.8876189066755961
Closest 10:
lah 1.0
meh 0.8877331822636787
la 0.8876189066755962
dun 0.8865821519839381
mah 0.8793885175949425
leh 0.8723455556110296
cannot 0.8686775338961492
ya 0.8661596706378043
u 0.8549447964449902
wat 0.8542029625856831
********************************************************
Similarity between 'lah' & 'leh': 0.8723455556110294
********************************************************
Similarity between 'lah' & 'ba': 0.6857482674200363
********************************************************
Similarity between 'lah' & 'lor': 0.8447135421839688
********************************************************
Similarity between 'lah' & 'hor': 0.722923046216034
********************************************************
Similarity between 'lor' & 'hor': 0.6876132025458188
Closest 10:
lor 1.0
u 0.8925715547690672
cannot 0.865412324252327
dun 0.8509787619825337
leh 0.8508639376357423
lah 0.8447135421839689
ya 0.8438741042009468
la 0.8403252240817168
meh 0.8356571743730847
mah 0.8314177487183335
********************************************************
Similarity between 'walau' & 'walao': 0.4186234210208167
Closest 10:
walau 1.0
nv 0.6617041802872807
pple 0.6285030787914123
nb 0.6248358788358526
la 0.6207062961324734
knn 0.6206045544509986
lah 0.6158839994483083
lo 0.6102554356797499
jialat 0.6079250154571741
sibei 0.6076622192051193
********************************************************
Similarity between 'makan' & 'eat': 0.6577461668802116
Closest 10:
makan 1.0
jiak 0.7007467882204779
go 0.6911439090088933
pple 0.65857421561786
eat 0.6577461668802115
food 0.6575154915623017
kr 0.6545185140294344
sg 0.6473315303433985
heng 0.6422265572697313
beo 0.6354614594882941
********************************************************
Similarity between 'makan' & 'food': 0.6575154915623018
********************************************************
Similarity between 'tw' & 'sg': 0.7339666801539345
Closest 10:
tw 0.9999999999999997
tiong 0.7723149794376185
sg 0.7339666801539344
lidat 0.7330705496009475
hk 0.7258329008490501
taiwan 0.7195021043855226
tiongland 0.7171170137971364
pple 0.7130953678674011
yr 0.7017495747955986
mediacorpse 0.6954931933921777
********************************************************
Similarity between 'kr' & 'sg': 0.7889688950703608
Closest 10:
sg 1.0
go 0.7940974860875252
kr 0.7889688950703608
tiongland 0.7675846859894958
ongware 0.7674045119824121
yr 0.7584581119582794
pple 0.7536492976456339
time 0.7533848231714694
buy 0.751509500730294
tix 0.743339654154326
********************************************************

从上述结果中,我想指出一些有趣的发现。

总的来说,我认为这个模型在理解新加坡英语单词方面已经学得很好,表现也相当不错。

不是最好的,但还过得去。

毫不奇怪,模型已经了解到“马侃”(马来语,意为“吃”),“食物”和“吃”被发现是相似的。但有趣的是,“Jiak”这个词——方言中“吃”的意思,常用于新加坡式英语句子中——被选中,并被认为与“食物”、“马侃”和“吃”相似。

在我看来,这位模特确实很好地学会了一些新加坡英语单词。

下一个有趣的结果来自于国家名称的缩写。当人们阅读结果时,我们知道“sg”指的是“新加坡”,“kr”-韩国,“tw”-台湾,“hk”-香港。然而对于一台机器来说,这并不那么简单,模型并没有这些先验知识。然而,它设法将这些术语组合在一起。

确实非常有趣!

这是另一个验证点,告诉我该模型在新加坡英语单词上训练得相当好。

现在,有一种方法可以帮助我们在向量空间中可视化单词,而不仅仅是盯着数字。这被称为 T 分布随机邻居嵌入(TSNE)。

TSNE 可以粗略地看作是一种将高维数据可视化的降维技术。即 100 维的单词嵌入。其思想是以尊重点之间相似性的方式将高维点嵌入到低维中。

用英文把 100 个维度转换成 2 或 3 个维度,尽可能保留嵌入的信息。

如果我在上面的一些结果上运行 TSNE (n=2 维),并在散点图上显示它,它将看起来像这样:

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

Figure 6 — TSNE results displayed on a scatter plot

不算太差的结果。

虽然上述结果看起来很有希望,但仍有一些问题需要解决。

我只是在回顾结果时才意识到这一点。下一节将进一步解释。

结果有问题

首先,正如你所看到的,像“lah”,“lor”,“meh”这样的新加坡式英语单词看起来很相似,但是…

那又怎样?它实际上意味着什么?!

想了想,也不完全有用。

新加坡式英语短语通常以双字母(2 个单词)的形式出现,它实际上概括了使用它的上下文的意思。一个很好的例子是图 3——“能”的力量。“我能吗?”vs“残啦!”有着非常不同的含义。

如果我们把“can”和“meh”这两个词分开来看,这个意思就失去了。

因此,单独拥有单词“meh”和“lah”的向量表示在这里并不完全有用。

为了解决这个问题,我需要一种方法将这些单词组合在一起。unigrams 上的 Skip-Gram 火车,是的。但是如果我可以先把这些二元模型转换成一元模型呢?即“Can meh”->“Can _ meh”*注意下划线。

第二个问题没有第一个严重,但值得花些时间来讨论。

这是 TSNE 等降维技术的固有问题。你看,从 100 维缩减到 2 维的信息损失是不可避免的。尽管我喜欢视觉效果,但我意识到我只能通过看数字而不是视觉效果来真正理解结果。

这里没什么好解决的。

只是精神食粮。

现在让我们来看看我解决第一个问题的尝试。

问题的纠正:将二元模型转换为一元模型——引入逐点相互索引(PMI)

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

Figure 7 — Point-wise Mutual Index (PMI) formula

在意识到新加坡式英语的问题后,我需要一种方法将我的双字母词转换成单字母词,同时保留这些词的信息或意思。

我可以通过计算语料库中所有可能二元模型的 PMI 来做到这一点。

例如,图 7 中的公式表示,取成对单词(即“can meh”)出现的概率的对数,除以每个单词出现的概率。

我的流程分解如下:

如果 x = can,y = meh,

  1. 统计“can meh”一起出现的次数。
  2. 数一数“can”单独出现的次数。
  3. 数一数“meh”单独出现的次数。
  4. 应用 PMI,得到一个分数。
  5. 设置一些阈值参数。如果分数高于阈值,则将所有出现的“can meh”转换为“can_meh ”,即,将二元语法转换为一元语法。
  6. 重新训练整个跳格模型。

从 1 到 5 的步骤实际上就是构建一个短语模型

所以…我开始寻求重新训练我的 17 小时模型…

我计算了所有可能二元模型的 PMI 分数,并设置了一个阈值变量。我实际上使用了上述 PMI 公式的标准化版本进行计算,但概念是相同的。

归一化 PMI 短语模型技术规范:

  1. 最小字数= 5
  2. 阈值= 0.5(范围从-1 到 1)
['as we are left with just 2 days of 2017 hereu2019s a song for everyone here edit to weewee especially lol',
 'good_morning click here to download the hardwarezone_forums app']['wah_piang . why every time lidat one . siao liao can meh . wah_lau . can lah . can la . of course medicated_oil . can anot']

正如您所看到的,阈值影响了有多少二元模型被转换为一元模型。我没有成功地将“can meh”的二元模型转换为二元模型,因为如果我将阈值设置得更低,许多其他非二元模型相关的单词将开始转换为二元模型。

可悲的是,这里有一个权衡。

新加坡英语单词嵌入的最终结果

在解释了二元模型之后,我重新训练了这个模型(现在我花了 18 个小时来训练),得到了下面的结果。

注意有多少不相关的二元模型变成了二元模型?即“为了她”,“和她在一起”。这就是我所说的建模步骤中的权衡。

因为所有这些不相关的二元模型,一些分数下降了。

Similarity between 'her' & 'she': 0.8960039000509769
Closest 10:
her 1.0
she 0.8960039000509765
when_she 0.7756011613106286
she_is 0.7612506774261273
with_her 0.7449142184510621
who 0.7348657494449988
for_her 0.7306419631887822
shes 0.7279985577059225
face 0.7192153872317455
look_like 0.718696491400789
********************************************************
Similarity between 'his' & 'he': 0.8129410509281912
Closest 10:
his 1.0
he 0.8129410509281914
him 0.804565895231623
he_was 0.7816885610401878
when_he 0.7747444761501758
that_he 0.7724774086496818
in_the 0.7622871291423432
himself 0.7611962890490288
was 0.7492507482663726
with_his 0.7241458127853628
********************************************************
Similarity between 'jialat' & 'unlucky': 0.1258840952579276
Closest 10:
jialat 0.9999999999999996
den 0.7104029620075444
liao 0.7050826631244886
chiu 0.6967369805196841
heng 0.686838291277863
hahaha 0.6860075650732084
riao 0.6810071447192776
la 0.6804775540889827
le 0.676416467456822
can_go 0.6756005150502169
********************************************************
Similarity between 'jialat' & 'bad': 0.4089547762801133
Closest 10:
bad 1.0
but 0.8388423345999712
good 0.8244038298175955
really 0.8192112848219635
i_think 0.7970842555698856
very 0.7965053100959192
like 0.785966214367795
feel 0.783452344516318
too 0.7788218726013071
i_feel 0.7721110713307375
********************************************************
Similarity between 'bah' & 'ba': 0.5793487566624044
Closest 10:
bah 1.0
say 0.6595798529633369
lah 0.6451347547752344
dun 0.6449884617104611
sure 0.627629971037843
bo_bian 0.6251418244527653
this_kind 0.6223631439973716
ppl 0.6196652346594724
coz 0.61880214034487
mah 0.6146197262236697
********************************************************
Similarity between 'lah' & 'la': 0.8863959901557994
Closest 10:
lah 0.9999999999999998
la 0.8863959901557996
meh 0.8739974021915318
mah 0.8641084304399245
say 0.8589606487232055
lor 0.8535623035418399
u 0.8304372234546418
leh 0.8275930224011575
loh 0.8189639505064721
like_that 0.8170752533330873
********************************************************
Similarity between 'lah' & 'leh': 0.8275930224011575
********************************************************
Similarity between 'lah' & 'ba': 0.7298744482101323
********************************************************
Similarity between 'lah' & 'lor': 0.8535623035418399
********************************************************
Similarity between 'lah' & 'hor': 0.7787062026673155
********************************************************
Similarity between 'lor' & 'hor': 0.7283051932769404
Closest 10:
lor 1.0
u 0.8706158009584564
lah 0.8535623035418399
mah 0.8300722350347082
meh 0.8271088070439694
or_not 0.8212467976061046
can 0.8202962002027998
la 0.8136970310629428
say 0.8119961813856317
no_need 0.8113510524754526
********************************************************
Similarity between 'walau' & 'walao': 0.37910878579551655
Closest 10:
walau 0.9999999999999998
liao_lor 0.595008714889509
last_time 0.5514972888957848
riao 0.5508554544237825
no_wonder 0.5449206686992254
bttorn_wrote 0.5434895860379704
hayley 0.5418542538935931
y 0.5415132654837992
meh 0.5397241464489063
dunno 0.5377254112246059
********************************************************
Similarity between 'makan' & 'eat': 0.6600454451976521
Closest 10:
makan 0.9999999999999998
go 0.7208286785168599
den 0.697169918153346
pple 0.6897361126052199
got_pple 0.6756029930429751
must 0.6677701662661563
somemore 0.6675667631139202
eat 0.6600454451976518
lo 0.6524129092703767
there 0.649481411415345
********************************************************
Similarity between 'makan' & 'food': 0.4861726118637594
********************************************************
Similarity between 'tw' & 'sg': 0.6679227949310249
Closest 10:
tw 1.0
tiong 0.7219240075555984
taiwan 0.7034844664255471
hk 0.7028979577505058
tiongland 0.6828634228902605
mediacock 0.6751283466015426
last_time 0.6732280724879228
sg 0.6679227949310248
this_yr 0.6384487035493662
every_year 0.6284237559586139
********************************************************
Similarity between 'kr' & 'sg': 0.7700608852122885
Closest 10:
sg 1.0
in_sg 0.8465612812762291
kr 0.7700608852122885
pple 0.7599772116504516
laio 0.7520684090232901
go 0.7509260306136896
sure 0.7156635106866068
come 0.7116443785982034
tiongland 0.7015439847091592
ongware_wrote 0.6974645318958415
********************************************************
Closest 10:
wah_piang 1.0
tsm 0.4967581460786865
scourge_wrote 0.4923443232403448
aikiboy_wrote 0.4887014894882954
sian 0.4871567208941815
ah_ma 0.48058368153798403
lms 0.4790804214522433
ruien 0.47420796750340777
xln 0.46973552365710514
myolie 0.4682823729806439
********************************************************

简而言之,上面的结果比以前的结果更糟糕。

我认为这个问题来自于数据的缺乏。如果我有更多人们使用“can meh”或“can lah”的例子,短语模型会在没有我设置低阈值的情况下挑选出这些二元模型。0.5 门槛在我看来真的很低。

我抓到了太多的假阳性。

垃圾进,垃圾出,对吗?这正是这里发生的事情。

未来作品

正如你所想象的,我仍然有办法调整我的模型,为我未来的作品获得像样的新加坡式英语单词嵌入。

我会有不同的做法:

  1. 重新编写我的脚本来运行分布式。或者更好的是,在 GPU 中运行的代码。这将允许我在更大的语料库上运行,即整个硬件区域,而不仅仅是其中的一个线程。
  2. 训练一个更好的短语模型。即 PMI 部分。

现在,我将为第一个模型保留单词 embeddings。

编辑:如果你对如何处理语料库中的拼写错误、缩写或其他 OOV 单词感兴趣,我已经写了另一篇关于它的文章这里

结尾注释

我确实从这个练习中学到了很多,我希望通过我分享我的方法、思维过程和结果,你们也能够用你们各自的当地语言做同样的事情。

就这样,再见了,朋友们!

希望你和我一样喜欢阅读这篇文章!

如果这篇文章对任何人有帮助,请随意分享!

如果您正在寻找 NLP 数据集,请点击这里 查看我创建的精选列表!😃

LinkedIn 简介:蒂莫西·谭

创建您独特的图像数据集

原文:https://towardsdatascience.com/creating-your-unique-image-data-set-90f7d58d3a4d?source=collection_archive---------25-----------------------

使用谷歌视觉和谷歌照片创建我自己的数据集

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

Photo by Alice Achterhof on Unsplash

在进行我的第一个 ML 项目时,我需要一个特定的数据集。我用我两个女儿的面部图像做了一个二元分类模型。

我开始手工裁剪我的私人照片目录。这既乏味又怪异(坐在会议上剪小女孩的照片)

在网上搜索人脸识别和裁剪代码,我找到了不同的解决方案。但是因为我的主要目标是体验机器学习,所以我寻找一种更优雅的方式——一种利用 ML 能力的方式。

谷歌视觉 API 是我的答案。对我来说,这是一个有点棘手的开始,所以我想我应该写下我的经历。

如果你想直接进入代码,它就在这里

从阴霾的心到阴霾的心

为了使用谷歌云平台(GCP),我必须设置一些小的环境先决条件:

  1. 打造一个 GCP 项目——小菜一碟。
  2. 启用视觉应用编程接口 —简单易行。
  3. 启用计费 —无需动脑筋。
  4. 创建服务帐户 —漫步公园。

太好了,一次性搞定。它也可能在未来的项目中有用。时间花得值。

一个有远见的合作实验室

我喜欢使用 google colab,这是一个云中的 jupyter 笔记本,甚至可以给你一个免费的 GPU。它有 Python 2 或 3 和一堆原生预装库,如果你不知道,看看这篇可爱的文章。让我们开门见山:

  1. 安装视觉

2.安装 google drive:

3.通过设置环境变量 GOOGLE_APPLICATION_CREDENTIALS,为您的应用程序代码提供您之前获得的身份验证凭证。你也可以使用代码来完成,但我发现这种方式更容易,我已经将文件上传到我的驱动器,并且我正在以这种方式使用它,而不是直接上传到 colab。

现在是有趣的部分。

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

The fun part

像热的一样修剪它

vision 客户端 API 很大,所以我将把重点放在这个任务所需的最低限度上。我的裁剪代码是来自 vision 教程网站的两个例子的合并。人脸检测教程裁剪提示教程

我们先来看看人脸检测代码。这非常简单:我们创建一个服务对象,然后从 Image 资源请求 face_detection 注释。

返回值是一个面标注对象的数组。这些对象包含大量的数据,但是我们感兴趣的是BoundingPoly对象(有两个版本:bounding poly 和 fdBoundingPoly,它是多边形的一个更紧凑的版本,只有皮肤)。

现在你已经有了检测到的人脸的坐标,你可以做任何你想做的事情,在它们周围画一个矩形,裁剪它们或者添加胡子。

我们在这里有一个任务,所以让我们看看作物代码。我们使用枕头库根据我们从检测方法中得到的顶点来裁剪面,并将每个面保存在不同的文件中。

用照片标记照片

创建我们的数据集现在很容易,我们需要做的就是将一个装满图片和代码的库流式传输,我们很快就会有一个很好的数据集。

但是,唉,许多不同的面孔。我的照片不仅仅是我孩子的照片。有时候一张友好的脸是你最不想看到的。我们需要把小麦从谷壳中分离出来等等。

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

I just need this one.

让谷歌再一次帮助我们。使用 Google 相册强大的 ML 功能,我们可以轻松地标记我们的数据。请注意,我将所有裁剪的面保存到了我驱动器上的一个文件夹中。这样,照片可以自动索引并标记它们。

例如,如果我只想要我儿子的微笑,我只需要在搜索框中搜索组合。

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

name + smile

就这样,你现在可以选择所有带标签的图片并一次性下载。瞧——很快(很短的时间)就有了一组带标签的图像。

你可以很容易地安排它,并把它送给 Keras ImageDataGenerator 例如

基于主题词表征的句子嵌入的创建

原文:https://towardsdatascience.com/creation-of-sentence-embeddings-based-on-topical-word-representations-d325d50f99e?source=collection_archive---------16-----------------------

走向普遍语言理解的途径

我研究单词和句子嵌入已经一年多了,最近还写了这方面的硕士论文。我现在正在展示的成果也在这里发表了,并且是与 SAP列支敦士登大学合作的成果。在下面的博文中,我不会详细解释嵌入。这篇文章是概念性的,总结了我的发现。

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

Photo by Romain Vignes on Unsplash

基础

单词向量是高维空间中在语义上表示相应单词的位置。在那个空间里,意思相近的单词彼此靠得更近。因此,同义词具有几乎相同的向量,并且彼此靠近。

相同的概念可以应用于句子,而相似的句子在高维空间中彼此靠近。

为了创建单词向量,存在几种方法。两个非常常见的算法是 Word2Vec [2]和 GloVe [3]。两者都根据单词出现的上下文将单词编码成任意维度。对于 Word2Vec,上下文是周围单词的窗口。对于 GloVe,它是整个句子或文档。

因为一个单词是通过拼写来识别的,所以每个单词只存在一个向量。使用这些方法,同形异义词,即拼写相同但意义不同的词,不会被认为是彼此不同的。因此,当在烹饪食谱中谈论苹果时,如果在大型和多样化的语料库上训练,水果的相应词向量将引入关于技术公司的不适当的知识。

脸书研究中心的一个句子嵌入器,叫做 infer sent【2】,使用了 GloVe,因此也忽略了同形异义词。这种无知方法的使用也给句子向量引入了不适当的知识。因此,我们创造了一种新的方法来解决这个问题。

建议

我们建议使用能够区分同形异义词的话题感知词向量,而不是使用无知的和已经训练好的手套向量。我们的工作面向主题词嵌入论文[3],但稍微修改了他们的方法。

主题感知词向量是使用 Word2Vec 创建的。但是在 Word2Vec 运行训练语料库之前,我们通过使用带有 Gibbs 采样的 LDA [4]主题建模器对其进行了修改。

LDA 用于根据文档中出现的单词,在给定数量的主题中对文档进行聚类。一个很好的副作用是,LDA 不仅给整个文档分配主题,而且给所有单个单词分配主题,然后使用这些单词来区分文档的主题。下面的例子展示了一个语料库经过 LDA 处理后的样子。

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

LDA assigns topics to words based on their surroundings

因此,我们不再有常用词,而是包括主题的新伪词,例如 apple:1,其中 1 是主题“水果”的 ID。这些新单词充当我们的数据,我们从这些数据中创建单词向量。因此,对于苹果的每个版本——apple:1,apple:2 等等——我们都有自己的向量,而不是只有一个。

我们有两种不同的方法从前面提到的伪单词中创建单词向量…

整体单词嵌入

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

The vectors for apple:0 and apple:1 do not share any information.

这种创建主题词向量的方式简单地将伪词视为与具有相同词的其他伪词不相关的完整词,例如,apple:1 和 apple:2 被认为没有任何共同点。这是实现起来最简单、最快速的方法,因为大多数 Word2Vec 库只是简单地获取这个转换后的文本,并学习每个单词(这里是每个伪单词)的单词向量。

串联单词嵌入

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

The vectors for apple:0 and apple:1 share a common vector for apple (black) and have a appended topical vector for topic 0 (blue) and topic 1 (green), respectively.

另一种方法是连接两个向量,一个单词和一个主题向量,以创建主题单词向量。单词向量是通过 Word2Vec 在原始的、无差别的数据集上学习的。然而,主题向量需要一个更复杂的过程。我们提出的所有不同方法都在[1]中进行了描述。最有希望的是使用加权平均值(也称为 Phi 方法)。

加权平均方法获取词汇表中所有单词的向量,并对它们进行平均,以生成主题向量(向量的附加部分)。在平均之前,每个单词向量被加权一个关于该单词对于相应主题的重要性的数字。这个数字是一个介于 0 和 1 之间的值。对于一个主题,所有的重要性数字总和约为 1。这些数字实际上是概率 p(w|t) 告诉我们一个单词在一个主题中被提及的可能性。它们是在训练 LDA 时计算的。

示例:想象一个语料库,其中包含词汇{“apple “,” pie “,” computer”},主题{“fruits “,” technology”},训练词向量{“apple”: [1,0,0]," pie": [0,1,0]," computer": [0,0,1]},以及概率{“fruits”: [0.5,0.5,0.0]," technology": [0.5,0.0,0.5]}。主题向量的计算如下。v(“水果”)= v(“苹果”)*0.5 + v(“馅饼”)*0.5 + v(“电脑”)*0.0 = [0.5,0.5,0.0]。v(“科技”)= v(“苹果”)*0.5 + v(“馅饼”)*0.0 + v(“电脑”)*0.5 = [0.5,0.0,0.5]。因此,主题“水果”中单词“苹果”的向量是[1.0,0.0,0.0,0.5,0.5,0.0],主题“技术”中的向量是[1.0,0.0,0.0,0.5,0.0,0.5],而苹果的基本向量分别与“水果”和“技术”的主题向量连接。

实验

为了对主题和非主题版本的推断方法进行公平的比较,我们创建了一个基线模型,它是一个使用 Word2Vec 单词嵌入的推断模型,该单词嵌入是我们在训练主题单词嵌入的相同数据上创建的。然后将使用这些主题词向量作为基础的主题版本的推断与基线模型进行比较。这确保了在实验开始之前,许多其他的不确定性被消除。

对于基线和局部模型都获得了以下结果:

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

BASELINE vs. Topical versions — bold is best for the respective task, underlined is better than baseline

如第一个表所示,基线模型在有关联任务(蓝色背景)时明显更好。但是,对于分类任务,主题区分的版本显示出优势。在 9 个分类任务中的 7 个中,我们的主题版本超过了基线。这有力地证明了主题区分确实提高了分类任务的性能。

此外,我们通过向单词向量添加主题部分,扩展了原始推理的手套模型,甚至可以超过最先进的结果:

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

BASELINE vs. original InferSent (Facebook) vs. extended (topical) GloVe — bold is best for the respective task

即使扩展模型(1hot 和 Phi)采用第一个表中较小数据集训练的主题向量,结合预训练的手套向量,它们也能够在某些任务中取得比脸书的原始推断模型更好的结果。

结论

通过我们进行的实验,有可能表明词向量中的歧义是有问题的,并且降低了大多数分类任务的性能。为了解决真正的机器文本理解,还需要更多的研究。然而,该项目表明人类语言具有更高的复杂性,并为进一步的文本嵌入研究提供了方向。

在从事这个项目的过程中,一些技术,如 ELMo [5]和 BERT [6]已经发布,它们可以创建上下文单词表示。这也是正确理解文本需要语境的证据。

参考

[1] Wenig,P. (2018)。基于主题词表征的句子嵌入的创建。https://doi.org/10.13140/rg.2.2.10288.00007

[2]t .米科洛夫,陈,k .,科拉多,g .,&迪安,J. (2013 年)。向量空间中单词表示的有效估计。ArXiv:1301.3781【Cs】。从 http://arxiv.org/abs/1301.3781取回

[3]j .潘宁顿、r .索彻和 C. D .曼宁(2014 年)。GloVe:单词表示的全局向量。在自然语言处理中的经验方法(EMNLP) (第 1532–1543 页)。借鉴于http://www.aclweb.org/anthology/D14-1162

[4] Conneau,a .,Kiela,d .,Schwenk,h .,Barrault,l .,和 Bordes,A. (2017 年)。来自自然语言推理数据的通用句子表示的监督学习。 arXiv 预印本 arXiv:1705.02364 。从 https://arxiv.org/abs/1705.02364取回

[5]刘,杨,刘,钟,蔡东生,孙,米(2015).主题词嵌入。在 AAAI (第 2418–2424 页)。检索自http://www . aaai . org/OCS/index . PHP/AAAI/aaai 15/paper/download/9314/9535

[6]布雷博士、Ng、A. Y .、乔丹博士(2003 年)。潜在狄利克雷分配。

[7] Peters,M. E .,Neumann,m .,Iyyer,m .,Gardner,m .,Clark,c .,Lee,k .,& Zettlemoyer,L. (2018)。深层语境化的词语表达。ArXiv:1802.05365【Cs】。从 http://arxiv.org/abs/1802.05365取回

[8] Devlin,j .,Chang,m-w .,Lee,k .,& Toutanova,K. (2018 年)。BERT:用于语言理解的深度双向转换器的预训练。ArXiv:1810.04805【Cs】。从 http://arxiv.org/abs/1810.04805取回

创造性自动化是新的媒介

原文:https://towardsdatascience.com/creative-automation-is-the-new-medium-20935d9fb6ed?source=collection_archive---------28-----------------------

在自动化焦虑的新浪潮中,创意人员开始意识到自动化提高效率的潜力,一些人利用技术创造新的表达形式,反映数字时代及其所有可能性。

自动化创造力

近年来,我们已经看到人工智能能够创造出值得在主流画廊展示的艺术;我们已经看到他们的画被佳士得以高达 432,500 美元的价格拍卖掉,我们也读过他们的获奖小说讲述了一个机器人决定开始写作的那一天(谁不想看呢?).创造性自动化的这些新进展创造了一种独特的“自动化焦虑”,将人类创造力的价值置于其中心——如果人工智能可以创造艺术,那么我们作为有意识的智能生物的价值还剩下什么?

目前,许多创意专业人士认为,创意自动化只会有助于而不是有害的,尤其是艺术家和设计师经常发现自己必须完成的重复过程。在 Adobe 委托的一份 2018 报告中,他们发现超过一半的创意专业人士受访者事实上对人工智能和机器学习能够给他们的创意过程带来什么非常感兴趣,只有 12%的人声称完全不感兴趣。Adobe 人工智能战略发展高级经理克里斯·达菲(Chris Duffey)在接受 CMO.com 采访时说:“就在几个月前,创意人员还在观望。”。“今天,他们意识到人工智能存在于他们已经在使用的许多技术中,它让事情变得比以前更直观。”

Duffey 认为,通过自动化阴影背景、标记文件和一般组织等日常任务,创意专业人士将“能够继续发展——向新的和更复杂的创意学科发展,如 3D 和沉浸式设计,并在原创性和破坏性思维方面取得新的突破。”

尽管人工智能和计算机艺术正在引发关于人类创造力是否可以被取代的讨论,但重要的是要记住,当今大多数创造性自动化工具最常被用于非创造性能力。虽然计算机可以记忆和处理比人脑多得多的信息,但它们并不真正理解它们为什么要做这些事情,也不理解自由意志的概念。尽管它们很快,但 AI 没有认知、意识,也没有同理心来做出人类定期做出的相同决定。

人工智能的发展还有很长的路要走,但计算机算法不太可能在短期内取代我们的创造力和表达能力。相反,在创造力的世界里,机器的价值将是尽可能地补充人脑,而不是取代它。

前面提到的 Adobe 报告的主要作者 Andreas Pfeiffer 同样认为,“创造力不仅仅是你创造了什么,而是你为什么创造它,”而自由艺术总监 Christoph Gey 解释道:“不是因为你知道工具,你才是设计师。”“自动化”这个词有完全取代工作的含义,但它实际上是一种和其他技术一样的技术:它旨在通过加快我们工作中看似平凡和重复的部分,给我们更多的时间。毕竟,就其能力和命令而言,人工智能仍然是由我们设计的,它将帮助我们做我们需要帮助做的任何事情,但它将无法实现真正的人类创造力,这种创造力是由自然的必要性产生的(即。冲动和决策)、经验和情绪。

电脑音乐与电脑辅助音乐

虽然人工智能确实渗透到许多创作领域,但它在音乐领域表现得最为明显。还记得 Spotify 的“假艺人”争议吗?Spotify 被指责为了支付更低的版税而提供假冒艺术家创作的歌曲。据报道,从那时起,这些冒牌艺术家已经在积累了超过 1 亿次的播放量,每个月大约有 100 万的听众。因此,钢琴乐器和爵士乐在这些播放列表中卷土重来,但社区怀疑(并暗示)没有人在另一端接受表扬。如果你是一名音乐家,自然你会担心你辛苦获得的创造力现在被人工智能算法大量取代;你不敢苟同,你是对的。

加州大学圣克鲁斯分校荣誉退休教授、音乐技术公司 Recombinant Inc .的联合创始人 David Cope 早在 1981 年就已经将数千行 LISP 代码编织成音乐生成算法。他的电脑程序涉足“音乐智能”的实验(你可以在 Spotify 上找到他的电脑合成歌曲);具体来说,能够理解音乐风格并相应地复制它,同时仍然遵守音乐规则的程序(关键词:复制)。类似地, MuseNet 是一个深度神经网络,可以生成“用 10 种不同乐器创作的 4 分钟音乐作品,可以结合从乡村音乐到莫扎特到披头士的风格。”这两个例子都非常成功地实现了他们的提议,即复制现有的“真正的”艺术家和作曲家的音乐风格,但还需要一点时间,人们才能期待计算机根据自己的思想和情感创作音乐。

虽然有些人将他们的算法集中在复制音乐风格上,但其他人已经将机器学习的优势作为他们作曲过程的一部分。一个最显著的例子是谷歌的项目 Magenta ,该项目于 2016 年启动,旨在推动“机器学习作为创意过程中的一种工具”的边界。作为一个开源研究项目,Magenta 是音乐家、艺术家和开发人员的游乐场,允许他们将机器学习作为当今和未来最重要的乐器进行探索。通过 Magenta 创建的一些特色项目包括使用神经网络的钢琴转录,用机器学习生成的声音制作音乐,以及用机器学习模型进行交互式干扰。与音乐创作项目不同,Project Magenta 专注于技术和人类创造力之间的整合,强调当我们将两者结合起来时,可能性是多么的无限。

一起更好

在音乐领域之外,当自动化被用作人类创造力的工具或延伸时,仍有许多实例证明其价值。早在 2012 年,威廉和弗洛拉·休利特基金会(William and Flora Hewlett Foundation)发起了一项奖励,欢迎程序员设计一种自动化软件,帮助在州测试中给论文评分。为了降低成本和增加周转时间,这种竞争还将有助于确保学校系统不会在考试中排除论文问题,而采用选择题,选择题更不能体现学生的批判性推理和写作技能。虽然人们可能会认为给论文评分需要人类思维的经验和创造性思维,但这次比赛的结果证明并非如此:159 份参赛作品中最好的一份产生了与人类评分几乎相同的分数。这些评分程序的关键是,他们不评估文章的价值;更确切地说,他们是在模仿一个训练有素的教育者如何给文章打分。通过采用与经验丰富的教育工作者相同的评分标准,该计划在完成任务时充当该教育工作者的扩展或克隆,这直接减少了时间和相关成本。

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

Sougwen Chung, Drawing Operations Unit: Generation 2 (Mimicry), 2016 — — NTT InterCommunication Center [ICC], Tokyo Japan — — Courtesy of the Artist — — sougwen.com

在创意机器的一个更具协作性的应用中,Sougwen Chung 的机器人绘图臂,称为 DOUG 2(绘图操作单元:第 2 代),利用在 Chung 的绘图手势上训练的神经网络来学习艺术家的绘图风格。在每一次展览中,钟都强调这个项目的合作性,当她在画布上画画时,她把道格 2 放在自己旁边。该项目的核心是“探索人类和机器人合作的艺术潜力”。使用计算机视觉算法,DOUG 2 从艺术家的手中学习,并展示了一种受艺术家启发的风格,以开发一种“人和机器的复合行为”。其结果不仅是复杂线条和图案的惊人集合,也是一台机器与人类一起创造原创和其他无法实现的东西的现场演示。

我们定义创造力

通过了解在创造性过程中机器可以取代什么,我们越来越多地发现,我们所做的许多创造性工作涉及到可以轻松自动化的重复性任务。不能自动化的事情也是我们努力为自己定义的事情。例如,趋势和品味的短暂定义是由人类的方向决定的,即使是最发达的机器算法或数学公式也无法预测。

以亚马逊的时尚助手 Echo Look 为例,根据其亚马逊页面,这是一款“带 Alexa 的免提相机和时尚助手”。通过 Echo Look,用户可以拍摄照片和视频,然后根据当前趋势向 Alexa 寻求造型建议。然而,正如凯尔·查卡发现的,Alexa 缺乏自发性和有助于主导时尚趋势的创新思维。相反,Alexa 试图将你的衣服与盒子里已经有的衣服搭配起来。趋势,尤其是时尚,是由人类随意决定的;其实很多时候,最成功的设计师都是颠覆潮流的人。从这个意义上说,Echo Look 只不过是第二种意见——不是帮助你创造自己的风格,而是确保你看起来不像那么糟糕。

尽管人工智能在排序和组织数据以产生一致的分析结果方面非常有帮助,但它们仍然远远没有创造力——即创造和决定趋势和品味的能力。这并不是说机器在创造力中没有位置——很可能它们很快就会成为我们创造过程的工具,但也许会把创造方向的角色留给人类来完成,因为创造力毕竟是我们自己定义和联系的东西。这是一个谨慎的概念,许多人认为它定义了人类,它已经变得与人类思维如此相关,以至于两者几乎不可分。

当我们赞美艺术时,它证明了人类创造和创新的能力,而不一定是所说的创造力的结果。因此,在我们能够接受和识别非人类创造力的迹象之前,还需要一些时间,我怀疑这场关于机器人和算法是否真的可以“有创造力”的激烈辩论将持续一段时间,但这并不意味着计算机不能在此期间帮助我们进一步实现自我表达的目标。有了明确的目标,自动化可以帮助简化、实现甚至发明曾经不存在的表达形式。通过将技术与艺术相结合,我们正在定义人类创造力的新时代,其标志是科学的进步和我们从环境中创造一切的能力。

原载于 2019 年 7 月 10 日https://automtd.co

信用卡欺诈检测

原文:https://towardsdatascience.com/credit-card-fraud-detection-a1c7e1b75f59?source=collection_archive---------5-----------------------

在虚拟世界中保持警惕

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

Photo by Ales Nesetril on Unsplash

本文的代码可以在我的 Github 上找到。

在今天的世界里,我们正坐在通往无现金社会的快车上。根据世界支付报告,2016 年非现金交易总额比 2015 年增长了 10.1%,达到 4826 亿笔交易!这是巨大的!此外,预计未来几年非现金交易将稳步增长,如下所示:

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

World Payments Report Forecast

现在,虽然这可能是令人兴奋的消息,但另一方面,欺诈交易也在上升。即使实施了 EMV 智能芯片,我们仍会因信用卡欺诈损失大量资金:

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

CC Fraud Report from CreditCards.com

我们能做些什么来降低风险?虽然有很多方法来限制损失和防止欺诈,但我会向你介绍我的过程,并向你展示我的发现。

收集数据

首先,我从包含 285,000 行数据和 31 列数据的 Kaggle 数据集中收集数据。在所有的列中,唯一最有意义的是时间、金额和类别(欺诈与否)。为了保护用户身份,其他 28 列使用似乎是 PCA 降维的方法进行了转换。

从时间上来说,数据本身很短(只有 2 天),这些交易是由欧洲持卡人进行的。

探索性数据分析

现在我们有了数据,我想对我前面提到的三个列(时间、数量和类别)进行一些初步的比较。

时间

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

Time Distribution of Credit Card Data

鉴于这个分布是两天的数据,它将遵循我期望看到的普通消费者的趋势。大多数购买是在白天进行的,随着人们下班/放学回家,购买量会减少,直到第二天。

金额

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

Amount Distribution of Credit Card Data

虽然绝大多数交易量很低,但这种分布也是意料之中的。大多数日常交易不是非常昂贵(大多数是

类(欺诈/非欺诈)

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

Fraudulent and Non-Fraudulent Distribution

在这个数据集中,只有 492 个欺诈交易。这只占该数据集中所有交易的 0.173%!不过,我的目标是尽可能多地抓住那些讨厌的骗子。

数据处理

我首先通过使用热图来确保数据中没有任何强烈的共线性。

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

Feature Heatmap

在这个例子中,我没有添加任何数字,因为这对读者来说很难看到。我在寻找任何表现出高度相关性的东西,我发现了一些:

  • 时间和 V3 (-0.42)
  • 金额和 V2 (-0.53)
  • 金额& V4 (0.4)

虽然这些相关性与其他相关性相比相对较高,但我不认为它高到足以冒多重共线性的风险。

标准定标器开启时间和数量

在处理这类分类问题时,StandardScaler 是一个常用工具。它将数据转换为平均值为 0、标准差为 1 的数据,从而将数据标准化为正态分布。特别是在如此大范围的数量和时间上工作,我发现在运行测试之前缩放我的数据提供了更好的结果。

我使用训练集初始化了 fit,然后在将所有内容运行到模型中之前,对训练集、验证集和测试集进行了缩放。

构建模型

现在是有趣的事情!有这么多数据点要处理,我决定在创建任何模型之前进行 60%的训练/20%的验证/20%的测试。

另一个需要解决的问题是高度不平衡的数据集。有了这么多的非欺诈性交易,我实现了随机欠采样来减少非欺诈性交易的数量,并使其与欺诈性交易的数量相匹配。

有了这个设置,我现在可以通过一些模型运行数据了!

逻辑回归和随机森林

特别大喊到和他的逻辑回归随机森林博客!这些博客是很好的资源,帮助我了解每一个是如何工作的。

通过逻辑回归和随机森林模型,我试图确定这些数据是否有助于模型发现欺诈交易。

逻辑回归是一种统计模型,试图将预测错误的成本降至最低。随机森林是决策树的集合,它们共同预测交易是否是欺诈性的。

我通过这两个模型运行我的数据,得到了一些非常好的结果。

准确度、召回率、精确度和 F1 分数

对于本节,我将在公式中使用这些缩写:

TP =真阳性。欺诈性交易模型预测为欺诈性

TN =真阴性。正常交易模型预测为正常

FP =假阳性。正常交易模型预测为欺诈

FN =假阴性。欺诈性交易模型预测为正常

准确(性)

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

准确性是评估分类模型的一个度量标准。这是模型预测正确的比例。虽然准确性似乎是衡量模型性能的一个很好的指标,但在这种不平衡的数据集中使用它会有很大的负面影响。如果我说所有的 285,000 笔交易都是正常交易(没有欺诈),我会有 99.8%的准确率!然而,这里的问题是所有欺诈交易的明显缺失。特别是对于不平衡的数据集,有更有效的指标可以使用。

回忆

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

Recall 回答问题:在欺诈交易中,我们的模型能正确识别的交易占多少百分比?在我们最好的模型中,我们的召回率是 89.9%。这意味着在所有数据中,它能正确识别 89.9%的欺诈交易。这可以改进,但我觉得这是一个很好的起点。

精度

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

Precision 回答了以下问题:**在所有被预测为欺诈性的交易中,实际上有多少百分比是欺诈性的?**在我们的最佳模型中,97.8%的欺诈交易被捕获。这是一个非常好的指标!

F1 得分

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

F1 分数将召回率和精确度合并为一个指标,作为两者的加权平均值。与召回率和精确度不同, **F1 同时考虑了误报和漏报。**在像这样的不平衡类中,F1 在确定模型性能方面比准确性更有效。

结果

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

Model Results

在训练每个模型之后,这些是最终结果。逻辑回归和随机森林模型的所有分数对我们的数据集来说都非常有希望!每个模型都有很高的真阳性率和很低的假阳性率,这正是我们要找的。

最后,我将查看 ROC 曲线、混淆矩阵以及每个模型的累积情况。

接收机工作特性(ROC)和混淆矩阵

接收机工作特性(ROC)

ROC 是在各种阈值下对分类问题的性能测量。它本质上是一条概率曲线,曲线下面积(AUC)得分越高,该模型预测欺诈性/非欺诈性交易的能力就越强。

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

Out-of-sample ROC Curve

在上图中,逻辑回归和随机森林的 AUC 分数相当高,这是我们希望看到的。值得注意的是,曲线上的每个点都表示一个阈值。随着我们沿着曲线进一步向右移动,我们捕获了更多的真阳性,但也招致了更多的假阳性。这意味着我们捕获了更多欺诈交易,但也将更多正常交易标记为欺诈交易。根据上一节中的表格,找到的理想阈值是:

  • 逻辑回归:0.842
  • 随机森林:0.421

在这些阈值下,我们捕获欺诈交易的最佳数量,同时尽可能降低误报率。有了这些阈值,我们可以使用混淆矩阵来可视化每个模型的效果:

混淆矩阵—逻辑回归

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

Logistic Regression Confusion Matrix

在这个样本外测试集中,阈值为 0.842,我们捕获了 98 个欺诈性交易中的 88 个,并错误地将 1,669 个交易标记为欺诈性交易。我可以想象这些情况就像当我去另一个州而没有告诉我的银行我在旅行,当我用我的卡买了一些咖啡后,他们给我发短信要求确认。

混淆矩阵——随机森林

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

Random Forest Confusion Matrix

在阈值为 0.421 时,随机森林模型与逻辑回归模型具有相似的结果。随机森林模型捕获了 88/98 的欺诈性交易,但与逻辑回归相比,它表明 9 个正常交易是欺诈性的。这两种模式都很有前途,最终都给出了很好的结果。

结论

发现欺诈性信用卡交易非常重要,尤其是在当今社会。有很多方法来捕捉这些实例,看到公司如何在日常基础上处理这些问题真的很酷。

我喜欢发现异常,所以完成这个项目对我来说是一大乐趣。我希望我能够很好地解释我的发现,非常感谢阅读!

信用卡不应该是黑色的

原文:https://towardsdatascience.com/credit-card-should-not-be-black-b810be66bbf8?source=collection_archive---------23-----------------------

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

“File:Insert Credit Card (61471) — The Noun Project.svg” by Icons8 is marked under CC0 1.0. To view the terms, visit http://creativecommons.org/publicdomain/zero/1.0/deed.en

信用卡不应该是黑色的。我们在西班牙经历了惨痛的教训,但我们最近发现了另一个黑卡不是好主意的例子。

一位非常知名的软件开发人员在本月早些时候发布了这条推文,他在其中声称,用于信用评分的全新 Apple Card 算法是性别歧视的。

当苹果联合创始人史蒂夫·沃兹尼亚克加入谈话时,事情变得更糟,他基本上声称自己也遭受了同样的问题。

苹果公司和高盛公司对这一病毒式的新闻做出了回应,声明该算法是由第三方针对偏见进行评估的,并且性别没有被用作该算法计算信贷限额的输入数据。

事实是在美国,性别不能作为任何信贷决策的一部分,正如美联储规定的

“《平等机会信贷法案》在很大程度上禁止在信贷承销、定价、报告和评分中使用人口统计信息,包括性别。”

然而,性别不是一个算法变量并不会使情况变得更好。事实上,正如 Wired 在本文中指出的,这让事情变得更糟:

这个解释有双重误导性。首先,算法完全有可能进行性别歧视,即使它们被编程为对该变量“视而不见”。另一方面,对性别这样重要的事情故意视而不见只会让公司更难发现、防止和扭转对这一变量的偏见。

正如凯茜·奥尼尔在一次关于苹果卡事件的采访中所指出的:

我们必须发展一种新的谈论方式,因为旧的谈论方式已经行不通了。旧的谈论方式是,“让我们不要明确地使用种族或性别。”当我们没有收集关于彼此和我们自己的大量数据时,这种方法就起作用了,而且它不是到处都可以得到的。但是现在我们可以根据各种不同的指标来推断种族和性别。对于那些对推断这类事情感兴趣的公司来说,在 wazoo 上有这类课程的代理。从统计学上来说,它们比随机猜测要好很多。仅仅说“我们不要明确使用种族和性别”已经不够了。

这就是为什么,正如我在上一篇短文(计算机说不中介绍的,我们不仅需要算法的可解释性,还需要可追溯性和可审计性将我们从可解释的人工智能转移到可追溯和透明的人工智能,这也是为什么我们不应该让信用卡成为黑色的,黑色的算法盒子。

如果你喜欢阅读这篇文章,请 考虑成为会员 以便在支持我和媒体上的其他作者的同时,获得每个故事的全部信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值