TowardsDataScience 博客中文翻译 2021(五百九十)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

半监督机器学习解释

原文:https://towardsdatascience.com/semi-supervised-machine-learning-explained-c1a6e1e934c7?source=collection_archive---------21-----------------------

机器学习的另一种方式

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

约翰·汤纳在 Unsplash 上拍摄的照片

机器可以通过各种方式学习。监督学习是一种机器学习问题,涉及基于示例输入-输出对学习输入到输出的映射函数。无监督学习涉及从未标记数据中学习模式。半监督学习可以被视为监督学习和非监督学习的混合。

本质上,当我们在训练的时候把少量的有标签的数据和大量的无标签的数据结合起来,我们就有了一个半监督的机器学习问题。根据维基百科,半监督学习可能被描述为弱监督的特例[ 来源 : 维基百科 ]。

弱监督是机器学习的一个分支,它使用有噪声、有限或不精确的源来提供监督信号,以便在监督学习环境中标记大量训练数据— 维基百科

数据问题

监督学习模型和技术在商业中很常见。然而,建立有效的模型高度依赖于获得高质量的标记训练数据——我们都听说过“垃圾进,垃圾出”的说法。当企业试图使用机器学习来解决问题时,对高质量标记数据的需求通常会导致一个主要障碍。这个问题表现在几个方面:

  • 标记数据数量不足 —当提出新产品或新行业出现时,他们面临的一个常见问题是缺乏标记训练数据来应用传统的监督学习方法。通常,数据科学家会获得更多数据,但这种情况下的问题是,如果不等待时间的流逝来积累数据,这样做可能不切实际、成本高昂或不可能。
  • 没有足够的领域专业知识来标记数据 —有些问题可以被任何人标记。例如,大多数人可以标记猫和狗的图像,但当标记图像中猫或狗的品种时,这个问题变得更具挑战性。让领域专家来标记训练数据可能会很快变得昂贵,因此它通常不是一个可行的解决方案。
  • 没有足够的时间来标记和准备数据 —众所周知,60%或更多的时间花在机器学习问题上,专门用于准备数据集。当在处理快速发展的问题的领域中工作时,收集和准备数据集以足够快地构建有用的解决方案可能是不切实际的。

总的来说,收集高质量的标记数据会很快对一个人的资源提出沉重的要求,一些公司可能没有这些资源来满足需求。这就是半监督学习发挥作用的地方。如果我们有少量的标记数据和大量的未标记数据,那么我们可以将我们的问题框架为半监督机器学习问题。

半监督学习的类型

当我们在处理一个半监督问题时,目标会根据我们希望执行的学习类型而变化。我们可以将半监督学习用于归纳学习、直推式学习或两者的对比。

归纳学习

归纳学习的目标是归纳新数据。因此,归纳学习指的是建立一种学习算法,从标记的训练集学习并推广到新数据。

直推式学习

直推式学习的目标是将来自已标记训练数据集的信息转换成可用的未标记(训练)数据。

最后的想法

半监督学习介于监督学习和非监督学习之间。我们可以将半监督学习作为归纳或直推学习来进行,并且这两种学习都可以使用半监督学习算法来执行。其实现方式超出了本文的范围,但是感兴趣的读者可能想阅读:

感谢阅读!

如果你喜欢这篇文章,请通过订阅我的免费**每周简讯与我联系。不要错过我写的关于人工智能、数据科学和自由职业的帖子。**

相关文章

** </5-books-you-can-read-to-learn-about-artificial-intelligence-477b5a26277d> **

将云 SQL 数据发送到 BigQuery

原文:https://towardsdatascience.com/send-cloud-sql-data-to-bigquery-2603489a4330?source=collection_archive---------15-----------------------

将云 SQL 数据移动到 BigQuery 的自动化数据管道

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

来源 pixabay ,作者迪侯

Cloud SQL 是谷歌云平台的一项数据库服务,可以轻松设置、维护和管理关系数据库。

但是,它不是为繁重的分析操作而构建的。你需要一个仓库服务,比如 BigQuery 来完成高级分析和机器学习任务,比如使用 BigQuery ML 执行 RFM 分析。为此,您需要将您的云 SQL 数据移动到 BigQuery。

在本指南中,我们将构建一个数据管道,以自动方式将云 SQL 数据发送到 BigQuery。

数据管道

对于我们的数据管道,我们将使用两个 GCP 组件
1。联邦查询
2。查询调度程序

这就是数据流动的方式

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

数据流插图,作者 Muffaddal

查询调度器将执行一个联邦查询,该查询将获取 BigQuery 环境中的 SQL 数据,并将其附加到 BigQuery 表中。

如果你想在 GCP 了解更多关于数据流水线的知识 这里有一门极好的课程 可以开始。

云 SQL 到 BigQuery 的连接

在我们详细讨论如何将云 SQL 数据迁移到 BigQuery 之前,我们必须首先建立两个组件之间的连接。请按照以下步骤操作。

1- BigQuery 连接 API

启用 Bigquery 的连接 API,使其能够连接到云 SQL。

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

Muffaddal 的 BigQuery 连接 API

2 云 SQL 公共 IP

为了让 BigQuery 连接到 SQL,我们必须确保云 SQL 设置为公共网络。

转到您的 SQL 实例>连接选项卡,并启用公共 IP >点击保存

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

使实例公开,由 Muffaddal

即使你的实例是公共的,它仍然无法从公共互联网访问,因为你没有提供一个授权的地址。

BigQuery 中的 3 云 SQL 连接

转到 BigQuery 接口并添加外部数据源。

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

通过 Muffaddal 创建外部连接的步骤

这将打开一个提示,要求输入关于 SQL 的详细信息。输入适当的信息以建立与云 SQL 的连接。

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

SQL 详细信息提示,按 Muffaddal

4-管理连接

接下来,为用户提供访问这个新添加的外部数据库的电子邮件地址和角色。

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

共享连接按钮,由 Muffaddal

这也让另一方可以使用 BigQuery 中的外部数据源。

完成以上工作后,我们就可以将云 SQL 数据导入到 BigQuery 中了。

联邦查询

联邦查询使我们能够实时查询驻留在云 SQL 中的数据,而无需将数据直接复制或移动到 BigQuery。它支持云 SQL 中的 MySQL(第二代)和 PostgreSQL 实例。

它使用函数EXTERNAL_QUERY来完成这个任务。这需要两个参数。首先是实例 Id,其次是实际的 SQL 查询。

外部 _ 查询(,)

下面是在 BigQuery 接口中处理 SQL 数据的一个非常基本的查询。

Muffaddal 的联邦查询示例

EXTERNAL_QUERY 函数中的查询处理云 SQL 接口中的数据,并将其传递给 BigQuery 引擎进行处理。

这意味着两件事:
首先是,使用 EXTERNAL_QUERY 函数中的查询,我们可以进行过滤、连接、子查询,以便从云 SQL 中只获取我们想要的数据。

**其次,**一旦传递给 BigQuery 引擎,即上面示例查询中的外部 select,我们可以将它与其他现有的 BigQuery 表合并,以根据需要在 BigQuery 中转换和构建我们的数据集。

我们将使用这两个功能来确保我们只获得 BigQuery 最终表中不存在的数据。最后一个表是我们在 BigQuery 中存储云 SQL 数据的地方。

移动数据的查询

我们将每小时自动获取云 SQL 数据。

因此,我们只需要 SQL 表中前一小时的数据。因此,我们必须确保我们的查询只从 SQL 实例中获取数据的子集。

Muffaddal 的联邦查询示例

每当执行上述查询时,它都会获取前几个小时的所有内容。posting_timestamp在 where 子句中是表中的 DateTime 列。用您的日期列名替换它。

自动化数据插入

现在,我们只需每小时重新运行一次联邦查询,并将结果追加到 BigQuery 中。为此,查询调度器开始发挥作用。

1-在 BigQuery 控制台中,将查询粘贴到查询编辑器中,然后单击“调度查询”按钮创建新的调度程序。

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

通过 Muffaddal 创建新的计划查询

2-接下来,在调度程序创建菜单中输入所需的值来创建调度程序。

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

查询日程创建菜单,按 Muffaddal

不要忘记在“查询计划程序”对话框中选择“附加到表”选项。

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

查询调度程序创建对话框,由 Muffaddal 创建

这个调度器将每小时执行一次,从 cloud SQL 中获取最后一个小时的数据,并将其附加到 BigQuery 表中。

就是这样。您将每小时自动将 SQL 数据转移到 BigQuery。

需要牢记的几件事

在实施解决方案时,您必须记住几件事情

1-BigQuery 不支持 SQL 的许多数据类型,例如 UUID 生成器类型,在这种情况下,请在联邦查询中将数据类型转换为 big query 可读数据类型。

2-并非所有云 SQL 实例区域都支持联邦查询,因此您必须将您的 SQL 实例移动到支持联邦查询的地方。见下面的截图是为美洲地区。

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

联邦查询区域支持,来源 GCP

看这里了解更多详情。

你可能喜欢类似的读物

使用数据工厂将 CSV 有效负载发送到 API

原文:https://towardsdatascience.com/send-csv-payload-to-api-with-data-factory-ff0cdddd6563?source=collection_archive---------23-----------------------

我将向您展示如何使用 Azure 数据工厂和函数应用程序将 CSV 有效负载发送到 API

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

皮奥特·穆西奥在 Unsplash 上拍摄的照片

有人可能会认为,有一种直接的方法可以使用数据工厂从 SQL table/CSV Blob 中读取数据,并将其发送给需要 CSV 格式文本正文的 API。据我所知,没有,我们需要创建一个功能应用程序来实现这一点。

我遇到的这个问题的一个用例是在将数据上传到 Salesforce Bulk API 2.0 时。

概观

在本文中,我将向您展示一个解决方案,其中

  1. 我从 SQL 数据库中读取数据,并将其作为 CSV 文件写入 Blob 存储中,
  2. 我用 Azure Function 应用程序以字节形式获取 Blob 内容
  3. 我将函数响应发送给我创建的示例 API。

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

1.从源到斑点

如果您想保留发送文件的历史,我建议将 Blob 名称设置为管道变量。如果没有必要保留历史记录,可以使用硬编码的 Blob 名称。

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

我的 Blob 名称包括当前时间戳和文件名:

[@concat](http://twitter.com/concat)(substring(utcnow(), 0, 19), 'canada_climate_data.csv')

我们将使用数据工厂复制活动来创建我们的 Blob。在这个例子中,我的源是我的 SQL DB 中的一个表。源数据集和汇数据集都被创建为通用数据集。参见我的文章用通用数据集保持你的数据工厂整洁获得解释。

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

2.用函数将 Blob 转换为字节

为了创建我的 Python 函数应用程序,我遵循了微软的这些指令。我的 init。py 文件如下:

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

JSON 主体的动态内容如下(用您的存储帐户名和正确的容器名替换“您的存储”和“容器”):

[@concat](http://twitter.com/concat)('{"blob_location":"[https://yourstorage.blob.core.windows.net/container/',variables('blob_name'),'](https://miiastorage.blob.core.windows.net/container/',variables('blob_name'),')"}')

3.向 API 发送字节

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

body 的动态内容是我的函数的响应:

[@activity](http://twitter.com/activity)('Blob to bytes').output.Response

就是这样!

感谢您的阅读!如果你学到了新的东西或者喜欢这篇文章,请在 Medium 上关注我。我发表关于数据工程和数据科学的文章。你可以从 be 网页了解更多关于我的信息。

你有没有找到更好的方法来实现这一点,或者有什么不清楚的地方?请在评论中告诉我😊

将 SendGrid 数据发送到 BigQuery

原文:https://towardsdatascience.com/send-sendgrid-data-to-bigquery-d8bf0bd4a238?source=collection_archive---------32-----------------------

如何将 SendGrid 的电子邮件参与数据发送到 Google BigQuery

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

来源皮克斯拜,作者里布汗

从多个来源捕获数据是创建丰富数据仓库的关键。当涉及在线业务时,这变得更加重要,因为数据分散在用于运营业务的众多平台上。

SendGrid 就是这样一个营销平台,它发送交易和营销电子邮件,帮助用户保持知情和参与。

我们将讨论将 SendGrid 电子邮件数据存储到我们的数据仓库工具的不同方法。

SendGrid 网页挂钩

SendGrid 提供了几种导出数据的方法。一种方法是使用 SendGrid webhooks。Webhooks 是当有事情发生时,应用程序自动发送的消息。因此,每当 SendGrid 发送一封电子邮件时,就会触发一个 webhook,其中包含有关已发送电子邮件的信息。

SendGrid 事件 webhooks 可用于以下电子邮件交付和接洽事件

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

由 Muffaddal 编写的 SendGrid 的 webhook 事件

因此,SendGrid 为上述所有事件触发了一个 webhook,并随之传递信息。下面是它在打开事件时发送的信息示例。

这些信息被称为有效载荷。在此查看其他 SendGrid 事件的有效载荷示例。

数据管道

SendGrid 的 webhooks 和 Google Cloud 功能的结合可以帮助捕获 BigQuery 中需要的所有数据。

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

数据管道,由 Muffaddal

步伐

建立数据流涉及三个步骤。

  1. 根据您希望从 SendGrid 存储的数据,创建一个具有模式的 BigQuery 表。示例电子邮件、事件、时间戳、类别。
  2. 设置一个云函数,可以接收来自 SendGrid 的 webhook 调用,提取所需信息,并传递给 BigQuery。
  3. 在发送网格中配置 webhook。

大功告成!

现在让我们来实际实施上述所有步骤。

注意 这需要相当多的技术和编程背景。因此,我建议请您团队中的技术人员来实施解决方案。

让我知道你是否需要我的帮助来实现

数据管道实现

1-大查询表

我们首先必须在 BigQuery 中创建一个可以存储 SendGrid 数据的表。输入列名,如下图所示。

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

muffaddal 的 BigQuery 表架构

将该表命名为 sendgrid_events。

2 云函数

接下来,我们必须创建一个云功能,它有两个职责。首先是获取 SendGrid 传递的数据。第二个是在我们上面创建的 BigQuery 表中处理和存储数据。

我们将使用 Node.js 来编写我们的云函数。这是我们将用于它的配置。

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

云函数配置,由 muffaddal

配置完成后,在 index.js 中添加以下代码,根据需要解析数据。

根据您的 GCP 项目替换我的项目,我的数据库。上面的代码解析从 SendGrid 发送的数据,然后将其附加到 BigQuery

另外,在 package.json 中添加 BigQuery 依赖项。

复制云函数触发 URL,我们就可以进入最后一步了。

3-网状挂钩配置

在 SendGrid UI 中,转到设置>邮件设置。从那里点击编辑启用 webhooks。

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

通过 muffaddal 启用 webhooks

一扇窗户将会打开。输入云函数 URL 并检查所有要发布的事件,如下所示。

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

Muffaddal 的 SendGrid webhook 配置

单击“Test Your Integration”按钮将测试事件发送到云函数,以便您查看这些事件是如何存储在 BigQuery 中的。这是它的样子

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

muffaddal 在 Bigquery 中发送网格测试数据

你是否注意到我们也按原样存储 event_payload?原因是,如果需要,我们可以从任何事件的有效载荷中提取更多的信息。

点击 webhook 配置窗口中的保存按钮,我们就完成了。

按照上面的步骤,您将在 BigQuery 中接近实时地获得所有需要处理和操作的 SendGrid 数据。

如果实施对你来说太技术性了,你想自己学习更多,那么 这里有一个极好的课程 在 GCP 开始数据工程。

你喜欢的类似读物

从 Flask 应用程序向 PostgreSQL 数据库发送数据

原文:https://towardsdatascience.com/sending-data-from-a-flask-app-to-postgresql-database-889304964bf2?source=collection_archive---------1-----------------------

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

扬·安东宁·科拉尔Unsplash 上拍摄

什么是 ORM

如果你打算开发任何类型的现代网络服务,管理网站或应用程序的数据流是一项需要掌握的关键技能。有了 flask,对象关系映射器 (ORM)被用来允许你的应用与关系数据库交互。对象关系映射器是一个框架,在我们的例子中,它允许我们使用 python 而不是显式 SQL 查询与 SQL 数据库进行交互。我们使用的 ORM 的名称是SQLAlchemy,可以下载如下:

*pip install flask_sqlalchemy
pip install psycopg2-binary #for using postgres*

本文假设您对 SQL 有一些基本的了解,并且在您的机器上安装了 FlaskPostgreSQLpgAdmin

目录结构。

为了让我们的应用程序正常工作,目录需要如下所示。确保不要更改您在下面看到的任何文件/文件夹的名称或拼写。

*# from the terminal in the project folder$ mkdir templates static
$ touch app.py
$ cd templates
$ touch index.html$ tree (optional: only works if [tree](https://superuser.com/questions/359723/mac-os-x-equivalent-of-the-ubuntu-tree-command/359727) is installed on OSX)├── app.py
├── static
└── templates
    └── index.html2 directories, 2 files*

在接下来的部分中,我们将制作一个基本的表单,将一个人的名字和他最喜欢的颜色发送到本地 PostgreSQL 数据库。

建立我们的数据库。

我们将在 pgAdmin 中创建一个数据库:

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

现在,我们需要设置 app.py 来连接我们的数据库和应用程序。我们首先创建我们的应用程序,并配置数据库 URI 和 secret_key。

SQLALCHEMY_DATABASE_URI是描述数据库连接的字符串。出于本文的目的,该连接是本地的,可以描述如下:

*engine:[//[user[:password]@][host]/[dbname]]engine -> postgresql
user -> postgres (see `owner` field in previous screenshot)
password -> password (my db password is the string, `password`)
host -> localhost (because we are running locally on out machine)
dbname -> flasksql (this is the name I gave to the db in the previous step)*

在配置了到本地数据库的连接之后,我们需要创建我们的people表。这将由整数类型的主键、必须唯一的名称列和颜色列组成。颜色和名称列都必须由用户输入。

现在,在登录页面通常所在的位置,我们将添加一个按钮,将我们带到输入表单。当我们点击表单上的submit时,我们将人名和他们最喜欢的颜色添加到 People 类/表中,然后使用 db.session 将该条目添加到数据库中,并提交更改。

在应用程序运行之前,我们需要使用db.create()来创建数据库:

用于提交数据的 HTML 表单。

为了从用户那里获取信息并存入数据库,我们使用一个 HTML 表单,表单的输入具有与数据库中的列名相对应的name属性。我们用request.form["pname"]request.form["color"]personadd() 函数的表单中获取这些信息。

在 pgAdmin 中查看数据。

现在我们已经在数据库中有了名称和颜色,我们可以转到 pgAdmin 并直接查询数据库。每当我们使用表单添加一个新条目时,我们可以转到 pgAdmin 并刷新数据库以反映结果。

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

每次添加新条目时,按F5键,查询将使用新数据更新!

结论。

本文并不是为了说明最佳实践或生产就绪的解决方案,而是为那些不知道从哪里开始的人准备的。我们讨论了一些基本概念,如 ORM 和 URI 数据库,这些基础知识应该可以很好地为您服务,因为您了解了更多关于数据库和应用程序基础架构的知识。

编码快乐!

GitHub 回购可以在这里找到。

💻请随意查看我的网站

敏感性和特异性,解释!—和僵尸?!

原文:https://towardsdatascience.com/sensitivity-and-specificity-explained-with-zombies-ae3f4801b35b?source=collection_archive---------40-----------------------

评估方法和 ROC 分析简介

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

评估方法和 ROC 分析简介。图片由 Andreas Maier 提供

欢迎大家,今天我们想简短地谈谈评估分类系统的措施,以及如何改变分类系统以改变评估结果。所以我想你会发现这很有趣,我也带来了一个非常有趣的例子来讨论分类系统的想法。今天的关键问题是“我如何评估一个分类系统?”。

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

来自模式识别讲座CC BY 4.0 下的图像。

所以我们在我们的模式识别讲座中谈到了这一点。但是我发现我们需要一些额外的解释来真正理解分类系统是做什么的,以及我们如何评估它们。所以,当然,我们会用一个例子来讨论这个问题。如今每个人都在谈论疾病,似乎每个人都成了疾病分类的专家。所以,我也认为谈论一种典型的疾病会很有趣,我选了僵尸病。

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

来自模式识别讲座的 4.0CC 下的图像。

我认为这是世界上可能发生的最可怕的事情之一。所以我认为这是一个合适的时间来讨论当我们遇到僵尸疾病时我们应该做些什么。你看,这是我们如何评估测试结果的。因此,我们已经在准备一个测试系统,以确定谁是僵尸,谁不是,我们当然会有几个可能的结果,你知道,人实际上可能是僵尸。这就是参考。所以这些是柱子,否则它们不可能是僵尸。所以它们要么是正的,要么是负的,然后当然我们的分类结果,假设会有两种结果之一。所以这也可能是积极的或消极的,当然,也有正常人。所以这是一个真正的否定,他们只是普通人,当然,测试结果也应该是否定的,那么我们当然希望我们的分类系统能够检测到僵尸。因此,我们希望检测到真实存在的僵尸,我们希望结果也是僵尸。所以这将是一个真正的积极因素。当然,我们的分类系统也会出错,有时我们会发现某人是僵尸,但他实际上并不是僵尸,我在这里举了一个小例子,你可以记住这个例子。这是一部非常有趣的恐怖电影《僵尸肖恩》,在这个场景中,肖恩宿醉未醒,他去商店买了一杯饮料。你看,他宿醉得很厉害,首先他没有意识到他周围有行尸走肉,其次他们没有认出他,因为他的行为像他们中的一员。所以这是一个假阳性。所以人们,幸运的是他也是行尸走肉僵尸认为你是他们中的一员,然后还有另一种情况,我们不知何故错过了某人死而复生。这里有一种情况,类似这样的事情实际上正在发生。所以你知道你在玩你最喜欢的电子游戏,你和你的朋友一起玩,在某个时候,你甚至没有意识到你的朋友已经变成了僵尸,而你还在玩电子游戏。所以这是假阴性的情况。现在我们已经了解了不同的结果是什么,我希望你们能够记住这一点。所以假阳性和假阴性是我们会犯的两种错误。所以很明显我绝不会让你毫无准备地染上可怕的僵尸病。所以,当然,我也有一些建议给你。好了,伙计们,我们被困在这个可怕的僵尸感染的大厦里了,我们分头行动吧。

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

来自模式识别讲座CC BY 4.0 下的图像。

好了,让我们回到评估我们的分类器。因此,可以用许多不同的方法来评估分类系统,您在这里可以看到如何评估该分类器的不同方法。当然,有许多不同的方法可以组合上述值来计算不同的比率。一个非常典型的例子是真阳性率,也称为命中率回忆或灵敏度,即真阳性的数量除以观察到的阳性数量,即真阳性加上假阴性。此外还有假阳性率,实质上是假警报率,它是假阳性的数量除以真阳性和假阴性的数量。同样高度相关的是像阳性预测值或精确度这样的度量,并且位置被给定为真阳性的数量除以真阳性加上假阳性的数量。然后还有阴性预测值,它是真阴性的数量除以两个阴性加上假阴性的数量。最后但并非最不重要的是,真阴性率或特异性,其计算方法是 1 减去假阳性率。所以这看起来有点复杂,我试着把这些事情分解一下。所以记住,一个人不能简单地理解敏感性和特异性。但是我会试着通过一些例子来简化这个问题,我给你们举的例子是下面这个。假设我们总共有 100,000 人,我们现在将填充这 100,000 人的整个示例表。我们知道实际上有 1 万人感染了僵尸病。这意味着这个数字在这里,另外 90,000 人没有被感染。所以他们只是普通人。所以这个数字会出现在我们的图中。现在我们想看看我们的测试有多好,让我们假设我们知道灵敏度。如果我们知道了敏感度,我们现在就可以实际计算真正阳性的数量,也就是我们集合中阳性的数量。然后我们乘以灵敏度,得到 9970 个真阳性,这个数字就在这里。我们现在也可以用这个来计算假阴性的数量,你可以在这里看到,当然,我也可以把它放在我们的表中。因此,与确定我们表格中的实际值非常相关的另一个值是特异性。特异性现在允许我们计算真正阴性的数量,这仅仅是参照中阴性的数量。所以真实人类的实际数量是这个数量乘以特异性。这样我们就得到了 98,280,我们可以把它放在这里的表中。这允许我们现在计算假阳性的数量,在这个图中是 720。这个值在这里。

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

来自模式识别讲座CC BY 4.0 下的图像。

现在让我们想想这对我们的测试实际上意味着什么。所以你记得我们的假阴性。这是每次我们探测不到丧尸的时候。因此,假阴性与敏感性有关,如果我们的敏感性低,这意味着我们对僵尸不太敏感。所以我们干脆无视他们,认为他们是真人。因此,在这种情况下,我们将有总共 30 个僵尸可能在某个地方玩视频游戏,甚至可能感染其他人,而他们被我们的测试遗漏了。所以我们无法识别它们,也无法对这些僵尸采取任何对策,因为我们没有检测到它们。还有假阳性,在我们的例子中,假阳性是宿醉者,看起来像僵尸,但实际上不是僵尸,这与特异性有关。所以这意味着低特异性与对僵尸不太明确有关。所以我们认为人是僵尸,其实并不是僵尸。因此,在我们的案例中,将有 720 人。现在,如果你是僵尸中的一员,实际上并不太坏,因为僵尸会认为你是他们中的一员,他们不会伤害你。但是想象一下你的人类同伴认为你是僵尸。嗯,他们可能会有点害怕,你知道可能会有很糟糕的事情发生在你身上。所以让我们想一想患病率或先验概率是如何影响我们的检出率的。现在,如果我们修正灵敏度和特异性,那么我们可以看到我们的先验是否只有百分之一。因此,假设我们处于疾病的非常非常早期阶段,那么我们基本上不会发现任何假阴性。所以我们几乎不会错过僵尸,僵尸的数量可能很低,人们会说那里没有僵尸。因此,甚至可能会有否认僵尸的人说,这些僵尸无法被检测到,如果你仔细看看已经被检测为僵尸的案例,那么它们非常少,在这个特定的案例中,如果我们只有 1000 个僵尸,我们仍然检测到大约 700 多人是僵尸。所以几乎一半被检测到的僵尸实际上并不是僵尸。虽然我们的测试做得很好。因此,这一切可能被简单地贴上神话或假新闻的标签,或者这种疾病根本就不存在。所以,如果我们现在逐渐增加患病率,我们会达到 50%的患病率。因此,就像有一半的人类留下来,一半的人类已经被转化为僵尸,你看到我们的错误发生了变化,随着先验知识的增加,我们有了更多的假阴性。因此,我们错过了实际感染疾病的人,他们去传播疾病,而与此同时,我们减少了假阳性,这只是与周围的阴性较少有关。所以假阳性的数量也在下降。假设这种疾病已经接管了它有 90%的患病率,所以在 90%的患病率情况下,假阳性的数量将大大减少,但我们有越来越多的僵尸被我们遗漏了,但老实说,90 或僵尸周围的事情已经非常糟糕,你可能不想相信任何人。所以这是非常糟糕的,尤其是大量的假阳性,在开始时,非常非常令人担忧。

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

来自模式识别讲座CC BY 4.0 下的图像。

所以让我们想想,我们是否可以做些什么来减少假阳性的数量,这样我们就不会伤害许多宿醉的人。因此,如果你只是有一个糟糕的宿醉,也许这不是那么好,你的邻居会决定使用对抗僵尸的对策,这实际上对你来说可能不是那么好。所以让我们想一想我们的测试,我们不知道谁是真正的僵尸,我们只是从测试中得到结果。但当然,这至少告诉我们,在我们是阳性的情况下,我们可能只是想再次测试它们,只是为了真正确定。那么,如果我们再次测试,会发生什么呢?我们只是再次运行相同的测试,在这种情况下,这是我们的测试结果,所以我们现在已经观察到阳性和阴性,它们仅由之前的测试结果确定。所以现在我们来看一下我们只想重新测试阳性病例的情况。让我们重新测试那些观察到的阳性结果,观察到的阳性结果当然是真阳性,真阳性现在我们必须乘以灵敏度,灵敏度将再次给出我们是阳性还是阴性的结果。这意味着我们重新测试,大量的真阳性将有另外 30 个被分配给假阴性的数量。现在让我们考虑假阳性的情况。所以我们有 720 人,我们重新测试他们,现在我们必须考虑特异性。我们现在看到,在 720 个中,我们可以将 714 个识别为假阳性。因此,它们将被指定为阴性,这意味着我们只剩下六个假阳性。所以我们得到了一个新的混淆矩阵。这些是我们已经考虑过再测试程序的新结果。所以你可以看到假阴性的数量增加到了 60 个,而假阳性的数量减少到只有 6 个。这意味着我们在这个新的测试程序中有了一个新的测试,我们只测试阳性两次,它的真阳性率降低了,但真阴性率却高得多。因此,假阳性大大减少,你可以看到这个数字现在高得多,但这是以降低灵敏度为代价的。当然,我们也可以走另一个方向。

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

来自模式识别讲座CC BY 4.0 下的图像。

所以我们只重新测试观察到的负面结果。现在,在这种情况下,我们要确保我们不会错过一个僵尸,所以我们重新测试所有被观察为负面的东西。现在,我们必须再次检查我们的敏感度,现在我们看到,在观察到的阴性结果中,只有 30 例是假阴性,乘以敏感度,现在实际上会给出 30 个正确的分类。所以我们的假负数变为零。现在让我们考虑另一个错误,我们用我们集合中的真阴性来做,这里我们必须使用特异性。我们看到,我们乘以这个数字,我们产生了另外 714 个假阳性。现在我们可以更新我们的混淆矩阵,看起来像这样。所以我们引入了这个重新测试程序,它给了我们 100%的灵敏度。所以我们没有漏掉一个僵尸,但代价是我们现在有 1434 个误报。因此,通过引入这一程序,假阳性的数量几乎翻倍。但是我们再也没有假阴性了。所以记住我们只有一万个阳性,现在我们有一千四百个假阳性。所以这意味着在观察到的一万一千四百个阳性中,有超过百分之十不是真正的僵尸。所以你以不漏掉任何人为代价,摆脱了一千四百多名普通人。所以你正在对 1400 名实际上没有被疾病感染的人采取对策。因此,这可能是一件相当艰难的事情,也许不是每个政府都能真正做到这一点。我们现在开发了三种不同的测试程序,现在你可能想知道它们是否相同,哪种更好,哪种更差。

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

来自模式识别讲座CC BY 4.0 下的图像。

让我们来看看它们,比较一下,比较的典型工具是所谓的受试者操作特性曲线 ROC 曲线。我在左边显示了评估的空间,你可以在这个图中看到,我们画的是灵敏度除以 1 减去特异性。你可以在左上角的图上看到几个重要的点,用你看到的完美分类器来表示,所以这个有 100%的特异性和 100%的灵敏度。所以这总是做正确的决定。你可以做的另一件事是,你可以简单地总是决定为正,那么你会在曲线的右上角,相反的是,你总是决定为负,那么你会在曲线的左下角。有一条线连接这两点,这基本上是一个随机的决定,但有不同的阈值。所以如果你掷骰子,你会在连接这两点的线上的某个地方,这意味着你在完全不知道任何观察的情况下做决定,这将产生下面的线。如果你在左上角的三角形中,你已经建立了一个有效的分类系统。所以我希望在左上角的三角形上有任何有效的分类系统。所以在对角线上方,对角线下方还有一个空间,这里用 4 表示,如果你的分类器位于那里的某个地方,那就错多过对。这意味着在一个两级系统中,如果你做的和你的分类系统所建议的相反,你实际上会在左上角的三角形中结束。所以这是我们现在必须定位分类器的空间,我们看到我们的普通僵尸分类器实际上做得并不差。它非常接近左上方,所以它非常接近,因为它具有非常高的灵敏度和非常高的特异性。现在,我们改变了我们的分类系统,重新运行所有的阳性结果,因此我们改变了敏感性和特异性,以得出这一点。所以我们稍微偏离了原来的分类系统,我们可以提高一个比率,但牺牲另一个比率。然后我们做了完全相反的事情,我们重新运行所有的阴性案例,然后我们在这里得到这个观察结果。所以我们在一个速率上增加,但在另一个速率上减少。因此,你可以看到,通过调整分类系统和重新运行决策,我可以改变结果。实际上,灵敏度和特异性有一整套不同的解决方案,这里用绿色曲线表示,我们可以根据给定的分类系统沿着这条绿色曲线前进。这里你可以看到这个分类系统非常非常好,因为它几乎覆盖了接近 1 的区域。所以如果我有完美的分类器,那么这条曲线下的面积,在绿色曲线下,正好是 1,我们非常非常接近这里的 1。所以我们有一个非常好的分类系统,因为我们使用的是同一个系统,所以需要通过这条曲线来检测。现在你可能想知道我是如何得到这条绿色曲线的。

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

来自模式识别讲座CC BY 4.0 下的图像。

实际上,我们的分类系统源于两种分布,正分布和负分布,确定实际的分类结果只是简单地通过选择测试统计的阈值。所以不管你做什么测试?所以在僵尸的例子中,我听说眼压是一个非常好的衡量标准,当我们实际上确定某人是否是僵尸时,你只需要改变阈值。这个人很重要,我可以简单地通过改变阈值来采样整个绿色曲线。所以我不需要经历重新测试的过程,运行两个测试,如果是相同的测试,它不会改变任何东西,因为你只需要根据不同的阈值调整你的分类器。所以那不会有很大帮助,我们能做些什么呢?

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

来自模式识别讲座CC BY 4.0 下的图像。

让我们考虑几个想法,其中一个非常明确的想法是,根据场景选择阈值。如果你想选择阈值,你必须确定决策的成本。因此,每一个决定都有成本,例如,根据疾病的流行程度,成本可能会非常不同。因此,如果你处于早期阶段,你想不惜一切代价阻止僵尸,错过一个会非常昂贵。因为僵尸会继续传播疾病。在疾病的晚期,这可能会非常不同。因此,您可能希望根据当前的测试场景调整阈值,如果您知道决策的成本,您就可以这样做,因为这样可以让您权衡什么成本更高,是假阳性还是假阴性。另一个想法是涉及另一个测试,你只是用两个不同的测试来测试,如果它们在统计上是独立的,你可以将两者结合起来,以获得更好的决定。这就引出了一些概念,比如推进 bagging 和集成分类器,我们也会在这堂课中讨论。为了理解这些集合属性,我想给你们看一个具体的例子。

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

来自模式识别讲座CC BY 4.0 下的图像。

所以,你通常要做的是运行第二个测试统计,利用第二个测试统计,你可以创建像这样的图,然后找到一个与两个测试之一正交的决策边界。这意味着您可以利用这两个测试的力量。每当我们进行提升和组合时,我们通常假设测试在统计上是独立的。这是一个关键因素,我们来看一个例子。

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

来自模式识别讲座CC BY 4.0 下的图像。

所以我有检验统计量 1,我们的 1 类和 2 类或者正负分布如下。所以有很大的重叠。所以他们都没有很好的区分这两个类,我做了另一个测试,同样的两个类又出现了。现在我想把这两个结合起来,现在让我们选择一个观察配置,这些现在被表示为真实类和真实的其他类,所以积极和消极的。在这里你可以看到,我必须找到沿着 x 轴和 y 轴投影到原始分布的点。我在这种情况下这样做了,你可以看到在这种特殊情况下,点的分布遵循各自的一维投影。所以如果我把它们移到一边或另一边,通过两个测试的结合,我可以得到非常清晰的分离。因此,这非常有用,在这种情况下,我们真的有两个测试的独立性,因为它们是独立的,所以将它们结合起来可能会有很高的产量。

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

来自模式识别讲座的 4.0CC 下的图像。

现在让我们看一个例子,在这个例子中,类被很好地分开了,这里我有一个类,另一个类,现在重叠非常小。我在另一个轴上做同样的操作,重叠也非常小。这意味着蓝点必须分布在投射到蓝色曲线上的某个地方,而橙色点必须位于投射到橙色曲线上的某个地方。这有点问题,因为你可以看到我们非常接近对角线,实际上我们有测试一和测试二的相关性。所以这两个结果不是完全独立的,每当我已经有了这种很好的分离,并且假设这些是检验统计量上的高斯分布点,那么我就会遇到这个问题。现在的问题是,因为这两种测试是相互关联的,所以将这两种测试结合起来的结果很少。所以你在这里看到了一个决策边界。这稍微好一点,但是它不能像我们在前面的案例中看到的那样干净利落地解决问题。因此,如果两者相关,就很难将两个测试从另一个测试中分离出来,并从另一个测试统计中受益,因为它们几乎测量相同的东西。

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

来自模式识别讲座CC BY 4.0 下的图像。

当然这并不意味着这是不可能的。因此,相关的是这里的这个区域,如果我幸运地通过了测试,那么我可以找到一种配置来更好地解决这个问题。但是当然,只有两个类实际相连的小区域才是我能得到收益率的区域。这很难用两个轴中的一个轴上的统计数据来描述,所以你真的必须知道类的完整分布和它们的联合概率分布,否则你将不能如此容易地确定这一点。嗯,我认为这些是非常有趣的观察结果,让你对评估分类器的测试统计有了一点点的了解,以及分类系统的敏感性和特异性在含义方面也有什么影响。

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

来自模式识别讲座CC BY 4.0 下的图像。

我准备了一套额外的练习题,你可以思考一下,以便更深入地理解我在这个视频中展示的内容。特别是,你应该考虑改变敏感性和特异性,并考虑这将如何改变假阳性和假阴性的数量。此外,我认为筛选文献并寻找其他疾病等论文中报道的敏感性和特异性将是有趣的。因此,这可以帮助你了解分类器的相关性,你会得到多少假阳性等等,我还建议检查不同疾病的流行率,因为一些疾病非常流行,然后你会对假阳性和假阴性产生非常不同的影响,而不是以不同速率发生的疾病。所以我这里有两个例子,检查信用卡欺诈,你会发现欺诈实际上很少发生。因此,想象一下这对假阳性率的要求意味着什么,然后检查关于社交机器人的文献,这也非常有趣,因为分类器的准确性非常低。然后你可以思考这对于研究中发现和报道的机器人可能意味着什么,是的,你会看到这实际上是一个非常有趣的现象。如果你有一个非常糟糕的分类器,我的意思是它当然会识别社交机器人,但它真的有助于你判断这个人是否真的是社交机器人吗?以如此低的准确度进行大规模筛选真的是一件非常有意义的事情吗?你自己想一想,另一个非常有趣的问题是,如果你知道检测的灵敏度和特异性,并且有观察到的阳性和阴性数量,就可以计算实际的患病率。所以这也是你可以在一道习题中思考的。这已经把我们带到了这一单元的结尾。

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

来自模式识别讲座CC BY 4.0 下的图像。

所以保持健康,远离僵尸,是的,我不想让你失去希望。记住,如果查克·诺里斯被僵尸咬了,诺里斯不会变成僵尸,但僵尸会变成查克·诺里斯。所以这里有一些联系方式,如果你想跟进,看更多的视频。

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

来自模式识别讲座CC BY 4.0 下的图像。

所以我想我还有一些关于模式识别和机器学习的有趣的事情。这已经把我们带到了这个视频的结尾,我希望你看这个有一些乐趣,你对敏感性和特异性有一点点的了解,这意味着什么,这与假阴性和假阳性有什么关系,如果你在这方面做错了什么,实际上影响会有多大。非常感谢您的观看,并期待在其他视频中再次见到您。拜拜。!

如果你喜欢这篇文章,你可以在这里找到更多的文章,或者看看我们的讲座。如果你想在未来了解更多的文章、视频和研究,我也会很感激关注 YouTubeTwitter脸书LinkedIn 。本文以 Creative Commons 4.0 归属许可发布,如果引用,可以转载和修改。如果你有兴趣从视频讲座中获得文字记录,试试自动博客

句子嵌入:没有足够的数据?只需申请退学两次!

原文:https://towardsdatascience.com/sentence-embeddings-not-enough-data-just-apply-dropout-twice-e5122533786?source=collection_archive---------11-----------------------

评论一篇有趣的论文,该论文提出了一个简单的对比学习框架,可以产生优秀的句子嵌入

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

埃罗尔·艾哈迈德Unsplash 上拍摄的照片

太多的未标记数据和创建标记数据的成本太高是深度学习中的常见问题。在计算机视觉中,我们可以使用数据扩充来生成更多的标记数据或提高模型的泛化能力。但是自然语言处理中的数据扩充往往不能有效地改进模型,而且可能会损害模型。高等人(2021)提出了 SimCSE,这是一种对比学习模型,利用简单而优雅的数据增强方法在监督和非监督文本相似性任务中实现 SOTA 结果。

无监督 SimCSE

在讨论 SimCSE 之前,我们应该知道句子嵌入被用来表示句子的特征向量。提取句子嵌入的常见方式是使用 BERT liked 大型预训练语言模型来提取[CLS]标记嵌入作为句子嵌入。SimCSE 使用预训练的 BERT 或 RoBERTa,在[CLS]表示的顶部有一个 MLP 层,作为编码器来获得句子嵌入。

SimCSE 作为一种对比学习模型,需要输入句子的正对和负对进行训练。作者简单地使用 dropout 向输入句子注入噪声来生成正对,并使用其他句子作为负对。是的,他们使用了 dropout 作为数据扩充方法!换句话说,一个输入的句子通过一个带有 dropout 的编码器得到第一个句子嵌入, v1 再通过编码器再次传递句子得到第二个句子嵌入, v2 得到正对( v1v2 )。

有人可能会问,将一个句子通过同一个编码器两次,不会仅仅返回两个相似的句子嵌入吗?注意,基于 transformer 的编码器最初带有随机丢弃掩码,因此将一个输入句子通过编码器两次会导致两个稍微不同的句子嵌入。通过这种简单的方法,在 100 万对英语维基百科数据上训练的无监督 SimCSE 在标准语义文本相似性(STS)任务上取得了 SOTA 结果。

监督 SimCSE

除了无监督训练,高等人(2021)还利用来自 SNLI (Bowman 等人,2015)+ MNLI (Williams 等人,2018)数据集的标记数据,进一步研究了 SimCSE 的性能。所选择的数据集由标记有蕴涵、矛盾和中性的句子对组成。他们用蕴涵对来构造肯定对,而否定对来自矛盾对。实验结果表明,标记数据的引入进一步提高了性能。下图显示了无监督和有监督模型的实验结果。

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

高等(2021)的结果

作者在 HuggingFace 的支持下在 Github 上发布了源代码。我们可以打开一个 Google Colab 笔记本,快速运行回购中提供的一些例子。

结论

令人惊讶的是,我们在几乎每个深度学习模型上应用的简单辍学可以用来进行数据增强。在计算机视觉上测试相同的方法并将其与常用的图像处理方法进行比较可能会很有趣。

我个人认为无监督的 SimCSE 具有更大的价值,并且非常有用,因为我们经常处理大量未标注的数据。无监督学习应该是未来人工智能的趋势,因为它可以更好地利用大数据集,并避免监督学习中的常见问题,如标签噪声。

这个故事只解释了原著的一小部分,我强烈建议你阅读原著以获得全面的理解。

参考

塞缪尔·r·鲍曼、加博·安格利、克里斯托弗·波茨和克里斯托弗·d·曼宁。2015.用于学习自然语言推理的大型标注语料库。在自然语言处理的经验方法(EMNLP) 中,第 632–642 页。

高天宇、姚兴成和陈。2021.SimCSE:句子嵌入的简单对比学习。 arXiv:2104.08821

艾迪娜·威廉姆斯,尼基塔·南吉亚,塞缪尔·鲍曼。2018.通过推理理解句子的大范围挑战语料库。计算语言学协会北美分会:人类语言技术(NAACL-HLT ),第 1112–1122 页。

句子转换微调(SetFit):在少量文本分类方面优于 GPT-3,但体积却小了 1600 倍

原文:https://towardsdatascience.com/sentence-transformer-fine-tuning-setfit-outperforms-gpt-3-on-few-shot-text-classification-while-d9a3788f0b4e?source=collection_archive---------3-----------------------

GPT-n 系列在少数镜头 NLP 分类任务中表现出非常有前景的结果,并随着模型规模的增加而不断改进(GPT 3–175B)。然而,这些模型需要大量的计算资源,并且它们对训练提示的选择很敏感。在这项工作中,我们演示了句子转换器微调(SetFit),这是一种简单有效的少量文本分类方法。该方法基于用特定于任务的数据来微调句子转换器,并且可以容易地用句子转换器库来实现。我们通过将 SetFit 应用于 RAFT(真实世界少数镜头文本分类)基准测试来验证它,并显示它令人惊讶地优于 GPT-3 等模型,同时它的规模是 1600 倍,并缓解了对即时训练和使用未标记数据的需求。此外,我们的方法有助于缩小机器和人类性能之间的差距,只需提供 50 个实例进行训练。

简介

有监督神经网络在不同领域和领域的许多任务中表现出显著的性能,但是它们需要大量的标记训练数据。数据标记过程是劳动密集型和成本高昂的,并且阻碍了人工智能系统在行业中的部署。人工智能中的迁移学习(TL)对于低数据资源场景实现了相当大的鲁棒性。NLP(Ruder et al . 2019)中的 TL 涉及两个步骤:使用未标记数据训练的预训练语言模型(PLM)和针对特定任务的第二步微调。在 BERT (Devlin 等人,2019)等标准微调设置中,PLM 顶部的通用分类头输出用于生成最终预测的表示。基于 LM 微调的文本到文本【1】的最新进展实现了 SOTA 少数镜头性能,包括上下文学习和任务特定提示学习。

情境学习模型根据作为提示提供的输入-输出训练示例直接生成答案,而不改变其参数。GPT-3(布朗等人,2020 年)利用上下文学习来证明在许多自然语言处理任务中优越的少数镜头能力。它的主要缺点是需要一个庞大的模型,只依赖于预先训练的知识,并且需要大量的快速工程。

任务特定提示学习将下游任务转换成屏蔽语言模型问题,由此在提供由任务特定模板定义的提示时,该模型生成作为屏蔽标记预测的文本响应。开拓性的模式开发训练(PET)方法(Schick & Schutze 2021a,b)结合了这种模式,并被证明在使用小三个数量级的模型的少量学习中胜过 GPT-3。然而,这种设置有几个限制:它需要多步训练,包括适应和几个 PLM 的集合;它利用特定任务的未标记数据;并且需要手工制作提示。ADAPET (Tam 等人,2021 年)通过利用更多的监督来训练模型,在没有任何未标记数据的情况下,在少量强力胶上的表现优于 PET。LM-BFF (Gao 等人,2021)通过将基于提示的微调(FT)与自动提示生成相结合,并动态选择任务示例作为输入上下文的一部分,提供了改进的少量微调性能。

最近,出现了几个针对 NLP 中少数镜头学习的基准,如 RAFT (Alex 等人,2021),FLEX (Bragg 等人,2021),和 CLUES (Mukherjee 等人,2021)。RAFT 是一个真实世界的少量文本分类基准,它只提供 50 个样本用于训练,没有验证集。它包括 11 个实际的现实世界的任务,如医疗案例报告分析和仇恨言论检测,其中更好的性能直接转化为更高的企业价值。该基准包括 GPT-3 产生的结果,成为比较的标准基线。在一篇相关的论文(Schick & Schutze 2021c)中,研究表明,像 PET 这样基于提示的学习者在 RAFT 基准测试中表现出色,在 11 个任务中有 7 个任务的表现接近人类水平,而没有使用任何验证数据。

在这篇博客中,我们介绍了 SetFit,一个经过调整的句子转换器模型,它通过少量数据进行微调,以解决现实世界中的文本分类挑战,如 RAFT。也就是说,验证 SetFit 是文本分类的通用灵丹妙药超出了本研究的范围。博客是这样组织的:我们从句子变形金刚相关的背景开始,然后提供改编方法的详细描述。由于目标基准缺乏任何验证数据,我们不得不根据外部相关任务搜索最佳参数集。我们选择 SST-2 作为我们的验证数据集,并进行评估以选择 RAFT 实验的最佳参数。下一步是为 RAFT 任务微调 SetFit,并执行预测 RAFT 的测试数据,同时利用几种试探法和最佳实践。我们每项任务的表现都会在 RAFT 的排行榜网站上公布。在发表后 [2] SetFit 排名第二,紧随人类基线之后,在 11 个任务中的 7 个任务中超过了 GPT-3,尽管它比 x1600 小(见图 1)。

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

图 1: F1 对比:筏形基准上塞特菲 vs GPT-3

方法

句子转换器(ST) 是一种非常流行的方法,用于语义搜索、语义相似性和聚类。其思想是基于句子的语义签名对句子的唯一向量表示进行编码。如图 2 所示,在对比训练期间,通过在 Siamese 架构中采用 transformer 模型来构建表示(Remiers & Gurevych 2019),旨在最小化语义相似的句子之间的距离,最大化语义遥远的句子之间的距离。

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

图 2:连体 BERT 架构

当应用于句子对之间的大规模比较时,句子转换器产生非常有效的表示,这是信息检索任务中非常常见的情况。STs 对于其他流行的 NLP 任务也是有效的,例如情感分析和命名实体识别,因为它们将文本转换为数值结构,然后很容易用现成的机器学习(ML)工具包和流行的 NLP 生产框架(例如spark NLP【3】)进行缩放、操作和处理。

sentence-transformers [4]是 ST 表示的模型中枢,包括一个抽象 API 和代码示例,用于在生产中训练、微调和推理 ST。

用于文本分类的 ST使用 ST 进行文本分类的想法并不新颖,它包括一个编码步骤和一个分类步骤(如逻辑回归)。ST 性能优于其他嵌入表示,但无法与交叉编码器(如 BERT)分类相媲美(Remiers & Gurevych 2019)。令人惊讶的是,我们没有发现任何以连体方式为文本分类执行端到端 ST 微调的工作。原因可能是 STs 是在语义相似性任务上预先训练的(即句子对传达相同/不同的意思),并且为了相同的目标而进一步调整它们是直观的。此外,直到最近,具有显著性能提升的新 ST 模型才作为语句转换器(例如基于 MPNet 的具有大数据训练的模型)和其他模型(例如 SimCSE )的一部分发布,并且它们可能仍在为非相似性任务进行探索。

SetFit —句子转换器微调图 3 是 SetFit 的训练和推理阶段的框图。交互式代码示例可以在这里【5】找到。

训练阶段的第一步是从句子-变形金刚[6]模型中枢中选择一个 st 模型。以下步骤是设置训练类、填充训练数据加载器和执行微调。为了更好地处理少数镜头场景中数量有限的标记训练数据,我们采用了一种经常用于图像相似性的对比训练方法(Koch et al. 2015):训练数据包括正面和负面句子对,其中正面对是从同一类中随机选择的两个句子,负面对是从不同类中随机选择的两个句子。句子对生成伪代码如图 4 所示。在每个句子对迭代中,我们生成 2x N 个训练对,其中 N 是每个任务的训练样本总数。生成的句子对用于微调(拟合)ST 模型。

在微调步骤的最后,产生一个适应的 ST。接下来,使用适应的 ST 对句子训练数据进行编码,然后为了简单起见,利用编码的数据来训练逻辑回归(LR)。在推理阶段,每个测试句子都用适应的 st 编码,然后用 LR 模型预测其类别。

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

图 3: SetFit 的示意图

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

图 4:句子对生成伪代码

实验

RAFT (Alex et al. 2021)是一个少数镜头分类基准,旨在通过将训练样本的数量限制为每个任务 50 个标记的示例,而不提供验证集,来匹配真实世界的场景。前者对于从业者来说是困难的,因为找到最佳的训练超参数集是具有挑战性的。影响 SetFit 性能的突出特征包括:

  1. st 的类型:句子-变形金刚模型中枢中的 ST 有很多种类型,问题是如何为给定的任务选择最佳的 ST。
  2. 输入数据选择:在一些 RAFT 任务中,提供了几个数据字段作为输入,例如标题、摘要、作者姓名、ID、数据等。这就产生了一个问题:哪些数据字段应该用作输入,以及如何组合它们?
  3. 超参数的选择:如何选择最佳的微调超参数集(例如#epochs,句子对生成迭代的次数)?

最后,我们应用简单的试探法和常识来选择 ST 模型、输入数据字段、超参数和序列长度。在接下来的部分中,我们将描述选择这些参数的最佳实践。

ST models 句子变形库包含了大量可供选择的句子嵌入模型。模型名称对应于它们所基于的转换器的类型以及训练数据集。例如,“释义-mpnet-base-v2”模型使用释义相似性数据集用 mpnet 模型来训练。

对于如何为下游 NLP 任务选择最佳模型或训练数据集,没有明确的指导原则,尽管对于相似性任务存在一些经验法则。由于 RAFT 是一个文本分类数据集,我们假设它将受益于一个嵌入模型,该模型被训练来检测句子对之间的语义相似性,因为这有点类似于文本分类设置中类之间的相似性。因此,我们考虑嵌入使用“所有或“释义训练数据集训练的模型,并将其设计为通用模型,我们排除了使用 NLIQ & A 数据集训练的嵌入模型,这些数据集与文本分类任务非常不同。

我们只瞄准尺寸与 BERT-110M 相当的型号。我们还测试了 STs 的蒸馏版本,如 TinyBERT-80M 和 MiniLM-80M,但发现它们的性能与原始教师模型不可比(见附件 A)。

考虑到以上所有因素,我们为验证步骤选择了以下三个候选模型。这些模型在句子变形器的句子嵌入性能中排名最高,如表 1 所示。

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

表 1:语义相似性任务的性能和被选择用于在 SST-2 数据集上验证 SetFit 的三个候选 ST 模型的大小

使用 SST-2 作为验证集我们在 SST-2 数据集上验证了 SetFit,这是广泛使用的 GLUE 基准测试的一部分。SST-2 是试探性选择的,因为它与大多数 RAFT 基准任务具有几个共同的品质,例如:

●相对较短的序列长度(< 64)

●丰富的语义和句法结构,与其他分类器相比,Transformer 具有较高的准确性

●代表真实生活场景

SST-2 的选择不是 RAFT 的最佳选择,但可以作为替代验证集,因为 RAFT 不提供验证数据,也不为测试数据提供金标签。

通过从完整的 SST-2 训练数据中为每个类别随机选择少量训练样本(16 或 50)来模拟少炮设置,以适应和训练 ST。训练过程重复五次,每次使用不同的随机种子。通过对五次迭代的推理结果进行平均来产生最终的准确度。

ST 模型选择表 2 显示了三个候选模型在 ST 模型微调(Fit)和不微调的情况下的性能,并与 PET 的性能进行了比较,PET 使用 RoBERTa 和 3 进行了标准微调(高等人,2021 年)。

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

**表 2:SST-2 数据集上不同 ST 模型的少量和完整训练集性能与基线的对比。任务特定提示。 *标准微调。*上下文微调。据报道(高等 2021)。

如表 2 中所示,三个候选模型相当可比,具有 50 个训练样本的“释义-mpnet-base-v2”模型证明了略好的性能。因此,我们选择这个模型来评估我们的方法在 RAFT 基准上的性能。

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

图 5:微调后(左)和微调前(右)在paraphrase-MP net-base-v2ST 输出的二元分类任务的训练向量的 2D 表示。k 代表每类训练样本的数量。蓝色圆点代表类别“0”,而橙色圆点代表类别“1”。

少量的历元、句子对生成的五次迭代和 ST 微调足以达到收敛,并在 2D 向量空间(使用 T-SNE 建立)中产生良好的可分性。图 5 显示了训练数据的 2D 投影,有和没有 ST 微调。可以看出,与没有微调的相同模型相比,微调步骤显著提高了少量训练数据的可分离性,这导致 SST-2 测试的精确度更高。

超参数 选择以下是基于 SST-2 数据集实验选择的参数。我们对所有的 RAFT 基准测试使用了相同的参数集,除了任务 4(见表 3 ),为了达到可接受的分离,我们将迭代次数增加到了 10 次。

● ST 模型= '释义-mpnet-base-v2 ’

●train _ loss = CosineSimilarityLoss

●#纪元数= 3

●句子对生成迭代次数= 5

●批量= 16

●预热步骤= 10

数据字段选择RAFT 基准测试中的任务 3、7 和 8 包含多个数据字段作为额外的元数据(如日期、个人姓名和职务)。在这些情况下,我们确保只保留一个主要的文本特征,该特征直观地包括用于正确分类句子的足够的上下文。表 3 显示了每个任务的可用数据字段,以及所选择的数据字段(以粗体显示),以及(mean+std)/max 文本长度。

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

表 3: RAFT 的数据字段和(均值+标准差)/最大文本长度

序列长度选择如表 3 所示,任务 3、4、7 和 8 包括长文本序列(> 256 个标记),这可能会导致意外结果(SetFit 仅针对 SST-2 进行验证)和微调期间的内存分配错误(取决于您的硬件设置)。在这些情况下,我们将输入文本长度限制为 128 个标记,如下所示:对于任务 4、7 和 8,我们选择了前 128 个标记,但是对于任务 3,我们选择了后 128 个标记,因为我们注意到正确分类的相关上下文通常位于文本输入的最后部分。

大量句子对生成迭代对 SST-2 数据集实验的分析表明,五次句子对生成迭代和 ST 微调足以实现代表不同类别训练样本的向量的 2D 投影之间的良好分离(见图 5)。因此,我们对所有的 RAFT 任务使用了五次迭代,除了任务 4,为了达到可接受的分离,我们将迭代次数增加到 10 次。

其他最佳实践没有对文本输入进行预处理。在 RAFT 数据集的任务 2 (Banking_77)中,由于标签样本具有相当稀疏的表示(77 个意图类别中只有 36 个在训练数据中包括至少一个样本),我们将标签的名称作为输入样本添加到该类别。这是一个微不足道的附加,因为在文本分类任务中,类的名称(或它们的描述)是给定的。

结果表 4 显示了 RAFT 排行榜的快照(2021 年 11 月)。SetFit 的总分是 0.669,在人类基线之后排名第二,比 GPT-3 高出 0.042 分。令人惊讶的是,在基准测试的 11 个任务中,SetFit 在 7 个任务中超过了 GPT3,在 NIS 任务中,SetFit 甚至超过了人类基线。

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

表 RAFT 排行榜快照(2021 年 11 月)

讨论

以下是基于将 SetFit 应用于 RAFT 基准测试的结果的一些想法:

●我们预计,ST 模型的集合,以及基于 RoBERTa large 等大型模型的 ST 模型,最终将在 RAFT 上实现更好的整体性能(如附录 A 中 SST-2 所示)。

●对于 NIS 任务,将文本输入长度限制在最后 128 个字符似乎是一个好的实践,对性能有积极的影响。

●将类别名称添加到 Banking_77 任务的训练数据中似乎非常有效,这可能导致比 GPT-3 更大的准确性优势(超过 0.2 点)。

●一个有趣的反常现象是,该表显示,一方面,在 NIS 和 OSE 任务中,SetFit 远远超过 GPT-3,甚至在 NIS 任务中超过了人类基线。另一方面,GPT-3 在 SOT 任务中的表现远远超过 SetFit 这可能与 SOT 任务比其他任务需要更多事实知识的直觉有关。

●通过将文本分类的一般问题解耦到句子嵌入生成和预测的两个阶段,实现了显著的准确性/效率提高,这乍一看似乎令人惊讶,但对于 SOTA 自然语言处理任务来说并不新鲜。事实表明,开放式问答的检索和阅读器架构(例如 Lewis 等人的 RAG)能够使小得多的模型获得与 T5–11B 等较大模型相当的结果。总的来说,SetFit 和 RAG 的分离带来了更高的健壮性(新数据/类别不需要重新训练)、可解释性和可伸缩性(更高级别的并行化)。

●SetFit 为 SST-2 数据集生成的结果(如附录 A 所示),例如使用“all-roberta-large-v1”模型的完整训练集的准确度为 95.4,这将使 set fit 在 SST-2 排行榜 [7]上排名前 20。这些基于句子表征的高质量结果与句子表征被认为仅传达浅层信息并因此导致准确度下降的常见假设相反。

结论和未来工作

我们提出了 SetFit,一种有效的少镜头文本分类方法,它基于流行的句子转换库,基于预先训练的 ST 表示和微调。SST-2 数据集上的实验和 RAFT 基准上的提交结果证明了 SetFit 与大两到三个数量级的模型(如 GPT-3 和 GPT-近地天体)相比的有效性,以及对比培训对进一步改进下游 NLP 任务的 STs 的重要性。在未来的工作中,我们打算探索如何用 SetFit 实现无监督学习,以及如何将其扩展到其他任务,特别是两句话文本分类,如 NLIQ & A

致谢

我们非常感谢柳文欢·佩雷格(英特尔实验室)、尼尔斯·雷默斯(拥抱脸)、卢克·贝茨(UKP —达姆施塔特)富有成效的评论和更正。

[1]https://ruder.io/recent-advances-lm-fine-tuning/

[2]最近,PET 进入 RAFT 排行榜,在人类基线之后排名第一,PET 基于比 SetFit 大 x2 的 ALBERT 模型(xxlarge,v2,235M 参数)。

[3]https://nlp.johnsnowlabs.com/

[4]https://www.sbert.net/

[5]https://colab . research . Google . com/github/MosheWasserb/set fit/blob/main/set fit _ SST _ 2 . ipynb

[6]句子-默认情况下,变形金刚包括 ST 对象的微调选项。

[7]https://papers with code . com/sota/opinion-analysis-on-SST-2-binary

参考文献

汤姆·布朗、本杰明·曼、尼克·赖德、梅拉妮·苏比亚、贾里德·D·卡普兰、普拉富拉·达里瓦、阿尔温德·尼拉坎坦、普拉纳夫·希亚姆、吉里什·萨斯特里、阿曼达·阿斯凯尔、桑迪尼·阿加瓦尔、阿里尔·赫伯特沃斯、格雷琴·克鲁格、汤姆·海尼汉、雷文·蔡尔德、阿迪蒂亚·拉梅什、丹尼尔·齐格勒、杰弗里·吴、克莱门斯·温特、克里斯·黑塞、陈唐山、埃里克·西格勒、马特乌斯·利特温、斯科特·格雷、本杰明·切斯、杰克·克拉克、克里斯托弗·伯纳、萨姆·麦卡德里什、亚历克·拉德福德语言模型是一次性学习者。NeurIPS 2020。

塞巴斯蒂安·鲁德马修·e·彼得斯斯瓦巴·斯瓦扬迪普塔托马斯·沃 lf。自然语言处理中的迁移学习。NAACL 2019。

雅各布德夫林张明伟肯顿李克里斯蒂娜图塔诺瓦。 BERT:用于语言理解的深度双向转换器的预训练。NAACL 2019。

提莫·希克和辛里奇·舒茨。2021a。利用完形填空题进行少量文本分类和自然语言推理。EACL 2021。

提莫·希克和辛里奇·舒茨。2021b。重要的不仅仅是规模:小型语言模型也是很少尝试的学习者。NAACL 2021。

德里克·塔姆,拉克什·梅农,莫希特·班萨尔,沙尚克·斯里瓦斯塔瓦,科林·拉弗尔。改进和简化花样拓展训练。EMNLP 2021。

提莫·希克和辛里奇·舒茨。2021c。真正的带提示的少量学习——现实世界的视角

尼尔斯·雷默斯和伊琳娜·古雷维奇。句子-伯特:使用连体伯特网络的句子嵌入。EMNLP 2019

格雷戈里·科赫,理查德·泽梅尔,鲁斯兰·萨拉胡季诺夫。用于一次性图像识别的连体神经网络。2015

天宇高,亚当费舍尔,陈 2021。使预先训练的语言模型成为更好的少量学习者。ACL 2021。

Neel Alex、Eli Lifland、Lewis Tunstall、Abhishek Thakur、Pegah Maham、C. Jess Riedel、Emmie Hine、Carolyn Ashurst、Paul Sedille、l . Alexis Carlier、Michael Noetel、Andreas Stuhlmüller。 RAFT:一个真实世界的少镜头文本分类基准。NeurIPS 2021,数据集和基准跟踪。

乔纳森·布拉格,阿尔曼·科汉,凯尔·洛伊兹·贝尔塔吉。 FLEX:统一评估少镜头 NLP 。NeurIPS 2021。

苏伯拉塔·慕克吉、、郑国庆、萨加尔·侯赛尼、格雷格·杨、克里斯多夫·米克、阿瓦达拉、高剑锋。线索:自然语言理解中的少量学习评价。NeurIPS 2021,数据集和基准跟踪。

Patrick Lewis、Ethan Perez、Aleksandra Piktus、Fabio Petroni、Vladimir Karpukhin、Naman Goyal、Heinrich Küttler、迈克·刘易斯、Yih Wen-tau、Tim rocktschel、Sebastian Riedel、Douwe Kiela。知识密集型自然语言处理任务的检索增强生成。NeurIPS 2020。

附录 A

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

图 6: SST-2 对句子转换模型的评估。 3 个模型的集合:释义-mpnet-base-v2、All-mpnet-base-v1 和 Stsb-mpnet-base-v2*

使用 BERT 词义消歧和 T5 转换器的 Sentence2MCQ

原文:https://towardsdatascience.com/sentence2mcq-using-bert-word-sense-disambiguation-and-t5-transformer-e6bb5aaba29b?source=collection_archive---------14-----------------------

使用 HuggingFace transformers 和 Gradio App 的实用人工智能项目

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

作者图片

实际使用案例

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

来自平面的图标图标

想象一下,中学的英语老师正在为第二天的课准备阅读理解测验。老师不会给出过时的评估**,而是会根据当天的热门新闻文章快速生成一些评估(mcq)。**

一个人在回路中的管道可以是这样的,其中新闻文章被总结成几个重要的句子,并且从每个句子中提取一个关键字以形成一个 MCQ 问题。然后,教师可以使用 NLP接受或拒绝自动生成的问题,只保留高质量的问题进行测验。这为教师准备评估节省了大量的时间,同时也增加了学生的参与度,因为它基于当前的热门话题。

投入

我们程序的输入将是任何带有突出显示的关键字的句子(例如:cricket ),问题需要围绕该句子被框住。

示例输入 1:

**Mark's favorite game is **cricket**.**

示例输入 2:

**Mark is annoyed by a **cricket** in his room.**

输出

我们将把任何给定的句子转换成如下所示的 MCQ

输出例如输入 1:

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

作者图片

输出,例如输入 2:

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

作者图片

请注意,我们能够智能地将单词 cricket 在第一句中区分为游戏**,在第二句中区分为昆虫,并相应地生成干扰项(错误的 MCQs)。**

算法

给定我们的输入句子 eg: Mark 最喜欢的游戏是cricket**,我们提取关键字** (cricket)和句子,并将其交给 T5 转换器算法,该算法被训练为接受上下文答案作为输入,并生成问题

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

作者图片

我们并行地将句子( Mark 最喜欢的游戏是cricket**)** 和高亮显示的关键词作为输入传递给基于 BERT 的算法,该算法被训练来进行词义消歧(WSD)并从 Wordnet 中识别正确的词义

如果我们有一个句子**“蝙蝠飞入丛林,落在一棵树上”和一个关键词“蝙蝠”**,我们就自动知道这里我们说的是有翅膀的哺乳动物蝙蝠,而不是板球拍或棒球棒。

虽然我们人类很擅长,但算法不太擅长区分这两者。使用算法来区分给定单词的确切上下文含义的想法被称为词义消歧 (WSD)。

WordNet 是一个大型的英语词汇数据库。在 Wordnet**“bat”有几个义项**(上下文含义)一个表示板球拍,一个表示会飞的哺乳动物,等等。在给定单词的所有几种可能的含义(上下文含义)中,我们的目标是找到句子中给定单词的正确含义。

我们将使用令人敬畏的 BERT-WSD 项目,它是预训练的来识别句子中给定单词的正确含义

给定一个像**(He caught a [TGT] bass [TGT] yesterday)**一样突出显示关键字的句子,BERT-WSD 将对 Wordnet 中所有可能的词义进行评分和排序,如下所示。我们使用具有最高概率的意义并提取干扰物。

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

图片来自 BERT-WSD 回购

使用 Wordnet 生成干扰项

假设我们得到一个单词,比如" Red "并识别它的义项,然后我们使用 Wordnet 找到它的上位词。一个上位词是一个给定单词的更高层次的类别。在我们的例子中,颜色红色的上位词。

然后我们去寻找所有属于颜色组的颜色的下位词(子类别),它们可能是紫色、蓝色、绿色等。因此,我们可以使用紫色、蓝色、绿色作为给定 MCQ 的干扰物(错误答案选项),该的正确答案是红色。紫色、蓝色、绿色也被称为红色的的同音异义词

因此,使用 Wordnet,提取一个给定单词的同音异义词就能得到该单词的干扰词。所以在下图中,红色的干扰物是蓝色、绿色和紫色。

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

来源:https://en.wikipedia.org/wiki/Hyponymy_and_hypernymy

类似地,对于我们的例子,我们提取单词 Cricket 的同音异义词,得到 FootballPoloUltimate fribsee等作为干扰词。

谷歌 Colab 笔记本

这里有一个易于使用的谷歌 Colab 笔记本,上面有所有必要的代码。

密码

安装必要的库:

!pip install --quiet transformers==2.9.0
!pip install --quiet nltk==3.4.5
!pip install --quiet gradio==1.4.2

连接您的个人 google drive 来存储经过训练的 BERT-WSD 模型

from google.colab import drive
drive.mount('/content/gdrive')

此处下载预先训练好的 BERT WSD 模型

点击链接左上方的下载按钮,下载一个名为“Bert _ base-augmented-batch _ size = 128-lr = 2e-5-max _ gloss = 6 . zip”的文件。将 zip 文件放入 Google drive home 文件夹。

使用下面的代码将上面的文件解压到你的 Google drive 中。

import os
import zipfilebert_wsd_pytorch = "/content/gdrive/My Drive/bert_base-augmented-batch_size=128-lr=2e-5-max_gloss=6.zip"
extract_directory = "/content/gdrive/My Drive"extracted_folder = bert_wsd_pytorch.replace(".zip","")#  If unzipped folder exists don't unzip again.
if not os.path.isdir(extracted_folder):
  with zipfile.ZipFile(bert_wsd_pytorch, 'r') as zip_ref:
      zip_ref.extractall(extract_directory)
else:
  print (extracted_folder," is extracted already")

初始化 BERT-WSD 模型

为 BERT-WSD 创建预处理步骤,为问题生成初始化 T5 转换器并定义 Wordnet 干扰项提取函数。

运行 get MCQs 函数,将一个给定的句子和高亮显示的关键字作为输入。

上面的输出是-

**Question:** What is Mark's favorite game? 
**Correct Answer :** Cricket
**Distractors:** ['Ball Game', 'Field Hockey', 'Football', 'Hurling', 'Lacrosse', 'Polo', 'Pushball', 'Ultimate Frisbee'] 
**Sense from wordnet:** a game played with a ball and bat by two teams of 11 players; teams take turns trying to score runs

如你所见,我们输入了一个句子**(马克最喜欢的游戏是板球* *。)并正确生成正确答案的问题和相关干扰项(板球)。

现在让我们使用 Gradio 并构建一个漂亮的 GUI 来做同样的事情。

Colab 笔记本本身中,你得到一个漂亮的 GUI 来输入任何文本并在那里看到输出

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

作者图片

有时,如果单词不在 Wordnet 中,你不会得到任何干扰物。如果你想找到替代的方法来找到干扰物,在这里找到我的详细博客。

格拉迪欧是什么?

有了 Gradio 你可以为你的 ML 模型创建易于使用的图形用户界面,只需在你的 colab 笔记本上写几行代码。

最棒的是。你可以通过一个简单链接(例如: 12345.gradio.app )与你的非技术经理/朋友分享 GUI,以便在网络上的任何地方试用。Gradio 不仅仅是为了文字。你也可以上传一张图片作为输入,并在里面做任何预测。

使用自然语言处理的问题生成——教程

我推出了一个非常有趣的 Udemy 课程,名为“使用 NLP 生成问题”,扩展了这篇博文中讨论的一些技术。如果你想看一看,这里是链接

结论

希望你喜欢我们如何使用 NLP 解决从给定的句子生成 MCQ 的现实问题。

祝 NLP 探索愉快,如果你喜欢它的内容,请随时在 Twitter 上找到我。

句子片段标记器去神秘化

原文:https://towardsdatascience.com/sentencepiece-tokenizer-demystified-d0a3aac19b15?source=collection_archive---------1-----------------------

入门

深入探究句子分词器的内部工作原理,为什么它如此强大,以及为什么它应该成为你的首选。你可能会开始关心符号化。

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

克里斯蒂安·埃斯科瓦尔Unsplash 上拍摄的照片

我将是第一个承认学习记号化方案可能很无聊,如果不是非常痛苦的话。通常,在训练自然语言时,选择和实现标记化方案只是增加了一层复杂性。它会使你的生产流程变得复杂,用不合时宜的[OOV]或[UNK]来破坏气氛,或者可能只是把你送进 unicode 地狱的深处,在那里你想知道为什么是“字符串”!= “字符串”。

然而,就像你的第一杯真正的好酒,或者你第一次品尝高质量的寿司,一旦你品尝了这种好东西,你就会以完全不同的眼光看待剩下的东西。这篇文章旨在讨论 SentencePiece,并展示它使标记化过程变得多么轻松。在此过程中,您可能会认为标记化并没有那么糟糕。

什么是句子片断?

令人惊讶的是,它实际上并不是一个标记,我知道,误导。它实际上是一种从预编译列表中选择标记的方法,根据提供的语料库优化标记化过程。句子片断[1],是一个实现子字正则化算法[3]的包的名字(此处可用【2】)(全部由同一作者 Kudo,多久完成)。在这篇文章的持续时间里,我将继续使用 SentencePiece 来指代算法和它的包,因为这有望减少混淆。

如果你想要关于如何使用实际软件的说明,看一看文章结尾或参考文献[18]中的 colab 链接

句子的优点

  1. 它是用 C++实现的,速度快得惊人。你可以在几秒钟内训练一个 10⁵语料库的分词器。
  2. 标记化的速度也快得惊人。这意味着您可以直接在原始文本数据上使用它,而无需将标记化的数据存储到磁盘。
  3. 子词正则化就像数据扩充的文本版本,可以极大地提高模型的质量。
  4. 它是空白不可知的。您可以像训练英语或法语一样轻松地训练非空格描述的语言,如汉语和日语。
  5. 它可以在字节级工作,所以你几乎不需要使用[UNK]或[OOV]令牌。这不仅仅是针对句子。
  6. 本文[17]: 字节对编码对于语言模型预训练——【https://arxiv.org/pdf/2004.03720.pdf】T2 来说是次优的

SentencePiece 功能强大,但它的目的到底是什么?提到第(3)点,它使我们能够训练子字正则化任务,我们现在解释它。

子字正则化目标

我们在这一小节的目标是明确开发子字正则化的学习目标。首先,让我们考虑如何给序列分配概率。一般来说,我们喜欢认为序列包含一个方向,这意味着有一个向前和向后的方向。你按顺序说话。股票会随着时间的推移而上涨和下跌。因此,我们可以根据序列在早期的条件分布来确定它的分布。给定一系列单字 X = ( x_1,…,x_n),,通过重复应用贝叶斯规则,我们将其概率重写为

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

熟悉朴素贝叶斯方法[5]的读者应该知道这个公式。在朴素贝叶斯中,我们做一个条件独立性假设(强假设),如果 X 以某个变量 *y,*即 P(X|y)为条件,那么我们可以假设 p(x_2|x_1,y) = p(x_2 | y),p(x_3|x_2,x_1,y) = p(x_3|y) 等等。也就是说,如果我们得到了关于另一个东西 y 的信息,我们可以完全忘记 x_i 所依赖的所有变量 x_{j < i}

为了给这种简化做准备,我们考虑一下人工机器翻译的问题(NMT)。这里,我们想要评估给定输入句子 X. 的目标句子 Y 的概率 P(Y|X) 因为 YX 都是序列,我们可以写出概率【3】

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

这里,小写的变量表示实际的记号,大写的表示这些记号的顺序。θ代表我们的模型参数(神经网络的权重)。就目前情况来看,这个公式不太正确。实际上, XY 可以由指数数量的可能子字序列构成。想想分解“你好”这个词。我们可以用很多方式来标记:

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

甚至像“hello”这样的简单单词也可以呈现出指数数量的可能标记化

所以实际上,我们应该用特定的序列表示法 xy 来代替左边的 X 和 Y。SentencePiece 承认这一现实,并利用这一点。然后,我们可以将 NMT 任务的完整分段平均成本函数写成

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

|D|是可能分割的数量,x 和 y 都是从这些分割上它们各自的分布中提取的。l 是成本函数,P 和之前一样。

这个公式有点吓人,但是你不需要想太多。在实践中,我们能做的是去掉期望值 E ……,用单个随机分段的**代替 xy 。**就是这样。我们通常为训练 NMT 模型所做的其他事情都没有改变(这包括短长度惩罚和任何其他模型攻击)。

“使用一个样本”的近似应该为任何使用过变分自动编码器的人所熟悉[6],其中隐藏状态的期望值类似地由一个样本大小来近似。

既然我们已经定义了培训任务,我们必须回答实际问题;是的,很酷,但是我们如何在指数数量的状态上建立概率分布呢?!像科学中的其他事情一样,我们拼命地作弊和近似,直到有人告诉我们我们不能。

单字语言模型

从本质上来说,SentencePiece 只是另一个普通的老式单字符模型。这意味着,考虑仅仅两个令牌的联合分布 P(x_1,x_2) 都太难了,更不用说指定 P(X) 所需的 n 了。所以,我们只是做了近似:

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

受制于标准化约束:

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

其中每个子词(这里称为一元词)出现的概率独立于所有其他子词。是的,这是一个极端的假设,但从经验上来看并不太有害。

Unigram 语言模型非常常见,并且已经存在了一段时间。一种称为字节对编码(BPE)的流行方法,首先由 Gage [7]在信息文献中介绍,后来由 Sennrich 等人在 NMT 的上下文中使用。艾尔。[8](一篇可读性很强的论文 btw)是一种基于用最少所需信息位对文本进行编码的简单方法。BPE 的一个小变体叫做 WordPiece,是另一个流行的标记器,我们建议读者参考其他容易理解的摘要文章,如[9]以获得更好的概述。

原则上,SentencePiece 可以构建在任何 unigram 模型上。我们唯一需要喂它的东西是

  1. 单字概率
  2. 训练语料库

然后,我们只需在语料库上训练句子片段标记器,我们可以自由地执行子词正则化(或不正则化)NMT 训练。美妙之处在于,如果我们不想使用子词正则化,我们甚至不需要使用它。我们也可以使用 SentencePiece 作为快速标记器,让我们可以动态处理原始文本。

尽管做了极端的 unigram 假设,但如何训练标记器一点也不明显,这也是这篇文章的原因之一。我们将在下一节详细解释这一点。

但是为了实际做一些具体的事情,最终我们必须选择一个 unigram 模型。在这篇文章中,我们将使用 BPE,因为它简单明了,我们可以当场自制一个版本。

字节对编码

总的想法是这样做:

  1. 浏览你的语料库,找到所有的“字节”,即不可约的字符,所有其他字符都可以从这些字符中构建出来。这是我们的基地。它确保我们几乎总能重建任何看不见的输入。
  2. 在整个语料库上运行滑动窗口(实际代码略有不同)并找到最频繁的二元模型。二元模型由当前可见子词列表中的连续子词形成。因此,“hello”的计数是{“he”:1,“El”:1,“ll”:1,“lo”:1 }。
  3. 选择最常见的二元模型,将其添加到子词列表中,然后合并语料库中该二元模型的所有实例。
  4. 重复直到你达到你想要的词汇量。

通过总是挑选最频繁的二元模型(即字节对),我们本质上最小化了编码我们的语料库所需的编码长度,因此整个“最小化信息”的事情。

实际上,每当我们想要找到一个新的字节对时,循环遍历整个语料库是没有效率的。相反,我们在开始时循环一次,找到所有的单词(不是子单词,是实际的单词),并创建词汇表,,这是一个将单词与其字数相匹配的字典。然后,我们每次只需要在字典中循环单词,如果一个单词出现 20 次,那么它的任何子单词也将出现至少 20 次。

BPE 是一种增量的确定性方法。我们总是可以通过遵循相同的合并顺序来标记化。我想暂停一下,强调一下这一点的重要性。如果我们不遵循同样的顺序,一切都会乱套。在 BPE,我们首先对单词进行预处理,用一个特殊的标记来表示单词的换行。考虑这个词

船→B . o . a . t

假设我们的语料库谈论了很多关于蛇(大蟒蛇)、早餐和帆船的内容,那么我们可能会看到“蟒蛇”、“燕麦”和“船”这些词。如果我们谈论蛇多于早餐,我们可能会得到令牌化

(针对贪吃蛇爱好者)船→宝儿 t

(给早餐爱好者)船-> B 燕麦

如果我们从不谈论船只,那么令牌化者就永远不会排队。一个有蟒蛇,另一个有燕麦,他们不会同意。

撇开这个题外话,让我们直接进入 BPE 代码,因为这不是我们的主要关注点,它实际上在原始论文中已经写了一半了[8]

标准的 BPE 格式就是我们上面写的 Boat。由空格分隔的子词,带有单词结束标记。我们选择标记“_”而不是来更好地与句子对齐。

首先,在“initialize_vocab”方法中,我们通过获取所有单词及其计数来初始化词汇表,然后通过找到所有不可约字符来初始化标记。

get_bigrams 方法是确定最频繁二元模型的辅助方法。merge vocab 负责更新 vocab 以使用新的 bigram,并返回 bigram → bytepair merge,以便我们可以将操作存储在一个列表中。

最后,find_merges 函数完成实际查找二元模型的工作,fit 函数只是协调所有的 helper 方法。

如何训练句型

太好了!现在我们已经有了字节对编码器,可以在现场制造子字了,我们可以开始训练句子了。我们假设我们有一个大的二元模型集合,比我们最终想要的 vocab 大小要大。为了训练,我们想要最大化获得语料库的特定标记化 X=(x_1,…,x_n) 的对数概率,给定单字概率 p(x_1),…,p(x_n) 。由于只观察到完整的未标记序列 X ,实际的标记化( x_1,…,x_n) 未观察到*。这是使用 EM 算法的经典设置[10]*

所以应该很简单吧?只要翻到任何一本旧的 ML 教科书,复制/粘贴 EM 结果。嗯,…没有。问题是这些 x_i 的尺寸都不一样!

原来,语句块的代码实现使用贝叶斯方法训练,而论文描述使用最大似然 EM 方法。如果这是令人困惑的,只要知道一般贝叶斯=更难。要理解我所说的,你要么必须真正钻研 C++代码,要么只看我在参考文献[11]和[12]中告诉你的地方。

由于这一点将会出现,我们需要展示如何解决狄利克雷过程的基本贝叶斯 EM 问题。由于有点跑题,详情请见附录一。现在,我们将继续前进。

句型训练的目标如下。我们希望最大化对数似然

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

其中 x 是单字序列,S( x )表示所有可能序列的集合。同样,这些是隐藏变量,我们只看到未标记的语料库!为了解决这个问题,我们引入了 EM 类型的算法。如果你熟悉 EM,你会注意到步骤实际上是向后的,我们做一个 ME 方法。尽管名字很花哨,但它实际上非常直观和简单。这些步骤是:

  1. 初始化单字概率。记住 P( x ) = P(x_1)…P(x_n)所以一旦我们有了单字,我们就有了任何序列的概率。在我们的代码中,我们只是使用 BPE 频率计数来接近目标。
  2. M-step:给定当前概率,计算最可能的单字序列。这定义了单个标记化。实现这一点需要一些思考。
  3. 步骤 e:给定当前的标记化,通过计算标记化中所有子词的出现次数来重新计算单字概率。频繁词出现的概率就是该词出现的频率。在实践中,对此进行贝叶斯化(见附录)并不困难,而是进行计算

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

这里,c_i 是当前标记化中子词(unigram) i 的计数。m 是子词的总数。Psi 是 digamma 函数。箭头指示我们如何贝叶斯化。

4.重复步骤 2 和 3,直到收敛。对数似然理论上保证单调增加,所以如果不是这样,你就有一个错误。

我们就快到了,我们需要的最后一部分是如何计算第二步。

寻找最佳标记化

如果所有子字长度相同,这将是维特比算法的经典应用[13]。但是唉,生活并不是那么简单。维特比算法适用于以下问题

你有一些隐藏态 z_1,…,z_n,你想从 z_1 →z_2 →… →z_n 跃迁,你知道跃迁矩阵* A_ij,给出从 z_i^{(1)} → z_j^{(2)}的概率,其中 I 和 j 是隐藏态维数,上标是序列顺序。所有的转换都得到相同的矩阵。你可以使用维特比来构建一个最优路径*

问题是 A 不在相邻的州之间。为了理解这可能是一个问题,让我们用图解法表示一个简单的记号化过程。

考虑对单词“hello”进行标记。假设我们有子词:

{“他”、“h”、“ll”、“e”、“o”、“地狱”}。

然后,我们可以生成下面的“网格状”图形(它不是网格,因为我们没有显示到所有可能的隐藏状态(即字符)的转换,并且转换不限于最近的邻居,我们可以向右跳过不止一个框。):

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

来源:现作者。虚线描绘了基本的字符/字节间距。箭头指示哪些单词可以通过允许的标记到达。每一列代表一个隐藏的州 z_i^{(j)}.I 的维数由基本字符的数目给出,上标表示序列顺序。

每个箭头代表一个转换,我们也可以认为它带有一个概率,由从箭头的尾部(不包含)到头部(包含)创建的标记的一元概率给出。现在的目标是选择箭头,使我们以尽可能高的概率到达——序列的结尾。

这个问题有最优子结构,可以用动态规划来解决。假设我们处于状态(4)。有三个箭头,一个红色的,一个蓝色的,一个绿色的。(4)处的最大概率是三种可能选择中的最佳路径:来自红色、蓝色或绿色。在等式中:

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

我们差不多准备好编码了,但是还有一个问题。我们如何找到我们画的那些箭头呢?我们如何有效地做到这一点?为此,我们需要利用 Trie 数据结构[14]。有点有点难以用语言解释(双关!)所以让我们展示一下当前问题的 trie 是什么样子的:

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

来源:现作者。这是子词词典{‘h ‘,’ he ‘,’ hell ‘,’ hello’}对应的 Trie。还有额外的节点 -e- ,同样对于‘o’和‘l’也是如此,为了清楚起见,我们省略了这些节点。

根节点是序列开始标记。任何时候我们遇到 and 节点,它表示从到的路径中的所有东西都是有效的子字。词根将以我们的子单词列表中的每个唯一字符的一个分支开始。随着可用子词的增长,我们在 trie 中创建了更多的分支。Trie 将成为我们的标记器用来存储和检索子词的基本数据结构。

下面是 python 中的一个基本 Trie 实现,它将满足我们的所有需求:

我们现在已经得到了我们需要的一切。计算序列的实际算法可以根据我们是想要最佳序列(Viterbi)还是 n_best 而变化,因此我们将为此保留两个独立的函数。这类问题的动态编程解决方案很老了,所以它有其他的名字;它被称为前向-后向算法,是用于训练有向图形模型的和积算法的特殊子集[13,pg。613].更复杂的算法包括前向 DP 后向 A算法[15]和前向滤波和后向采样算法(FFBS) [16]。我们的解决方案会更接近后者。*

在展示代码之前,还有最后一点需要注意。当执行 max over p_{i T 是最长子字的长度。这可能是一个很小的数字,不应该损害我们的 O(N)算法。

*好了,下面是我们的**全句子训练器。*目前你只需要注意方法 1)前进 _ 步 2)后退 _ 步

向前和向后的步骤实现了我们刚刚谈到的算法。尽管后退一步还没有被讨论过。当我们计算向前的步长时,我们还存储在任何给定索引处结束的最大令牌的长度。这样,我们可以回溯所有导致最大概率的箭头,因为箭头的长度完全指定了转换!这是因为标记化的文本没有改变,这意味着隐藏状态被设置。我们实际上只是在选择每个角色跳多少步。

完整的 EM 步骤现在很容易组合在一起。我们遵循前面概述的步骤,并使用贝叶斯化的 EM 步骤,这就是为什么我们必须从 scipy 导入 digamma 函数。

还有一件事(再次双关)使这变得完整。一般来说,我们希望能够固定我们的 vocab 大小。sentencepiece 首先聚合比它实际需要的更多的子词标记。然后,我们执行修剪“回合”,从而优化 EM 算法,然后移除或修剪掉最不可能的 20%令牌(概率在 E 步骤中计算)。我们重复这个过程,直到我们达到我们想要的 vocab 大小。

fit 方法现在负责运行 EM 步骤,在每一轮后修剪,然后在需要进一步减少时继续。那是培训师。

子字采样

最后一部分是子字采样。免责声明,我们不使用相同的算法,但它足以生成随机令牌化并提供概念证明。

在向前向后传递中,我们只存储最优序列。为了找到可替换的记号化,在每个索引处,不是只保存最佳结束子词,而是保存 n_best 个结束子词。现在,我们可以通过从提供的列表中随机抽取每个最终子词来进行标记化。这给了我们子字正则化!

为什么是免责声明?好吧,如果你考虑一下,我们实际上仍然有和以前一样的问题,在本地随机抽样结束子词并不能保证完全标记化将是第二、第三、第四或任何最好的。要做到这一点,请查看实际的句子实现[2]或 FFBS 算法[16]。

随机抽样器由generalized_forward_stepgeneralized_backward_step方法提供。下面是一个输出示例

*Sample 1: ['h', 'e', 'l', 'l', 'o', '_', 'w', 'or', 'l', 'd']
Sample 2: ['h', 'e', 'l', 'l', 'o', '_', 'w', 'o', 'r', 'l', 'd'] Sample 3: ['h', 'e', 'l', 'l', 'o', '_', 'w', 'or', 'l', 'd']*

结论

这是一个深入句子的漫长过程,但我希望它是值得的。现在你对它的工作原理有了更多的了解,你可以很快忘记一切,只需要从文章顶部的要点中拼凑出你需要的**(仍然是双关语!!)😗*

  1. 速度速度速度。可以在训练时直接处理文本数据。
  2. 子词正则化→更好的模型、数据扩充、改进的语言建模预训练
  3. 可以很容易地标记非空白语言,如日语和汉语
  4. 不再有[UNK]代币(嗯…几乎不再有[UNK]代币)

如果你有任何 NLP 任务,请强烈考虑使用 SentencePiece 作为你的分词器。对于使用实际的软件,我发现下面的 google colab 教程非常有用

**https://colab.research.google.com/github/google/sentencepiece/blob/master/python/sentencepiece_python_module_example.ipynb

谢谢,祝令牌化愉快!

附录

在这里,我们讨论如何贝叶斯化你的 EM 算法。也可以跟着参考文献[12]一起读。

讨论基于平均场理论。我们将简单地使用它的主要结果,即用于确定隐藏参数/状态的后验分布的耦合方程。更多阅读见[13]的第 10 章。

变分推理的目标是确定我们的模型的未观测参数和/或状态的后验分布。我们从编写模型的日志证据开始:

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

这是我们之前定义的重复。还没有新消息。回想一下,X 是未标记化的语料库,S(x)表示所有可能的序列,粗体小写 x 表示特定的标记化。由于日志内部的求和,该模型是难以处理的。为了取得进展,我们首先引入隐藏变量 pi,表示单字概率。我们进一步将这些概率置于狄利克雷先验条件下,创建贝叶斯模型。我们写道:

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

概率 p(π|α)是对称的狄利克雷分布:

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

任何特定序列的概率都是其单字概率的乘积

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

x_{nk}二进制值(只能是 0 或 1 ),表示序列中的第 n 个位置是否由词汇表中的第 k 个子字给出。我们现在对后验分布作平均场近似

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

下标纯粹是标签;它们不代表维度之类的东西,它们只是名字。从这里,我们可以利用一般公式计算后验概率:

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

类似地,对于圆周率

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

将我们对对数模型证据的定义插入到期望值中,并取出所有未平均的项,我们找到两个方程

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

现在我们做如下观察。顶部的方程精确地是狄利克雷分布的形式,具有修正的先验。此外,由于 z_nk 是二元变量,我们可以将它们的期望作为各种单字的计数。我们用变量来定义它

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

这也只是一元计数。现在我们知道了圆周率的分布,我们可以用已知的结果计算它的期望值。B.21 或去维基百科——快得多]

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

把这个代入 log q_z(z)的方程,我们就找到了分布

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

这正是我们在权重 pi 上的分类分布!换句话说,我们立刻意识到括号里的东西就是我们的权重 pi。我们唯一需要提到的是,当应用贝叶斯化方法时,我们设置α= 0。这具有增强高计数单字和减少低计数的效果。

参考

[1]工藤,多久和约翰·理查森。" Sentencepiece:一个简单且独立于语言的子词分词器和去分词器,用于神经文本处理." arXiv 预印本 arXiv:1808.06226 (2018)。

[2]https://github.com/google/sentencepiece/

[3]工藤多久。“子词正则化:用多个候选子词改进神经网络翻译模型.” arXiv 预印本 arXiv:1804.10959 (2018)。

[4]史蒂文·斯科特。2002."隐马尔可夫模型的贝叶斯方法:21 世纪的递归计算."美国统计协会杂志。

[5]http://cs229.stanford.edu/notes-spring2019/cs229-notes2.pdf

[6]金玛、迪德里克·p 和马克斯·韦林。“自动编码变分贝叶斯.” arXiv 预印本 arXiv:1312.6114 (2013)。

[7]菲利普·盖奇。“一种新的数据压缩算法.”《用户杂志》第 12 卷第 2 期:第 23 至 38 页(1994 年)。

8 Rico senn rich、Barry Haddow 和 Alexandra Birch。"具有子词单元的稀有词的神经机器翻译."进行中。ACL 的(2016)。

[9]https://huggingface.co/transformers/tokenizer_summary.html

http://cs229.stanford.edu/notes-spring2019/cs229-notes8.pdf

【11】具体到第 271 行https://github . com/Google/sentence piece/blob/master/src/unigram _ model _ trainer . cc

[12]如果你看了[11]你会发现链接,特别是第 178 页的:https://cs . Stanford . edu/~ pliang/papers/tutorial-ACL 2007-talk . pdf

[13]Christopher m . Bishop,“模式识别和机器学习”斯普林格(2006 年)。看第 629 页

https://en.wikipedia.org/wiki/Trie——抱歉,我没有更好的参考资料,我真的不知道自己是怎么知道这些的。

[15]永田正明。"一个随机的日语词法分析器,使用了一个向前-向后-最佳搜索算法."进行中。科林的(1994)。

16 史蒂文·斯科特。"隐马尔可夫模型的贝叶斯方法:21 世纪的递归计算."美国统计协会杂志(2002 年)。

[17] Bostrom、Kaj 和 Greg Durrett。"字节对编码对于语言模型预训练来说不是最理想的."arXiv 预印本 arXiv:2004.03720 (2020)。

[18]https://colab . research . Google . com/github/Google/sentence piece/blob/master/python/sentence piece _ python _ module _ example . ipynb

[19]墨菲,凯文 P. 机器学习:一个概率观点。麻省理工学院出版社,(2012 年)。**

情感分析:深入研究理论、方法和应用

原文:https://towardsdatascience.com/sentiment-analysis-a-deep-dive-into-the-theory-methods-and-applications-322f984f2b48?source=collection_archive---------24-----------------------

在开始编码之前,你需要知道的关于情感分类的所有事情

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

照片由你好我是尼克Unsplash

情感分类是数据科学中对初学者最友好的问题之一。然而,这并不容易做到。

开发了各种模型来对数据集执行情感分析。为了确保您选择的模型最适合您手头的数据,了解它们是如何形成的以及它们是如何工作的非常重要。

在本文中,我将总结情感分析背后的理论,解释其背后的基本原理,并展示一些成功的情感分类的应用。这篇文章是我在做的关于主题建模和情感分析的系统性文献综述的结果。

什么是 NLP 中的情感分析?

情感分析是自然语言处理的一个子集。

NLP 是一个研究领域,研究使用计算手段从自然语言解码数据的能力。NLP 还研究了如何将这些解码数据整合到机器学习和统计编程软件中。

通过 NLP,计算机程序可以使用机器学习算法对文本数据执行数据分析,这些文本数据在公共源格式中非常丰富。此外,他们可以从数据中提取意义,或者说是语义。

NLP 领域的主要目标是在计算机程序和人类之间架起沟通的桥梁。程序不断得到改进,通过处理、分析和合成将语言和语音数据解码成有意义的语义见解。

情感分析怎么定义?

情感分析是一门学科,旨在使用自然语言处理方法从用户的文本数据中提取定性特征,如情感、观点、想法和行为意图。

张等人(2018)的情感分析研究所述,社交媒体文本对情感分析研究特别有用,因为它们:

  • 用来表达一种观点
  • 充斥着主观的文字。

在学术文献中,社交媒体文本被定义为缩写文本。对这种类型的文本进行情感分析更具挑战性,因为模型可以处理的上下文更少。相比之下,对长格式文本(如新闻文章)进行情感分析的挑战性较小。

简短文本中情感提取的有效性依赖于更高级方法的应用,例如深度卷积神经网络。

由于创造性语言、俚语和缩写的使用,社交媒体数据尤其需要更复杂的信息检索方法。如果不加以考虑,这些因素的存在会影响情感分析模型的效率。

情感分析是怎么做的?

传统的情感分析研究旨在通过将给定文本分类为积极、消极或中性来检测其极性

这种分类需求被认为是传统情感分析的关键限制之一。一些学者认为,传统形式的情感分析无法解决现代表达的复杂性,因为它无法捕捉客观性和主观性。例如,如果一个模型的任务是在假新闻或某人的观点和事实之间进行分类,传统的情感分析将是不够的。

更先进的方法试图识别文本中多种不同的情感表现,通过分析用于自我表达的语言来表明情绪和观点。

这种方法通常旨在同时检测和提取主题模型。为此,经常使用深度学习方法,如卷积神经网络(CNN)。CNN 还用于简写文本的情感分析,如多个研究论文中所指出的(例如,多斯桑多斯和(2014) ,卡莱等人(2018)唐等人(2015) )。

有哪些模型可以用于情感分析?

情感分析可以通过监督、半监督和无监督的机器学习算法来完成。

受监督的机器学习模型是最难在上获得用于情感分析的数据的,因为它需要数据子集的标签,以此来训练模型。

半监督方法利用少量标记样本作为训练数据,作为提高分类精度的手段,一个例子是 da Silva 等人(2016 发表的模型,其中使用支持向量机(SVM)分类器对 Twitter 数据进行分类。

可以对什么文本进行情感分析?

可以在文档级、句子级和方面(词)级进行情感分析。

短格式文本,如来自社交媒体的内容,最好在句子级别使用情感分析进行分析,因为它们通常由一个或几个句子组成。

也有模型分析单个单词,假设同一个句子中的单词具有相同的情感。这样的方法就是唐等人(2019)的隐藏话题-情绪转换模型,将连续句子中的话题和情绪建模为马尔可夫链。

这种方法能够同时检测文档级和句子级情感。

除了文本,情感分析还可以在其他类型的数据上进行吗?

近年来,多模态情感分析已经发展成为一个领域,该领域提出的模型利用了弱监督深度学习方法的最新发展。

多模态事件主题建模也已出现,这已被证明在消费者行为预测分析和社会学领域大有可为。

总之,多模态环境中的主题建模和情感分析被认为是改善人机交互的一种方式。如何应用的一个例子是自动语音识别领域。

做情感分析的两种主要方式是什么?

#1 使用预先开发的人工构建的情感词典。

情感分析最初是使用预先开发的、人工构建的情感词典来执行的。

此类词典包括:

每一个都有不同的等级和不同的字数。

这种词典已被用作模型开发的基础,例如

  • 极性分类算法(PCA),对推文情感进行分类
  • 增强型表情分类器(EEC)
  • 改进的极性分类器
  • SentiWordNet 分类器(SWNC)。

其中,PCA 表现出了优越的性能。

该方法的优势和局限性

这些方法在以下方面很有用:

  • 区分主观言语和客观言语
  • 将情绪分为积极、消极或中性。

作为一种限制,它们只能让研究者主要从作者而不是读者的角度来提取情感。

#2 使用机器学习方法

除了基于词典的方法之外,可以使用机器学习方法来执行情感分析。

这可以通过在人类标注数据集上训练的统计模型来完成,因此——利用半监督学习。

另一种方法是结合多种浅层机器学习方法。例如,对于推文的情感分析, Ahuja 等人(2019) 得出结论,TF-IDF 在特征提取方面比 N-Grams 表现更好。在他们论文的研究样本中,TF-IDF 与逻辑回归的结合被认为是最有效的。

集成分类器也被证明是解决词典方法的一个限制的好方法。具体来说, 2018 年的一项研究从读者的角度探讨了多标签情感分类的问题,将模型应用于新闻数据集。该研究证明了集成分类器与其他方法相比的优越性。

如前所述,深度学习技术也可以应用于情感分析。

该方法的优势和局限性

每一种观点都有其自身的局限性,并选择在分析的准确性或普遍性上做出妥协。下面是对常见情感分析机器学习方法的优势和局限性的总结:

  • N-gram 模型(或条件随机字段)通过序列标记(例如,词性标记或浅层解析)来工作。他们很好地捕捉工作顺序和语法。它们的缺点是特征维数高。
  • 半监督学习方法有利于快速简单地确定文本的极性。他们不太擅长确定文本中的主观性或客观性。
  • 深度学习方法擅长对大型数据集进行元级特征提取,通常比 N 元模型表现更好。当数据中有大量噪音时,如俚语、缩写、甚至表情符号,它们的表现并不好。这使得他们不适合社交媒体情绪分析。
  • 当特征被组织成组时,多个内核学习模型工作。这实现了多模态情感分析,但是计算很慢。

情感分析中的主要挑战是语言的模糊性,或者说,很多时候在说语言时,可能会出现混合的语义属性。这使得分类算法难以执行其功能。

查看程序输出和分类的人也很难对给出语义的上下文进行分类,这可能会妨碍分类的整体有效性及其在现实环境中的可用性。

尽管如此,与人类的评估和洞察力相比,情感分类在速度方面提供的好处超过了这些障碍。

为什么公司要实施情感分析?

公司希望利用情感分析和自然语言处理技术的原因有很多。

基于我的研究,我总结了五个主要原因,为此,我也将提供在现实生活中如何做到这一点的例子。

#1 增加竞争优势

情绪分析和预测行为建模技术的实施被认为是组织竞争优势的来源,并且是学者们推荐的。

#2 评估一家公司消费者网络的力量

情感分析也可以用来衡量消费者网络的力量。这与衡量口碑营销的效率有关。

它还可以用于跟踪在线社会团体成员之间的个人推荐。这可以使公司根据同行的推荐,用个性化的网络广告来目标消费者

#3 利用公开的、用户生成的、随时可用的数据

文本数据也比数字数据更容易获得,可以说高级人类语言包含了大量的复杂性和细微差别。

这导致情绪分析被研究为各种环境中各种商业问题的潜在解决方案,例如用于检测道路事故或股票市场预测的社交媒体的模式识别,等等。

#4 识别模式,根据数据对市场变化做出准确的预测

Asur 和胡伯尔曼(2010) 认为对社交媒体传播的深刻理解有助于准确预测未来事件的结果。他们提供的例子是使用 Twitter feeds 数据来预测票房成功的实时分析软件。这超过了好莱坞证券交易所的信息。

Twitter 数据还被一个认知模式识别系统用于聚类分析,该系统在任何主流报道渠道之前获取正在发生的道路交通事件的实时信息。

类似的研究有助于证实社交媒体平台是集体智慧的汇集。因此,公司受到激励,将机器学习应用于数据挖掘和行为预测,以准确告知商业用户出于各种目的的未来行动:

由于我们人类的不可预测性,所有这些研究都预测了在对人类情感、反应和社会行为进行智能分析过程时的预测误差,并指出这是模型的局限性。

#5 效率、处理速度和减少的人为错误

由于机器学习软件在执行文本分析方面的现有限制,公司目前有大量人力资源相关的支出用于员工手动验证数据。然而,当人类自己完成这些任务时,效率甚至更低,主要与数据转换所需的时间有关。

想象一下,任何人浏览成千上万条推文并对它们进行分类会多么低效!

这提供了一个创造价值的机会,通过持续改进模型,解决现有的业务问题,在行业中运作。自主解决方案的实施可以降低数据解释中的人为错误风险。

最后的想法

一般来说,自然语言处理和机器学习面临的挑战之一是,有用的和与问题相关的信息通常被播种在大规模混乱聚集的数据中。另一个挑战是,当人工代理考虑这些数据时,这些数据可能无法提供任何见解,或者可能被认为对业务问题毫无用处。

这些挑战也反映在情感分析中,情感分析是自然语言处理的一个子集。

这引发了理解语言结构并从中挖掘的研究浪潮:用户意图、情感和主观性。

这种模型是组织的目标,因为它具有以下潜力:

  • 竞争优势增强,
  • 预测行为和反应的能力,
  • 能够更好地锁定处于不同消费阶段的消费者
  • 减少人工参与的可能性,从而提高效率,降低运营成本。

通过监测公众情绪,企业可以变得更适应市场。

意大利语的情感分析和情感识别(使用 BERT)

原文:https://towardsdatascience.com/sentiment-analysis-and-emotion-recognition-in-italian-using-bert-92f5c8fe8a2?source=collection_archive---------14-----------------------

思想和理论

意大利语情感分析和情感识别的数据集和软件包。

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

我们搭建的情绪情感分类库截图。

情感分析和情感识别

识别文本中的情感是更好地理解人们谈论某事的基础。人们可以谈论一个新事件,但正面/负面的标签可能还不够。被某件事激怒和被某件事吓到,区别很大。这种差异就是为什么在文本中考虑情绪和情感是至关重要的。

有很多关于英语情感分析和情感识别的研究。在谷歌上快速搜索会给你带来不同的可能算法,这些算法可以为你处理情绪/情感预测。但有些语言缺乏数据,其中一种语言是意大利语(但有一些工作,例如 Sprugnoli,2020)。

所以我们(黛博拉德克你真正的)试图提供这个问题的解决方案。我们为意大利情绪和情感预测创建了一个新的数据集,并对 BERT 模型进行了微调。

在这篇博文中,我们描述了我们创建这个新数据集的经历,解释了我们做的一些事情和我们的结果。我在这里描述的内容也可以在同行评议的研究论文中找到:

费德里科·比安奇、德博拉·诺扎和德克·霍维(2021)。 FEEL-IT:意大利语的情感和情绪分类。第 11 届主观性、情感和社交媒体分析计算方法研讨会。

由于这些方法的可用性对社区至关重要,您可以在网上找到:

感觉:意大利语的情感和情绪分类

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

为情绪和情感识别建立新的数据集

当创建一个新的数据集时,我们需要解决的一个问题是,它需要代表领域。一个人不可能收集两天三个关键词的推文。收集的推文过于依赖于领域,使得训练的模型不够通用,无法应用于不同的领域。

相反,我们采取了不同的方法:我们决定每天收集 1000 条与 Twitter 上的热门话题相关的推文。通过这种方式,我们每天都能获得最相关的推文,而且因为每天都有新的话题,我们收集了很多不同的东西。这种方法让我们获得了一个数据集,其中包含了从足球比赛到政治等广泛话题的推文。

然后,我们用情绪来注释推文,排除那些没有可识别情绪的推文。最终,我们得到了 2037 条带注释的推文:912 条愤怒,103 条恐惧,728 条喜悦,294 条悲伤。

虽然这个数据集并不庞大,但正如我们所说的,它涵盖了广泛的不同主题,并在更广泛的情绪和情感分类任务中非常有用。

您可以在下表中看到一些带注释的推文示例(以及英文翻译):

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

在我们的数据集中,一些带有情感注释的推文的例子。

正如你所料,这个过程在注释方面的成本很高,因为我们丢弃了大部分推文。然而,它具有非常高的精确度,因为我们从广泛的主题中收集了推文,并且我们有精确的注释。

微调(嗯)伯特(o)

作为最近预训练时期的标准,我们用我们提出的数据集微调了 BERT 模型。BERT 是自然语言处理中最流行的神经结构之一。微调 BERT 允许我们有一个健壮的分类模型来预测我们的标签。微调是允许我们调整 BERT 模型的权重来执行我们的分类任务的操作。

对于许多语言,有许多不同的 BERT 模型(参见 Nozza et al .,2020 的综述和 BERTLang )。这里,我们使用 UmBERTo ,一个非常高效的意大利 BERT 模型。特别是,我们微调了在通用抓取数据集上训练的 UmBERTo 模型。

情感分类

为了评估我们的数据集和情感分析模型,我们将我们的 FEEL-IT UmBERTo 与另一个数据集上的相同模型进行了比较: SentiPolc16 。两个模型都根据各自的数据进行了微调。

SentiPolc 带有一个训练集和一个测试集。因此,我们评估了下面这个有趣的研究问题:是使用“感觉”好还是“感知”好?

我们在 SentiPolc 的测试集上对 FEEL-IT 和 test 进行了微调,并将其与 SentiPolc 的训练集上的微调和 SentiPolc 的数据集上的测试进行了比较。请注意,在训练集中使用 SentiPolc 的模型应该有很大的优势,因为我们希望训练和测试是相似的。在下图中,你可以看到结果。

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

在 senti pol 16 测试集上使用 FEEL-IT 和 senti pol 16 作为训练集的比较结果。使用感觉-它更好。截图来自我们的 HuggingFace 知识库。

然而,这些结果表明,使用 FEEL-IT 比使用之前最先进的数据集 SentiPolc 要好得多。

情感分类

现在,除了我们的感觉之外,Twitter 上没有情感分类的数据集。因此,我们运行了一个简单的交叉验证,表明一个微调的翁贝托模型可以让我们达到 0.71 宏 F1!那是一个极好的结果!

创建 Python 库:感受一下

我的一个爱好是写代码,我试着做一些其他人可以使用的库。因此,黛博拉和我一直在开发一个小库,它包装了 HuggingFace 的内部 API,为情绪和情感预测提供了一个简单的接口。

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

我们的库超级好用!😃

这个库的好处是,它允许你用很少的编码工作进行快速的情感和情绪分类:你可以加载你的熊猫数据帧,提取文本,将其传递给库,并得到结果。这正是我们现在要做的。

首先要做的是: pip install -U feel-it 在命令行中:)

下面是我们将要使用的小文件:

现在,让我们导入我们的分类器。包装器将为您处理模型的下载。

现在,让我们开始预测吧!我们只需要使用我们感兴趣的分类器的预测方法。分类器将句子列表作为输入——在本例中,我们将从我之前展示的 CSV 文件中获取。

你看到了吗?有了我们建的库,用意大利语做感悟和情感分类超级容易!

参考

诺扎博士、比安奇女士和霍维博士(2020 年)。那个什么【面具】?理解特定于语言的 BERT 模型。 arXiv 预印本 arXiv:2003.02912

比安奇,f .,诺扎,d .,&霍维,D. (2021)。 FEEL-IT:意大利语的情感和情绪分类。第 11 届主观性、情感和社交媒体分析计算方法研讨会。

斯普鲁尼奥利河(2020 年)。 **MultiEmotions-it:一个新的意大利观点极性和情感分析数据集。**第七届意大利计算语言学会议,CLiC-it 2020(第 402–408 页)。

承认

非常感谢黛博拉和德克对此的评论!

如何用 Python 对音频文件进行情感分析

原文:https://towardsdatascience.com/sentiment-analysis-assemblyai-python-a4686967e0fc?source=collection_archive---------5-----------------------

探索如何使用 AssemblyAI API 提取语音中的情感

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

照片由伯爵克里斯Unsplash

介绍

情感分析指的是为了检测输入文本中的情感而对文本数据执行的一系列过程——作为自然语言处理的一部分。

这种情绪通常可以分为积极、消极或中性,尽管这并不标准。相反,你可能更喜欢建立一个模型,最终输出更广泛的极性,如非常积极、积极、中性、消极和非常消极。此外,你可以试着预测一种情绪,而不是极性(快乐、悲伤、愤怒等)。).

由于机器和深度学习方法的应用,情感分析在过去几年中得到了很大的发展,这些方法可以非常准确和及时地执行这项任务。

情感分析工具的一些最常见的应用包括品牌监控和产品情感,帮助企业解释客户反馈并增强他们对客户需求的理解

在接下来的章节中,我将演示如何使用 AssemblyAI APIPython 对音频文件执行情感分析。

对音频文件执行情感分析

如果你想跟随这个教程,那么你首先必须从 AssemblyAI 获得你的 API 密匙(这是免费的!).现在您已经有了访问键,我们现在可以准备将发送到 API 端点的请求头了:

导入请求库并定义请求头—来源:作者

接下来,我们现在需要将我们的音频文件上传到 AssemblyAI 的托管服务,该服务将使用将在后续请求中使用的upload_url进行响应。

上传音频文件到 AssemblyAI 的 API 托管服务—来源:作者

现在,我们已经检索到了作为上一个调用的响应的一部分的上传 URL,我们现在可以开始获取音频文件的转录。**请注意,在一次呼叫中,我们还可以请求执行情感分析。**就这么简单!

使用 AssemblyAI API 执行语音到文本和情感分析—来源:作者

注意,对于上面的调用,我们同时执行语音到文本和情感分析!为了指示 API 也执行后者,我们需要将sentiment_analysis参数(设置为True)传递给POST请求。

值得一提的是,目前 AssemblyAI API 的情绪分析功能能够输出三种情绪,即POSITIVENEGATIVENEUTRAL。不过,请留意他们的文档,因为他们在不断改进他们的 API 及其功能。

解读回应

上一步/调用中的调用的响应结构应该与下面给出的结构相同。语音到文本输出将在text键下可用,情感分析的结果也将是sentiment_analysis_results键下响应的一部分。

注意,对于情感分析结果中的每个片段,您还可以获得特定音频片段的时间戳(startend)以及sentiment

AssemblyAI API 端点在执行情感分析时获得的响应—来源:作者

完整代码

下面是作为本教程一部分的完整代码。总而言之,我们首先必须将我们的音频文件上传到 AssemblyAI API 的托管服务,以便检索映射到要转录的音频文件的 URL。然后,我们在对 AssemblyAI 的脚本端点的单次调用中执行语音到文本和情感分析,以便检索音频文件的文本形式以及各个片段的情感。

本教程的完整代码——来源:作者

最后的想法

在今天的文章中,我们讨论了什么是情感分析以及在什么样的环境下有用。此外,我们展示了如何利用 AssemblyAI API 对音频文件进行情感分析。

他们的 API 附带了许多我们在今天的指南中没有真正讨论过的特性。请务必查看他们在官方文档中的完整列表以及他们的产品更新

此外,看看这篇文章后面的文章,它可以帮助你开始语音转文本和主题摘要。

成为会员 阅读媒介上的每一个故事。你的会员费直接支持我和你看的其他作家。你也可以在媒体上看到所有的故事。

https://gmyrianthous.medium.com/membership

你可能也会喜欢

情感分析——比较 3 种常用方法:朴素贝叶斯、LSTM 和 VADER

原文:https://towardsdatascience.com/sentiment-analysis-comparing-3-common-approaches-naive-bayes-lstm-and-vader-ab561f834f89?source=collection_archive---------5-----------------------

不同方法的优缺点研究(带有示例代码)

注:本帖代码可在 这里 找到

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

情感分析(图片由作者提供)

情感分析意见挖掘,是 NLP (自然语言处理)的一个子领域,旨在从文本中提取态度、评价、意见和情感。受客户互动向电子邮件、聊天室、社交媒体帖子、评论、评论和调查等数字格式快速迁移的启发,情感分析已成为分析组织必须执行的不可或缺的一部分,以了解他们在市场中的定位。需要说明的是,情感分析并不是一个新的概念。事实上,它一直是 CRM (客户关系管理)和市场研究的重要组成部分——公司依靠更好地了解他们的客户来发展和创新。最近的增长主要是由客户互动记录的可用性和可访问性以及处理这些数据的计算能力的提高所推动的。这一进步确实以有意义的方式使消费者受益。组织比以往任何时候都更愿意听取其成员的意见来进行改进。有许多方法可以进行情感分析。在本文中,我们将探索三种这样的方法:1) 朴素贝叶斯,2) 深度学习 LSTM ,以及 3) 预训练的基于规则的 VADER 模型。我们将重点比较模型的简单开箱即用版本,并认识到每种方法都可以进行调整以提高性能。我们的目的并不是要详细说明每种方法是如何工作的,而是从概念上研究它们如何进行比较,以帮助确定何时应该选择一种方法。

情感分析的背景

情感分析的目标范围从正面到负面。与其他 NLP 工作一样,它通常被认为是一个分类问题,尽管当精度很重要时,它可以被视为一个回归问题。情感分析过去是通过大量劳动力通读和人工评估文本来完成的。这种方法成本高并且容易出现人为错误。为了实现这一过程的自动化,公司寻求先进的分析方法来解决这一问题。情感分析的挑战在于人们表达和解释情感极性强度的方式不同。此外,单词和句子可以根据上下文有多种含义(称为多义性)。虽然其中一些问题可以缓解,但像任何分析任务一样,几乎总是要在速度和性能之间进行权衡。我们回顾了三种通用方法,每种方法都有自己的优点和缺点:

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

优势和劣势分析

数据集介绍

除了突出显示概念差异之外,我们使用 感知 140 数据集来基准性能。这个数据集包含 160 万条推文和相应的情绪标签(正面和负面)。

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

原始资料

VADER 词典和基于规则的情感分析工具

我们从使用流行的 VADER (价感知词典和情感推理机)工具的一个容易应用的方法开始。其核心是,VADER 使用全面、高质量的词汇(约 7500 个特征)和复杂的语言规则来产生情感分数。情感词典的构建和验证(统计上)在它的发表的论文中有详细的记载——这个巨大的成就怎么说都不为过。

// vader_lexicon.txt
...
good: 1.9
happy 2.7
awesome 3.1
bad -2.5
sad -2.1
catastrophic -2.2
...

如上面的例子所示,VADER 词典是一个字典,它为每个特征分配一个在-4(最极端的负面)和 4(最极端的正面)之间的预先确定的情感分数,这些特征可以是一个单词、一个首字母缩略词或一个表情符号。VADER 策划了一个基于化合价的词汇,能够检测情感的强度极性两个方面。这与诸如否定、缩写、连词、助词、程度副词、大写、标点和俚语等强大的修饰语相结合,用于计算输入文本的分数。这些修饰符被实现为一个基于规则的模型,它改变初始价分值。慷慨的 VADER 开发者使它开源且易于使用:

# import SentimentIntensityAnalyzer class 
from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer# polarity_scores method of SentimentIntensityAnalyzer
SentimentIntensityAnalyzer().polarity_scores('Today is a good day.')# output: 
# {'neg': 0.0, 'neu': 0.58, 'pos': 0.42, 'compound': 0.4404}

VADER 产生一个得分compound,该得分概括了输入文本的情感强度。它是通过对词典中每个特征的效价分数求和来计算的,根据规则进行调整,然后归一化到-1(最极端的负面)和+1(最极端的正面)之间。文档compound分数描述为“标准化加权综合分数”。此外,posnegneu分数代表属于每个类别的文本的比例(例如基于规则的增强)。

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

VADER 计算

vader _ 情操 _ 分析. py

基于规则的模型易于理解,实现起来也很快,这使得它成为情感分析的一个很有吸引力的选择。它们取决于拥有强大的词汇和全面的语言规则。基于规则的模型的挑战在于词汇的创建和验证是耗时的。他们努力应对可能很重要的词汇特征的无限组合的覆盖范围,以及当单词有不同含义时跨领域的适用性问题。此外,该方法仅评估单个单词**,而忽略使用它们的上下文。这往往会导致错误,特别是对于讽刺讽刺。**

使用 VADER —我们能够在我们的测试数据集上产生 72% 的准确率。VADER 认为,在社交媒体文本中常见的表情符号和首字母缩写词/首字母缩写词在该领域可以表现良好,但在其他领域可能表现较差。重要的是要注意,VADER 确实产生精确的极性分数,我们为了比较的目的将其分类为正或负。

P.S .其他词汇还有https://liwc.wpengine.com/*(语言查询和字数统计)和* 从新 (英语词汇情感规范)。

自然语言处理的机器学习

虽然基于规则的解决方案已经被证明是有效和可靠的,但是它是严格的,并且受到可能过期的词典的限制。手动创建验证一个全面的情感词典是困难的。相反,我们希望转向一种机器学习解决方案,通过算法将输入文本与相应的标签关联起来。在训练过程中,成对的文本和标签(情感)被输入到机器学习算法中,以创建能够对新文本进行预测的模型。值得一提的一个重要警告是,监督机器学习需要对数据进行标记,这可能意味着数据中的任何主观性偏差都会在模型中得到反映。与预先训练的模型相比,定制模型给予对输出的更多控制,并且适用于特定的应用。

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

机器学习 NLP 文本分类过程

朴素贝叶斯

朴素贝叶斯分类器根据可能相关条件的先验知识使用概率进行预测。换句话说,它使用每个词汇特征在训练数据的正面或负面文本中出现的条件概率来得出结果。

NLP 的机器学习需要预处理从原始文本中提取特征。具体来说,它需要在算法能够处理它们之前将文本数据转换成数字表示,即矢量化。对于朴素贝叶斯,我们将构建一个简单的 DTM (文档-术语矩阵)用于模型消费,尽管还可以包括其他特征,如文本长度、发布时间/位置、命名实体等。DTM 倾向于产生一个宽的特征空间,因为整个语料库的词汇表中的每个独特的单词或短语都成为一个特征。我们包括一些数据清理步骤,以帮助降维模型(分类器)性能。关于 NLP 数据预处理的更多信息可以在这里找到。通过对 TF (术语频率)进行计数,并用 IDF (逆文档频率)对它们进行加权,来构建向量表示。我们可以使用 N-grams (连续术语)来捕捉文本中的一些上下文,例如否定。N-gram 上下文是一个钝器,不能总是正确地捕捉表达式。它们还会给模型增加过多的功能,从而对模型产生负面影响。

我们应用以下转换来生成训练/测试数据:

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

朴素贝叶斯数据预处理管道(加权频率计数)

naive _ bayes _ 情操 _ 分析. py

朴素贝叶斯模型使用相当容易理解的特性。它支持大规模情感分析工作,因为训练所需的计算速度很快。然而,它也有一些明显的缺点。作为一个概率分类器,它高度依赖先验知识,因此训练数据必须完整且具有代表性。缺乏良好的训练数据会导致对看不见的数据或不在词汇表中的文本的推理不佳。如果数据中存在偏差或不平衡,它也会受到影响。此外,它假设特征是相互独立的,这意味着 DTM 中的词汇特征在所有句子中的贡献是相等的,而与文本中的相对位置无关。朴素贝叶斯 DTM 模型(具有 30 万个一元和二元特征)训练很快(< 7 分钟)。它产生了准确度为 86% 的训练分数和准确度为 79% 的测试/验证分数。

对于更长更宽的数据集,可以使用Spark快速训练模型,这里使用 这里使用

深度学习

深度学习允许以更复杂的方式处理数据。一种 长短期记忆 模型,或称 LSTM,是一种https://en.wikipedia.org/wiki/Recurrent_neural_network【RNN】递归神经网络,用于处理https://en.wikipedia.org/wiki/Temporal数据。既然我们认为一个句子中特征(词)的顺序是有意义的,这就是我们使用的神经网络架构。

深度学习在计算上是昂贵的,并且在高维、稀疏向量的情况下做得不好(性能差收敛慢)。当我们从原始文本中提取特征用于模型训练时,我们需要将它们表示为密集的向量。一种这样的技术是将每个文本转换成数字的序列,每个数字映射到词汇表中的一个单词。更进一步,我们需要使用单词嵌入将具有相似用法/含义的单词映射到相似的实数向量(而不是索引)。如果没有单词嵌入,模型会将单词的索引号误解为有意义。单词嵌入将所有单词放入一个多维向量空间,因此它们的相似性可以通过距离来测量。使用开源预训练模型(如 Word2vecGloVefastText )或定制神经网络(无监督 学习)模型来生成单词嵌入。当训练自定义单词嵌入时,它可以单独完成,也可以与手头任务的神经网络模型联合完成(作为附加层)。这是我们采用的方法,因为它倾向于导致针对数据的上下文以及目标的嵌入。与稀疏(几十万维)的文档术语矩阵相比,使用单词嵌入产生具有更少(几百)维的向量,同时捕捉语义相似性。单词嵌入被认为是深度学习挑战自然语言处理问题的关键突破之一。****

我们应用以下转换来生成训练/测试数据:

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

单词嵌入+ LSTM 数据预处理流水线

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

文字嵌入 LSTM 建筑

word _ embedding _ lstm _ 情操 _ 分析. py

深度学习神经网络方法的一个大优势是,我们不必尝试和设计特征,因为神经网络将学习上下文和重要特征。然而,这是以可解释性为代价的——使得它在某些情况下成为一个显著的限制。此外,就计算时间而言,这是最昂贵的方法,特别是如果联合训练单词嵌入,因为它需要大的数据集。对于我们的数据集,单词嵌入 LSTM 模型(具有 61MM 参数)花了 20 个小时来训练。它确实产生了令人瞩目的训练分数 96% 的准确度和测试/验证分数 80% 的准确度。****

情感分析应用

如果做得正确,情感分析可以为任何组织提供巨大的价值。如今,组织使用情感分析来了解公众对其产品、服务和品牌的感受。这可以指导营销策略激励产品开发告知政治活动检测潜在的破坏性事件。以下是一些经过验证的例子:****

  • 确定潜在的贬低者以提高净推广者分数(NPS) ( 客户关怀/反馈分析 )
  • 快速评估客户参与度,以识别并解决负面客户体验,从而改善客户服务并提高回头率( 票证分类 )
  • 监控和管理公众对该品牌的看法( 品牌智能 )

总结和选择合适的工具

我们回顾了三种情感分析方法,每种方法都有自己的优点和缺点。在选择合适的方法时,需要考虑一些关键因素:

  • 精确度和/或速度的公差是多少?如果速度优先于准确性,基于规则的解决方案可能是正确的解决方案。
  • 培训数据的可用性和完整性?有了稳健的训练数据,朴素贝叶斯模型可能是正确的解决方案,因为它实现起来很快。
  • 模型的可解释性有多重要?如果准确性优先于模型可解释性,深度学习可能是正确的解决方案。

并行运行多个模型进行比较并不少见。一旦部署,该过程应该包括一个反馈循环,以通知模型何时需要更新。

我还致力于分享如何用并行计算更快地训练 NLP 模型的代码。如果你喜欢这篇文章,我邀请你跟我来,这样你就可以得到这个项目继续的通知。

独立于预处理的在线商店情感分析

原文:https://towardsdatascience.com/sentiment-analysis-of-an-online-store-independent-of-pre-processing-42c8d195ad08?source=collection_archive---------35-----------------------

当预处理困难或耗时时,您会怎么做?

在这篇文章中,主要目标是检查有多大可能减少对文本预处理的需求。下面,我将简单解释一下,您可以在这里找到详细信息:

https://peerj.com/articles/cs-422/ 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一种用于情感分类的卷积网络结构。参考:10.7717/peerj-cs . 422/图 1

  1. 摘要

情感分析在公司,尤其是商店中起着关键作用,提高确定客户对产品意见的准确性有助于保持他们的竞争条件。我们打算在伊朗最大的网上商店网站上分析用户的意见;迪吉卡拉。然而,波斯语是非结构化的,这使得预处理阶段非常困难,并且这是波斯语情感分析的主要问题。加剧这一问题的是缺乏用于波斯语预处理的可用库,而大多数库侧重于英语。为了解决这个问题,使用网络挖掘技术从 Digikala 网站收集了大约 300 万条波斯语评论,并使用 fastText 方法创建了单词嵌入。人们认为,考虑到单词在句子中的位置以及单词之间的关系,这将极大地减少通过 skip-gram 方法进行文本预处理的需要。使用 TF-IDF 与 fastText 并行创建了另一个单词嵌入,以比较它们的性能。此外,还比较了卷积神经网络(CNN)、BiLSTM、逻辑回归和朴素贝叶斯模型的结果。作为一个重要的结果,我们使用 fastText 和 CNN 获得了 0.996 的 AUC 和 0.956 的 F 值。在这篇文章中,不仅证明了在多大程度上可以独立于预处理,而且所获得的精度优于用波斯语所做的其他研究。避免复杂的文本预处理对其他语言也很重要,因为大多数文本预处理算法是为英语开发的,不能用于其他语言。由于其高准确性和预处理的独立性,所创建的单词嵌入在波斯语中除了情感分析之外还有其他应用。

2.方法学

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

代表所采取步骤的流程图。参考:10.7717/peerj-cs . 422/图 4

在这篇文章中,我们寻求分析伊朗最大和最知名的在线商店(Digikala)的网站上客户评论的感受。起初,语言问题被认为是一个重大挑战。波斯语文本预处理存在一些问题,如使用俚语,使用其他语言尤其是阿拉伯语的字母,短语之间缺乏明确的界限。为了解决这些问题,我们采用了 fastText,因为我们想检验这种方法的使用是否能够减少数据预处理的需要,并使语言处理更容易。在下文中,我们将检验这一假设,并将所得结果与其他算法和其他报告进行比较。另一个严重的限制是深度学习模型需要庞大的数据集,但大多数可用的波斯语数据集都很小,以至于无法在深度模型中使用。因此,必须从 Digikala 网站中提取丰富而庞大的数据集,这是通过网络挖掘方法进行的。应当指出的是,这一条旨在实现以下目标:

通过在波斯语处理或其他语言处理中实施快速文本等方法,调查减少文本预处理需求的情况;

基于各种类型的数字商品收集全面的客户评论数据集,以创建用于与数字商品相关的各种作品的通用单词嵌入;

与其他研究相比,Digikala 网站评论的情感分析具有更高的准确性。

能够访问具有丰富性和内容完整性的大型数据集对于训练深度模型是不可或缺的。大多数可用于训练深度模型和情感分析的数据集都是英文的。为了收集丰富的数据集,使用了网络挖掘方法,提取了 Digikala 网站上的波斯语评论。买家发布的评论表达了他们对购买和产品功能的满意程度。提交评论后,买家可以在“我建议”和“我不建议”选项中进行选择。这两个选项被提取并在模型中用作情感分析问题的标签。我们的目标是分析 Digikala 网站用户的意见,因此我们使用 web 挖掘库(如 Beautiful Soup)提取了与数字商品相关的部分的数据。Beautiful Soup 是一个 Python 包,用于解析 XML 和 HTML 文档,对于 web 抓取非常有用。这样就提取出了 Digikala 网站的数码商品评论,总共是 2932747 条评论。

3.结果

采用 TF-IDF 和 fastText 方法提取特征。BiLSTM 和 CNN 模型使用 fastText 输出,nave Bayes 和 Logistics 回归模型使用 TF-IDF 输出,最后在表 4 中比较了它们的准确性。根据该表,BiLSTM 和 CNN 模型的结果比其他模型更准确,CNN 给出了最好的结果。正如预期的那样,由于使用了 fastText 方法,对数据预处理的需求已经减少。换句话说,词干化和规范化方法并没有影响最终结果。为了更仔细地检查这一点,我们选择了 CNN 模型作为最佳模型,并且我们曾经使用预处理步骤和没有这些步骤的情况下执行了情感分析过程。预处理前的 AUC 和 F 值分别为 0.9943 和 0.9291,预处理后分别为 0.9944 和 0.9288。结果见表 5。在该表中,“预处理之前”的含义正好在词干提取和规范化步骤之前。换句话说,用于创建单词嵌入的方法可以在相同的空间范围内描述相同的单词,而不需要标准化字母,也不需要识别单词的原始词根。与预处理相反,伪标记法的使用显著改善了结果。使用伪标记后,AUC 和 F-score 的值提高到 0.996 和 0.956。

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

基于 AUC 和 F-measure 的不同模型的性能,以及基于 AUC 和 F-measure 的 CNN 模型在不同情况下的性能。参考:10.7717/peerj-cs . 422/table-410.7717/peerj-cs . 422/table-5

所建议的模型比先前在波斯语情感分析中使用预处理方法的模型具有更好的结果。例如,一些研究人员引入了预处理算法,并成功增强了机器学习算法的结果(Saraee & Bagheri,2013)。在研究中,使用朴素贝叶斯作为分类算法的预处理算法的 F 值是 0.878。在另一项研究中,对预处理和分类器算法的各种备选方案进行了检查,最佳结果由 SVM 分类器辅助,F 值为 0.915(阿斯加里安、卡哈尼和沙里菲,2018 年)。此外,一些研究试图利用最先进的深度模型,以减少对预处理的依赖,避免复杂的步骤(Roshanfekr,Khadivi 和拉赫马蒂,2017 年)。BiLSTM 和 CNN 算法在研究中的 F 值分别为 0.532 和 0.534。所有提到的文章的重点是在波斯两类情感分析的数字商品评论与本文相同。与其他研究和常用算法的比较表明,本文的结果不仅消除了对数据预处理的依赖,而且精度显著提高。

4.结论

该数据集包括从伊朗最大的在线商店 Digikala 网站的数字商品部分提取的大约 300 万条评论。使用基本的预处理方法来修改单词并对其进行标记。由于大部分数据集缺少标签,因此采用伪标签方法来改善结果。还使用随机过采样来执行数据平衡。发现波斯语数据预处理很困难,因此使用 fastText 方法来减少对数据预处理和单词嵌入开发的需求。嵌入被用作 BiLSTM 和 CNN 模型的输入。使用建议的模型,不仅所获得的结果非常令人满意,而且在波斯语中比其他报告更准确,而且没有与数据预处理相关的复杂性。评估了词干化和归一化对输出的影响,并揭示了所提出的方法不依赖于数据预处理。最后,除了机器学习和深度学习方法在情感分析中的比较之外,还比较了 TF-IDF 和 fastText 方法来创建单词嵌入。最好的结果与 fastText 和 CNN 有关。该模型的主要成就是减少了对数据预处理的需求。扩展的文本预处理库使得英文数据预处理更加方便和准确。然而,在其他语言中,由于缺乏适当的库,数据预处理非常复杂。在建议的模型上,证明了这种需求在很大程度上是可解决的(AUC = 0.996),并且预处理步骤可以减少到初步的记号化过程。避免复杂的文本预处理对其他语言也很重要,因为大多数文本预处理算法是为英语开发的,不能用于其他语言。换句话说,独立于预处理步骤,所采取的步骤可能被实现或以其他语言实现相同的结果。此外,由于其高准确性,所创建的单词嵌入可以用于其他文本分析问题,尤其是与在线数字商品相关的问题。

GitHub:

https://github.com/mosiomohsen/persian-sentiment-analysis-using-fastText-word-embedding-and-pseudo-labeling

新冠肺炎疫苗推文的情感分析

原文:https://towardsdatascience.com/sentiment-analysis-of-covid-19-vaccine-tweets-dc6f41a5e1af?source=collection_archive---------12-----------------------

实践教程

使用 TextBlob API 和 word cloud 可视化来综合有关全球疫苗接种工作和进展的论述

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

哈坎·努拉尔Unsplash 上拍摄

这是疾病、破坏、悲伤和绝望的漫长一年,但新冠肺炎疫苗的全球推广让许多人感到宽慰,并重新找到了乐观。关于疫苗接种进展、可及性、功效和副作用的讨论仍在继续,并且每天都在新闻报道和 Twitter 上传播。然而,作为在线用户,我们的可见性仅限于我们自己的回音室。因此,这个项目的动机是通过利用 Twitter 数据的力量来拓宽我对全球疫情状况的视角。

对于一个人来说,阅读和消化人们在推特上发布的关于新冠肺炎疫苗的所有信息几乎是不可能的。幸运的是,在自然语言处理(NLP)技术的帮助下,我们可以通过文本特征化、情感分析和词云可视化的方式来窥视极其复杂和广泛的讨论。

接下来的工作使用了一个名为“所有新冠肺炎疫苗推特”的数据集。数据是使用名为 Tweepy 的 Python 包收集的,如果用户成功创建了 Twitter 开发人员帐户并获得了访问凭据,就可以使用该包访问 Twitter API。在这种情况下,由于数据都是预先收集的,并以 10 MB 的表格格式存储在 Kaggle 上,所以任何希望得到它的人都可以访问它。这些数据包括与各种疫苗相关的推文,包括辉瑞/BioNTech、国药控股、科兴生物、Moderna、牛津/阿斯利康、Covaxin 和 Sputnik V。对于每种疫苗,使用相关的搜索词来查询最近的推文。

探索性数据分析

该项目的探索性数据分析阶段的主要目标是熟悉数据框的列,并开始头脑风暴研究问题。

从使用 pandas 加载数据的步骤开始,一些基本的数据框操作允许我们看到,对于每个 tweet,以下所有信息都是可用的:

关于发推文的用户的信息 用户名:推文句柄
用户位置:发推文的人来自世界的哪个地方(注意:这里没有验证……“你的床”在技术上是可以接受的)
user_description :用户撰写的传记
user_created :他们创建 Twitter 帐户的时间
user_followers :关注者数量
user_friends :用户关注的帐户数量
user_favourites :用户喜欢的推文数量
user_verified :表明用户是否是知名人士

关于 tweet 本身的信息 id:Twitter API
date的索引值:YYYY-MM-DD HH:MM:SS
text 形式的日期时间对象:tweet 本身(*最重要 *)
hashtags:tweet 中使用的 hash tags 列表(不带“#”字符)
:哪台设备用于推文
转发:收集数据时收到的转发数
收藏夹:收集数据时收到的点赞数
is_retweet :指示推文是原创还是转发(布尔值)

在上面的列中,文本、日期、用户名、用户位置、标签、收藏夹和转发与此分析最相关。虽然推文是使用疫苗相关的关键字查询的,但推文中提到的特定疫苗并没有明确地作为一列包含在数据集中。因此,我们需要筛选疫苗参考文献,以便进行任何比较分析。

做任何 EDA 的第一步都是制作一些列(或特性)及其分布的图表。熊猫内置函数 df.describe()可以帮助我们一目了然地看到每个数值列的统计数据。

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

每个数字列的关键统计数据

从上图中我们可以看到,在这个疫苗推文中,普通用户有超过一千个朋友,并喜欢上千条其他推文,所以这些主要是活跃的 Twitter 用户,我们正在分析他们的推文。我们还可以看到,平均转发次数为 4 次,平均点赞次数为 18 次。然而,我们应该对这些统计数据有所保留,因为“std”(标准偏差)行向我们显示,正如人们可能想象的那样,数据集中有很多变化。

这个数据集中总共有 16,170 条推文(在完成项目时),所以为了在开始之前直观地检查一些推文的可行性,我们可以看一看转发最多的推文。高转发数表明该推文可能足够丰富,可以广泛分享,或者在推特上足够相关,可以“病毒式传播”。通过对我们的数据框执行以下操作,我们可以预览转发次数最多的前 10 条推文:

df.sort_values(by='retweets', ascending=False)[['text', 'date', 'user_name', 'user_location', 'hashtags', 'favorites', 'retweets']].head(n=10)

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

转发次数最多的 10 条推文

从上面的图片中,我们可以看到许多转发量最大的推文是印度用户在 3 月份发布的,具体指的是 Covaxin 疫苗。同样显而易见的是,转发量最高的 10 条推文中有 3 条来自一个名为“Megh Updates”的账户🚨似乎是新闻更新,而不是对疫苗的基于观点的评论。这是有道理的,因为信息性的推文通常比基于观点的推文更容易被转发。有趣的是,转发量最高的推文来自一位名叫 J Jaishankar 博士的用户,他是印度外交官和政治家,现任印度政府外交部长。他的推文只是更新状态说“挨了我的刺拳。出于好奇,它是 covaxin。感到安全,将安全旅行。”虽然这条消息似乎没有什么信息或观点,但因为 Jaishankar 博士在印度和全球政治领域是一个如此知名的人物,所以他的大量推特粉丝对他的状态更新反应积极是有道理的。

现在,我们可以做另一个快速检查,以了解在疫苗推出的早期阶段,Twitter 上的讨论是如何开始加速的:

df.sort_values(by=['date', 'favorites'], ascending=[True, False])[['text', 'date', 'user_name', 'user_location', 'hashtags', 'favorites', 'retweets']].head(n=10)

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

十大最早、最受欢迎的推文

上面的预览按照日期(升序)对数据集进行排序,然后按照哪些推文获得了最高的喜欢/收藏数(降序)进行排序。我们可以看到,2020 年 12 月 12 日,辉瑞-BioNTech 疫苗获得批准的第二天,Twitter 上开始出现关于新冠肺炎疫苗的讨论。大多数推文都提到了 PfizerBioNTech 疫苗,但这些推文显然没有获得大量受众,当天最受欢迎的推文只有 37 个赞和 2 个转发。

文本 Blob 情感分析

转到这项工作的情感分析部分,我们可以直觉地认为一些推文是信息丰富的,一些推文是有见解的,以将更大的话语划分为具有类似量化特征的独立推文集。这些功能可以使用名为 TextBlob 的 Python 包来获得,该包提供了一个用于 NLP 任务的 API,如词性标注、名词短语提取、情感分析、分类、翻译等。

要安装 TextBlob,请确保在终端窗口中执行以下两个命令:

$ pip install -U textblob
$ python -m textblob.download_corpora

TextBlob 的情感分析处理采用了两个关键指标:极性和主观性。极性得分是[-1.0,1.0]范围内的一个浮动值,它反映了一个陈述或段落的情感负荷。主观性是在[0.0,1.0]范围内的浮动,其中 0.0 非常客观,1.0 非常主观。让我们来看几个简单的例子:

>>> TextBlob("So excited to get my vaccine!").sentiment
Sentiment(polarity=0.46875, subjectivity=0.75)

>>> TextBlob("Is the vaccine painful?").sentiment
Sentiment(polarity=-0.7, subjectivity=0.9)>>> TextBlob("The Pfizer vaccine is now FDA approved").sentimentSentiment(polarity=0.0, subjectivity=0.0)

在第一个例子中,我们可以观察到 TextBlob 识别与陈述相关联的相对积极的情绪负荷,而它识别与第二个例子相关联的消极的情绪负荷。在第一个和第二个例子中,它正确地识别出表达他们对接种疫苗的感受的人是高度主观的。在第三个例子中,陈述被识别为极性中性且高度客观。这三个例子展示了 TextBlob 情感分析如何帮助我们获得定量的文本特征。

虽然 TextBlob 是在大型语料库上训练的,并采用了相当可靠的语言模型,但它的服务最适合于从文本数据中识别句法和语义特征,而不是理解文本。TextBlob 不是上下文感知的,所以从它的 API 返回的分数应该以一种促进进一步分析的方式被松散地解释。

作为 TextBlob 缺点的一个例子:

>>> TextBlob("I tested positive for COVID-19").sentiment
Sentiment(polarity=0.227272727, subjectivity=0.54545454)

TextBlob 被“阳性”这个词搞混了,因为它没有经过识别医学术语的训练。它把这个句子归类为带正电的和相当主观的,即使它实际上应该是消极的或中立的和客观的。当我们解释数据集中每条推文的分类时,了解这一点很重要。对于需要更多上下文感知语言模型的任务,我推荐查看nltkvadersklearnallennlp

让我们来看看 TextBlob 如何看待德克萨斯州州长格雷格·阿博特(Greg Abbott)的以下推文的情绪。

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

2021 年 3 月 14 日 Greg Abbott 的新冠肺炎状态推特截图(在推特上公开)

for sentence in blob.sentences:
    print(sentence)
    print("polarity:", sentence.sentiment.polarity)
    print("subjectivity:", sentence.sentiment.subjectivity)

遍历每个句子并检索极性和主观性得分,我们获得以下结果:

Today Texas surpassed 8 million vaccinations.
polarity: 0.0
subjectivity: 0.0

It was just 4 days ago that we passed 7 million.
polarity: 0.0
subjectivity: 0.0

The positivity rate dropped even lower--to 6.08%--the lowest since May 31st.
polarity: 0.0
subjectivity: 0.0

Hospitalizations went down again also.
polarity: -0.15555555555555559
subjectivity: 0.2888888888888889

Great job Texans!
polarity: 1.0
subjectivity: 0.75

Vaccines are always voluntary, never forced.
polarity: 0.15000000000000002
subjectivity: 0.2

前三句已被确定为具有中性和最大程度的客观性,这是有道理的,因为它们包含了关于疫苗推出和疫情状况的事实趋势。有趣的是,第四句话“住院率也下降了”,被贴上了带有轻微主观性的负面情绪标签。这可能是因为“住院”和“倒下”这两个词有负面含义,而且这里也没有数字或事实证据。如果州长阿博特说“住院率降低了 X %”,这将被认为是一个中立和客观的说法。“干得好,德克萨斯人!”另一方面,是一个积极的、高度主观的陈述的主要例子。

我们现在可以将 TextBlob API 应用到我们的 Twitter 数据上,对所有 16,170 条推文进行情感分析!

df['polarity'] = df['text'].apply(lambda x: TextBlob(x).sentiment.polarity)
df['subjectivity'] = df['text'].apply(lambda x: TextBlob(x).sentiment.subjectivity)
df.head()

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

数据集中所有推文的极性和主观性直方图

上面的直方图描述了数据集中所有推文的极性和主观性得分的细分。数据集中的大多数推文似乎都是信息丰富的疫苗更新,具有中性的极性,没有主观性。然而,在极地推特中,带正电荷的推特略多于带负电荷的推特。我们可以推断,twitter 上的疫苗讨论总体上是乐观的,但如果能知道人们表达的是什么样的乐观情绪,以及人们可能表达的是什么样的焦虑或绝望情绪,那就更好了。

我们可以通过极性得分对数据帧进行排序,然后显示前 10 行来检查这些类型的推文:

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

数据集中负面最多的 10 条推文

上面一条负面推文中一些值得注意的短语包括“啊,我很痛苦”,“令人发指的是……”,“我一生中最头疼的事”,“他妈的”,“我感觉像个废物”,“贪婪到了极点”,“太可怕了!”。在这里,表情符号没有被纳入情感得分,但如果表情符号足够突出,足以纳入分析,肯定有办法将表情符号转换为文本。TextBlob 情感分析的一个明显缺点是,它不认为“祝福”这个词有积极的含义。在第 8 行,当用户说,“如此幸运地完全接种了针对这种毁灭性病毒的疫苗”,单词“毁灭性的”可能混淆了语言模型。这个模型没有认识到疫苗是用来防御毁灭性病毒的,这是一件好事。

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

数据集中最积极的 10 条推文

同样,当我们检查前 10 个最积极的推文时,我们注意到许多高度主观的表达。使用最多的单词和短语包括“感觉棒极了”、“最好的”、“美妙的”和“完美的”。

时间序列分析

对于这个项目的下一个组成部分,我们将看看是否可以探索任何关于时间的趋势。首先,可视化数据集中所有推文的时间分布是有价值的。

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

相对于时间的推文频率

在上图中,很明显,讨论的高潮发生在 3 月 1 日。经过更深入的调查,我得知印度总理纳伦德拉·莫迪在那一天接受了第一剂印度研发的新冠肺炎疫苗 Covaxin。对于印度人来说,这一特殊事件非常令人兴奋和振奋,这从他们在 Twitter 上的活动中可以反映出来。

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

按情感标签分类的推文

在数据集中的所有推文中,大约一半被 TextBlob 指定为情绪中性(极性= 0.0),另一半由 75%带正电荷的推文(极性> 0.0)和 25%带负电荷的推文(极性< 0.0)组成。

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

按日期汇总的推文的平均主观性得分

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

按日期汇总的推文平均极性得分

上面的图表提供了主观得分和极性得分随时间平均变化的快照。从上面的平均极性得分图中,我们可以假设 Twitter 上的话语在二月之前是乐观的,预期疫苗的分发。在 2 月和 3 月,疫苗的推广非常引人注目,人们开始在推特上发布与他们个人经历相关的状态更新。如果一个人有一个关于特定事件在时间上的影响的研究假设,或者如果他们希望获得关于一个事件的直觉,时间序列分析会很有帮助。也就是说,我们的数据涉及多种不同的疫苗,并且推文没有按位置划分,所以很难推断积极或消极的情绪到底意味着什么。为了进一步研究这一点,我们可以使用一种叫做单词云的可视化表示。

词云可视化

这个项目的最后一步是生成颜色编码的单词云,看看哪些单词代表了每种情绪。实现这一点的方法大致如下

  • 执行更彻底的预处理,如拼写检查、拆分无空格短语等。
  • 计算对数似然值
  • 基于对数似然值生成合成语料库
  • 生成更智能的单词云

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

辉瑞生物技术公司:智能词汇云按情绪进行颜色编码

上面的词云描述了对于提到“Pfizer”和/或“BioNTech”的推文的每个情感,通常使用哪些词。积极的推文似乎来自刚刚接受第一次疫苗接种的人,或者对科学家和医护人员所做的工作表示感激的人,而消极的推文似乎来自在接受疫苗后遭受副作用、不良反应或全身不适的人。关于辉瑞疫苗的中性推文中使用的词语似乎类似于新闻标题。其中一些词包括“健康”、“宣布”、“FDA”、“批准”、“百万”、“说”和“疫苗接种”。

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

Moderna:智能词汇云,通过情绪进行颜色编码

Moderna 疫苗的词云产生了与辉瑞推特相似的见解。在带有负面词汇的词云中,有许多关于副作用、手臂酸痛、发冷、发烧、头痛、疲倦感和其他人们可能倾向于在 Twitter 上分享的轻微症状的引用。中性词包括“供应”、“百万”、“十亿”、“诊所”、“mRNA”、“加拿大”、“菲律宾”、“增加”、“总数”以及许多其他与新闻相关的术语。有趣的是,在中立的推文中经常提到 IBM,这可能与宣布 Moderna 和 IBM 计划在新冠肺炎疫苗供应链和分销数据共享方面进行合作有关。也有正面和中性的提及多莉·帕顿,谁帮助资助了现代疫苗,后来接受了现代疫苗。与正面的辉瑞特定推文类似,正面的 Moderna 特定推文往往来自于在接受第一剂疫苗时表达感谢的用户。

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

Covaxin:智能单词云,通过情绪进行颜色编码

最后,Covaxin 的“云”一词包含了许多对印度特定人物和地点的引用。对于负面关联的推文,“宣传”和“政治”这两个词似乎足够吸引人,足以引发进一步的探索。积极相关的推文包括大量提及总理纳伦德拉·莫迪。鉴于印度是一个有着强烈民族自豪感的国家,这些推文中有许多积极情绪是有道理的。此外,从文化的角度来看,这个数据子集与辉瑞和 Moderna 子集相比,存在语言上的细微差别。在印度,如果有人刚刚接种了疫苗,他们可能会说,“我接种了疫苗,”如果没有这些文字云可视化,我们可能不会意识到这一点!

扩展问题

我不相信一个项目会有一个明确的结束,但是,我们会在某个时候决定结束。带着这种心态,我喜欢通过头脑风暴来结束我有兴趣进一步探索的研究问题:

  • 使用tweepy API 获取关于强生&强生疫苗的推文,并对其进行情感分析。
  • 人们在使用哪些标签?标签的使用与更高的点赞数和/或转发数相关吗?
  • 分析包含 URL 的推文的派别。有网址的推文主要是中性情绪吗?
  • 经过验证的推特用户对新冠肺炎疫苗有什么看法?
  • 人们对副作用有什么看法?哪种疫苗副作用最大?
  • 新冠肺炎世界疫苗接种进展数据集与该情绪分析相关联,以监测随着推广的继续,人们对疫苗的态度是如何变化的。

结束语

如果你做到了这一步,非常感谢你的阅读!这项工作的代码可以在下面的 GitHub 资源库中找到:

https://github.com/sejaldua/covid19-vaccy-tweets-NLP

如果你想了解更多我的作品或与我联系,请随时访问我的网站GitHubLinkedIn 和/或 Twitter 。我很乐意连接!

使用 AWS 通过特别批处理对实时推文进行情感分析

原文:https://towardsdatascience.com/sentiment-analysis-on-live-tweets-with-ad-hoc-batch-processing-using-aws-f77036dc337?source=collection_archive---------25-----------------------

使用 AWS 实现的用于摄取的可扩展数据管道的系统设计,具有存储的 NLP。

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

https://github.com/hvp004/twitter-sentiment-analysis(图片作者提供)

我是一家制造公司的数据科学家,通常情况下,我的任务是为部署 ML 模型的数据平台构建计算单元、数据库模式和基础设施。通常,我的任务是边缘处理。

作为一个好奇的灵魂,我一直想在云上建立一个端到端的机器学习模型的可扩展的大数据管道。我通常处理控制器级别的数据或传感器数值数据。我想做一些不同于我日常工作的东西。即文本数据。

申请了 twitter 开发者 API 。经过几天 Twitter 的反复询问,我被允许访问 Twitter 的开发者 API。这意味着我现在可以使用这个 API 获取实时推文流,并查询一周前的历史推文。

整个项目可以在 Github 上找到。

项目概述

Twitter API 将用于从 Twitter 获取 tweet 数据。数据以 15 分钟的时间间隔提取,在指定的时间段内每隔 15 分钟回顾 100 条推文。tweet 文本和一些用户元数据存储在 staging 区域。将tweet_idtext (tweet 本身)推送到 Kinesis 数据流中进行进一步处理。

使用 Kinesis 数据流,对于每条推文,使用 AWS Comprehend ML as a service 进行情感分析。情感分析 API 以正面、负面、中性或混合类别返回文本的总体情感,并以最终结论作为标签。标签只是一个字符串,代表所有指定类别的最高概率。消费者使用这些结果并将数据写入情感桶。

在这里,每个 Kinesis 数据流最多包含 100 条推文。一旦摄取了数据,并且处理了所有 Kinesis 数据流,就使用弹性 Map Reduce (EMR)服务来处理数据。EMR 旨在使用 Hadoop、Spark framework 和 Hive 以完全托管的集群方式以分布式方式处理数据。我们可以通过 ssh 进入主实例,在集群上执行操作。使用pyspark的 EMR 脚本首先通过 AWS cli 从 S3 桶复制到 EMR 主实例中。EMR 从存储桶中加载阶段和情感数据,并使用tweet_id合并它们。然后,它基于 15 分钟的时间窗口执行聚合,以计算该时间段内每个情感类别的平均情感和总推文百分比。这样,聚合的数据可以很容易地可视化,而不必在每次用户想要查看分析时对数千条推文进行聚合。EMR 将合并结果的所有 tweets 数据存储在 s3 桶中。聚集的数据存储在单独的位置(不同的 s3 文件夹或不同的 s3 存储桶)。这样,我们就有了一个所有推文及其主流观点的事务视图,以及一个带有时间窗口的聚合结果的数据集市,该数据集市可用于可视化以时间为参数的数据。

AWS Redshift 是一个完全托管的数据仓库系统,其中的表是使用 SQL 命令制作的。这些表将保存存储在存储桶中的事务性和聚合数据。为了将存储在 s3 存储桶中的数据加载到红移数据仓库,使用了 COPY 命令。建立到红移集群的连接(SQL Workbench 或红移集群查询编辑器),并在集群上执行复制命令,以将数据从存储桶提取到表中。

EC2 实例上的 Grafana 用于可视化。

系统结构

该项目在 AWS 上运行,公开了一些 AWS 服务:

  1. S3:用于存储分期数据、情感数据、推特交易数据、聚合数据
  2. EC2:运行ingest.pyconsumer.py。你也可以在自己的笔记本电脑上运行它们。这是可选的。
  3. EMR 集群:处理所有批量产生的数据。在将数据存储回 S3 之前,合并数据并运行聚合。
  4. 红移集群:最终数据会以红移结束。
  5. AWS understand:为了从 tweet 文本数据中获取情感,使用了 AWS understand。这可以用本地 NLP 模型或带有 HTTP 端点的开源或企业版 ML 模型来代替。这里的领悟是通过boto3 python API 使用的。

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

系统架构(https://github.com/hvp004/twitter-sentiment-analysis)(图片由作者提供)

这里,S3 用于每个处理单元的主存储。AWS S3 为平面文件提供了非常廉价的数据存储能力,具有高可用性和用例灵活性。

摄取与 NLP 工作流保持分离,因为 NLP 完全是一个独立的实体。这样,摄取就独立于 ML 工作流。这种解耦允许我们在不延迟数据获取的情况下,从摄取并行地一起运行多个 NLP 服务。

AWS Kinesis 作为一种临时存储机制,可以更快地检索下游组件和 NLP。数据一旦产生,就被消费者消费。根据对文本执行的分析类型,可以有多个消费者,并且所有消费者都是相互独立的。此外,如果任务失败,就处理和存储而言,在完全隔离的情况下再次运行它会更容易。

EMR 提供了一系列高性能 EC2 实例,并采用了 Hadoop Spark 等广泛使用的分布式处理框架。它有能力对万亿字节或千兆字节的数据进行数据处理。EMR 将数据写入 S3 桶,而不是直接写入红移,原因有几个。可能有许多不同的子系统想要使用经过处理和聚合的数据。S3 的存储比红移便宜得多,红移是按小时付费的。此外,S3 读/写比红移读更便宜,因为我们要为每个请求及其数据包大小付费。Redshift 的主要目标是提供数据的全貌,并能够更快地查询历史数据。红移的数据查询比 S3 快得多。因此,当该系统可能是具有许多微服务的更大架构的一部分时,S3 用于平衡成本。

一旦数据被加载到红移数据库中,像 Grafana 这样的数据可视化系统就可以提取数据并将其可视化。

安装和使用

我是 docker 的粉丝,因为它使我的生活变得简单,可以部署多个计算模块,而且我不必担心主机的环境。为了这个项目,我创建了一个`docker-compose``。我不会深入这个部分的细节,因为它已经在我的 github 回购中描述过了。

仪表盘

我用 grafana 主持仪表板,因为对我来说使用 grafana 进行 ay 项目是很自然的。它有一个丰富的插件集和时间序列数据。我用它创建了一个快速仪表板。

在 AWS 上配置 Linux/Windows 机器。确保它可以访问红移星团。在上面安装 Grafana。将其连接到红移星团,并开始可视化数据。

我用查询字符串biden跑了 4 天,收集了大约 33,000 条推文。

下面的交互式仪表板在第一行显示了每个类别的推文百分比,带有仪表盘。

在第二行中,我将 tweet 的总数显示为一个标签,以及时间轴上每隔 15 分钟收集的 tweet。

在最后一行,我展示了一个饼图,其中显示了该时间段内每个类别的平均情绪得分(NLP)及其时间线。

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

格拉夫纳仪表板https://github.com/hvp004/twitter-sentiment-analysis(图片由作者提供)

结论

摄入依次进行。出现故障时,系统可能处于这样一种状态,即我们必须从最后一个分区开始再次运行摄取。它应该是并行的,因为以前的加载独立于当前正在进行的加载。

可能的解决方案:可以使用类似 Airflow 的调度程序来运行分区并行数据接收。

消费者作为一个独立的消费单位。它按顺序工作。它严重依赖于第三方 API(不属于本系统的 API)。因此,第三方 API 中的任何常规延迟都可能导致消费中的大量延迟,并且随着每个消费周期,随着生产者继续生产数据,数据可能会增加。

可能的解决方案:生产者和消费者数据包之间应该有 1:1 的关系。AWS Kinesis Firehose 是一个数据流传输系统。λ函数可以用于产生的每个数据流,它可以以无服务器的方式处理每个流。

此外,您可以使用类似 Airflow 的调度程序来运行摄取,从而定期运行摄取,使之成为一个定期的批处理过程。在设计上稍作改变,你也可以使用 spark stream 让它与实时推文情感分析一起工作。

情绪分析:预测一条推文是否是关于一场灾难

原文:https://towardsdatascience.com/sentiment-analysis-predicting-whether-a-tweet-is-about-a-disaster-c004d09d7245?source=collection_archive---------13-----------------------

自然语言处理笔记

探索自然语言处理

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

Joshua HoehneUnsplash 上拍摄的照片

介绍

我经常采用机器学习优先的方法来分析数据,但在探索了我的 Github 之后,我意识到我没有太多的探索笔记本,特别是在自然语言处理(NLP)领域,这是我热衷于关注的领域——更具体地说,是感兴趣的对话式人工智能。

https://pub.towardsai.net/7-free-online-resources-for-nlp-lovers-26b1e0bba343

情感分析任务包括使用自然语言处理(NLP)和机器学习(ML)的技术对主观数据进行解释和分类。由于世界上的许多数据都是数字格式的,许多企业正在利用情感分析的力量来收集关于品牌声誉、客户对各种产品的想法等更多信息。

问题陈述

一段时间以来,我一直在用机器学习和 NLP 脚本探索特定的数据集。然而,我从来没有用实际的探索性数据分析(EDA)和数据可视化真正探索过数据集,所以我认为专注于同一个项目来发现一些我以前从来不知道的关于数据的见解是明智的。

Twitter 已经成为紧急情况下的重要沟通渠道。智能手机的普及使人们能够实时宣布他们正在观察的紧急情况。正因为如此,越来越多的机构对有计划地监控 Twitter 感兴趣(即救灾组织和新闻机构)。但是,人们并不总是清楚一个人的话是否实际上是在宣布一场灾难。举个例子:

作者明确地使用了“闪亮”这个词,但它是隐喻性的。这对人类来说是显而易见的,尤其是有了视觉辅助。但是对机器来说就不那么清楚了。

在这场比赛中,你面临的挑战是建立一个机器学习模型,预测哪些推文是关于真正的灾难,哪些不是。你可以访问一个由 10,000 条推文组成的数据集,这些推文都是经过人工分类的。【 来源*:Kaggle—自然语言处理带灾推文】*

链接到使用此数据集完成的其他文章:

注意:本文中用于生成可视化效果的所有代码都可以在 Github 上找到。

https://github.com/kurtispykes/twitter-sentiment-analysis/blob/master/notebook/03_kpy_data_exploration.ipynb

数据分解

典型的 Kaggle,我们的数据集已经分为训练集和测试集。训练集由 7613 行5 列组成,而测试集由 3263 行4 列组成——缺少的列是目标列,我们要预测的。因为我们只是探索数据,所以我将训练和测试数据结合在一起进行进一步分析。

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

作者图片

简单探索性数据分析

在处理分类任务时,我喜欢检查的第一件事是目标标签,因为我想从一开始就知道我们是否有不平衡的分类任务——有关不平衡分类的更多信息,请参见过采样和欠采样

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

作者图片

在我们的数据集中有一个向负面类别(0 → tweet 不是关于灾难)的不平衡。了解这些信息非常重要,因为这可能会对我们创建的最终分类器产生严重影响。例如,分类器可能倾向于预测主要类别,这反过来意味着我们的分类器具有高精度。对于这些类型的问题,这是一个误导性的度量,因为它没有反映分类器正在采取的行动,所以当它被部署到现实世界的环境中时,它将是无效的。在我们的例子中,这种不平衡是不可接受的,但仍然是值得注意的。

接下来,我通常想知道数据集中每个要素缺失的数据量。许多机器学习算法无法处理缺失数据,因此我们需要一种方法来在构建分类器之前处理这些实例(取决于我们使用的分类器)——了解更多关于处理缺失数据的信息。

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

作者图片

在训练和测试集中,location 列中有 33.45%的值缺失,这是非常显著的。由于这些是推文的位置,Twitter 上的用户可以选择关闭他们的位置,我在想我们可能会估算一些东西来表明位置丢失。此外,由于大量位置丢失,我们可以考虑从我们的管道中完全删除此功能。

推文的前 10 个位置列出了国家和城市,所以我将城市转换为国家,并计算每个国家的推文数量。

注意:数据集中有 4521 个唯一地点,但是,我只把出现在前 10 个地点的城市转换成国家。因此,很可能在数据集的其余部分仍有一些城市,如果我们保留这一特征,这是需要考虑的事情。

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

作者 Gif

在同样的地点话题上,我认为找出是否有某些地点更有可能出现灾难推文会很有趣。考虑到这一点,我创建了一个可视化的图表,显示了来自前 10 个地点的灾难性推文的百分比。

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

作者图片

新手数据科学家不常问的一个非常重要的问题——我无意贬低有志之士,尤其是因为我不会责怪你们任何人没有问。像这样的事情在我们在线学习的许多课程中通常不会教授,只能通过动手实践来学习——数据究竟来自哪里,如何收集等等。这些类型的数据查询非常重要,原因超出了本文的范围,但在将来,我一定会再次访问它。

尽管如此,其中一个原因是,您可能希望验证从收集源获得的数据。例如,我知道这些数据是由一家名为 figure-eight 的公司创建的,但我不确定这些数据是如何标记的,以及是如何创建的。我可以向你保证的一件事是,如果人类参与到这个过程中,总会有很大的出错空间,因为我们可能会疲劳——当然,计算机也会出错,但希望你明白我的意思。

由于我不知道数据是如何收集或标记的,我的第一个想法是考虑我们的数据集中是否有重复的推文。结果如下:

  • 198 在训练和测试数据中出现重复的 tweets
  • 这些副本中的 110 个在训练数据中
  • 88 是来自测试数据的重复推文

这让我很担心。如果数据中存在重复,那么如果人类标记了实例,则可能存在不同标记的重复标签。这个想法是对的。

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

作者图片

Kaggle 有一个看不见的数据集,它用来评估你在私人排行榜上的位置,有可能标签也贴错了。在商业环境中,如果对分类器结果有严重影响,您会想要手动重新标记它们,那么这肯定是需要调整的。然而,为了安全起见,我手动更改了这些标签以适应正确的类别。

在处理文本时,很难在传统的图(例如条形图和线图)上将其可视化。相反,我们可以使用单词云来可视化数据中出现的常见单词。我用这种方法将与灾难联系最紧密的关键词特征可视化…

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

作者图片

而那些与灾难无关的…

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

作者图片

在大得多的文本中显示的单词是那些在数据集中具有更频繁计数的单词。关于新实例,我们可以做一个天真的假设,任何包含关键字“爆发”和“残骸”的实例都可能是关于灾难的,而包含“世界末日”和“尸体”的实例可能是非灾难的。

还有许多其他因素需要考虑。例如,如果有人正处于灾难之中,他们会写更长的推文还是更短的推文,以及那个人会使用更多还是更少的标点符号。这些想法可以用统计数据来捕捉。

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

作者 Gif

做预测

为了确定我将继续开发哪个模型,我构建了各种不同的模型,仅使用text作为输入,并使用 5 重分层交叉验证测试每个模型。我使用的模型是:

为了将文本从自然语言转换成计算机语言——仅仅是数字——我使用了 3 种不同的方法:

  • 术语频率—逆文档频率
  • 字数
  • Word2vec

在使用我的交叉验证策略运行每个模型后,我取了每个模型在所有折叠上的表现的平均值,并以此作为指标来决定我要继续使用的模型,并用于进一步的分析。

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

作者图片

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

作者图片

实际上,我确实认为这个数据集足够小,不需要递归神经网络,但无论如何,在没有任何调整、特征工程和仅使用text特征的情况下,我们得到了双向 LSTM 非常不错的平均 F1 分数(这是本次比赛使用的指标)——如果你不熟悉 F1 分数,可以在我的混淆矩阵文章中了解更多信息。

估价

为了评估模型,我将完整的训练数据分为 70%的训练数据和 30%的验证数据,这样我就可以构建一个模型,并评估模型在哪里出错。首先,我注意到我的 LSTM 模型非常严重地过度拟合了训练数据:

  • 训练 F1 分数— 0.9019 (4 标准英尺)
  • 验证 F1 分数— 0.7444 (4 标准偏差)

为了减少过度拟合,我们可以添加一些正则化作为即时解决方案,但我会在另一篇博客文章中进一步探讨这一点。

从混淆矩阵中,我意识到该模型很难预测正面类,因为它犯了 294 个第二类错误——这意味着它预测负面,而推文实际上是正面的。这种现象的另一个名字叫做假阴性。这个问题可以追溯到我最初对不平衡的班级的关注。

包裹

在这篇文章中,我讨论了我从 Twitter 中探索文本数据的过程,以及我如何着手建立模型,以查看我将使用哪个模型进行进一步开发。在未来的工作中,我计划解决我们的数据存在的过度拟合问题,并建立一个非常基本的前端,以便你可以键入一些你自己的推文,你将能够看到系统是否认为你的推文是关于灾难的。

LinkedInTwitter 上与我联系,及时了解我和我关于人工智能、数据科学和自由职业的帖子。

使用分类的情感分析

原文:https://towardsdatascience.com/sentiment-analysis-using-classification-e73da5b4159f?source=collection_archive---------30-----------------------

如何根据历史数据计算情感得分

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

阴阳咖啡由亚历克斯从 Unsplash

情感分析是一种常用的文本分析技术,用于确定文本是正面的、负面的还是中性的。它可以用来了解观众的满意度,也是一个很好的预测功能。如果您有一个标记良好的数据集(带有基本事实情感得分),您可以考虑使用文本分类来计算情感得分。

使用分类的好处:

  1. 分类的使用可以从特定于行业或主题的历史数据中自动捕获模式。你不需要搜索特定主题的肯定或否定单词列表。
  2. 包含不同的词袋计算作为情感分类的特征更加方便,因为您可以在现有的包中直接定义它。像“不好”和“不喜欢”这样的否定短语是可以捕捉到的,但是你自己很难捕捉到所有这些短语。
  3. 有很多现有的分类算法供你选择。最佳拟合模型的潜力很大。

唯一的缺点是:你需要有标签数据!

资料组

我们使用的数据是 Yelp 标记的数据集,来自 Kaggle 。第一列是评论文本,第二列是情感分数的基本事实(1 是负面情感,2 是正面情感)

首先,让我们将数据集分成训练集和测试集(您可以根据您拥有的数据量来决定 test_size)。如果你有一个足够大的数据集,你可以选择降低测试集的比例。

from sklearn.model_selection import train_test_split
Y=sample_new['rating']
X=sample_new['review']
X_train,X_test,Y_train,Y_test=train_test_split(X,Y,test_size=0.2)

数据预处理

这里我们使用了两个 sklearn 包:

  1. 计数矢量器 :将文本转换成令牌计数矩阵。令牌可以是单个单词或 2-gram 或 3-gram 短语。它还允许您在参数中指定 n_gram 范围、停用词移除等。

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

CountVectorizer(单个单词标记)后的两个评论句子示例

  1. TfidfTransformer :这里我们需要先了解一下 TF-IDF。TF-IDF 全称是‘词频-逆文档频’。术语频率是指单词或短语在整个文本中出现的频率。然而,如果一个术语出现得太频繁,那么它传达的有用信息就少了,TF-IDF 计算使用对数函数缩小出现得太频繁的术语。你也可以选择只使用词频来代替。

TF-IDF(术语,文档)=术语频率(术语,文档)*日志(文档总数/(文档频率+ 1))

例如,数据科学文章通常包含“数据”一词。但是,它通常不会告诉你文章的观点(只是一个笼统的词)。TF-IDF transformer 基本上把字数矩阵转换成频率矩阵

from sklearn.feature_extraction.text import CountVectorizer
vectorize = CountVectorizer(ngram_range=(1,2))
X_train_counts=vectorize.fit_transform(X_train)from sklearn.feature_extraction.text import TfidfTransformer
tfidf_transformer = TfidfTransformer()
X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)
X_train_tfidf.shape#(24000, 44563)

这里,我在 ngram_range 参数中将标记指定为单个单词或 2-gram 单词(可以根据需要将(1,2)改为 n_gram),最后输出频率矩阵作为分类的特征。

分类模型和评估

最后,建模部分

对于使用什么没有限制,您可以对整个数据集进行采样,并查看哪个模型在准确性或其他评估指标方面最适合该样本。你可以在这里参考如何评估你的分类模型。

from sklearn.linear_model import LogisticRegression
lr=LogisticRegression().fit(X_train_tfidf, Y_train)X_test_count=vectorize.transform(X_test)
X_test_tfidf=tfidf_transformer.transform(X_test_count)predicted=lr.predict(X_test_tfidf)#evaluate accuracy
np.mean(predicted == Y_test)
#0.89883

逻辑回归给出了几乎 90%的准确率

from sklearn import svm
from sklearn.pipeline import Pipelinetext_svm = Pipeline([
     ('vectorize', CountVectorizer()),
     ('tfidf', TfidfTransformer()),
     ('svm', svm.SVC()),
 ])text_svm.fit(X_train,Y_train)
predicted=text_svm.predict(X_test)
np.mean(predicted==Y_test)
#0.9

这里我使用了 sklearn 包管道将所有进程组合在一起。支持向量机精确地给出 90%的准确度。

from sklearn.neural_network import MLPClassifier
text_nn = Pipeline([
     ('vectorize', CountVectorizer()),
     ('tfidf', TfidfTransformer()),
     ('nn', MLPClassifier(solver='lbfgs', alpha=1e-5,
                     hidden_layer_sizes=(5, 2), random_state=1)),
 ])text_nn.fit(X_train,Y_train)
predicted=text_nn.predict(X_test)
np.mean(predicted==Y_test)
#0.88167

深度学习 MLP 分类器可以达到 88%左右

进一步改进

  1. count vectorizer的参数调整:n_gram_range、最大/最小文档频率等参数,用于检索分类的理想频率得分。这需要对数据集有很好的理解,也需要一些反复试验来达到理想的输出
  2. 分类模型的参数调整:您可以使用 grid_search 或 random search 之类的搜索方法,在准确性或其他指标方面找到最佳的参数集。这将导致整个过程运行更长时间。
  3. **分类模型评估:**评估多个指标的性能,如召回率、精确度,而不仅仅是准确度

结论

数据量对于分类性能非常重要。如果没有足够大的数据集,不要让模型太复杂,因为有过度拟合的风险。此外,对数据的初步理解很重要,在做所有这些工作之前,你应该拿出一些样本文本来更多地了解数据的模式。

最后,如果你没有带标签的数据,想看看如何通过计算正面/负面词汇来计算情感得分,你可以参考我下面的另一篇文章。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值