Python 人工智能:16~20

栏目:娱乐资讯  时间:2023-08-15
手机版

  原文:Artificial Intelligence with Python

  协议:CC BY-NC-SA 4.0

  译者:飞龙

  本文来自【ApacheCN 深度学习 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。

  不要担心自己的形象,只关心如何实现目标。——《原则》,生活原则 2.3.c

  在本章中,我们将学习聊天机器人。 我们将了解它们是什么以及如何使用它们。 您还将学习如何创建自己的聊天机器人。 我们将涵盖以下主题: 聊天机器人的未来聊天机器人的现状基本的聊天机器人概念流行的聊天机器人平台DialogFlow: 设置 DialogFlow使用小部件将聊天机器人集成到网站中使用 Python 将聊天机器人集成到网站中在 DialogFlow 中设置 Webhook为意图启用 Webhook为意图设定训练短语设置意图的参数和动作通过 Webhook 建立履行响应检查来自 Webhook 的响应

  我们将首先讨论聊天机器人的未来及其许多潜在应用。

  很难准确预测 AI 在未来几年将如何颠覆我们的社会。 就像核技术已被用于开发核武器和为核电站供能一样,人工智能也可以用于崇高的事业或邪恶的目的。 不难想象,世界各地的军事人员拥有利用人工智能技术的强大武器。 例如,使用当前的“现成”技术,我们可以制造一架无人驾驶飞机,向其提供目标人员的照片,然后让无人驾驶飞机追捕该人,直到将其消灭。

  即使将该技术用于更具建设性的用例,也很难预测该技术在未来几年中将如何发展。 各种各样的研究在某种程度上预测,由于 AI 推动的生产率提高,整个行业将不再需要过去的工人。 货运和运输业以及呼叫中心业是两个“低落的果实”。

  过去几年中,语音接口终于突破并渗透到我们的生活中。 Alexa,Siri 和 Google Home 之类的应用已开始嵌入我们的生活和文化中。 此外,微信,Facebook Messenger,WhatsApp 和 Slack 等消息传递平台为企业与人互动创造了机会,并有可能通过这些互动获利。 这些消息传递平台变得如此流行和普及,以至于 2019 年,四大服务比四大社交网络平台拥有更多的活跃用户(41 亿对 34 亿)。

  呼叫中心在过去几年中已经发生了巨大变化。 随着使用聊天机器人,云计算和语音生物识别技术的不断发展,公司可以改善客户服务并以更少的人员处理更多的电话。

  我们还没有,但是很容易想象,在接下来的 5 或 10 年中,当您致电您的银行时,只有最不常见的情况需要人工干预,并且很大一部分电话会自动处理。

  这种趋势只会继续加速。 当前,没有人将大多数聊天机器人对话与人类对话混淆。 但是随着它们在未来几年变得更好,它会变得更加自然和流畅。 当我们拨打呼叫中心时,有时至少是,打电话给我们的原因之一是抱怨或发泄,不仅能解决问题。 随着聊天机器人变得越来越好,他们将能够展示出我们所理解的同情和理解。 此外,他们将拥有对您以前所有通话的完全访问权限,并且能够通过记住先前对话的片段来发展历史并建立融洽的关系。

  例如,聊天机器人很快就可以记住您提到孩子的名字,下次打电话时问您 Bobby 做得如何。 此外,就像现在一样,当您通过网络,电话应用等不同渠道与银行进行通信,或者与分行中的某人交谈时,聊天机器人将能够访问并使用通过其他渠道输入的信息,可以为您提供更好,更快的服务。 再说一次,我们还没有到那儿,但是可能会有一天,我们宁愿打电话给客户服务,而不是使用其他渠道(如在线访问),因为这样会更快更有效。 举例来说,我确实发现自己越来越多地使用 Alexa,并且对她的功能和怪癖也越来越熟悉和熟悉。 我仍在努力使她动摇,但尚未实现。

  不仅与 Alexa 一起,而且与其他智能家居助手一起,我们许多人使用它们来: 听音乐设置闹钟创建购物清单获取天气预报控制房屋周围的设备订购在线商品预订机票

  但是这种经验可能会变得更加复杂。 随着它们变得更好,它们将至少在某些方面超越我们。 例如,除非我们以这种方式对其进行编程,否则聊天机器人将永远不会感到沮丧。

  对于一般的 AI 尤其是聊天机器人,持续不断的发展在伦理上的影响是一个不变的话题。 随着聊天机器人变得越来越好,越来越像人类,当我们与聊天机器人而不是人类聊天时,监管机构可能会迫使企业披露信息。 这可能不是一个坏规则。 但是,我们可能会达到这样的地步:聊天机器人是如此出色,以至于尽管在一开始就进行了披露,但我们很快就会忘记,另一端是一台计算机,而不是理解我们并同情我们的人。

  Google Duplex 是一个很好的聊天机器人听起来很自然的有力例子。 您应该可以在此处观看它的演示。

  顺便说一下,这项技术通常是可用的,如果您有 Android 手机或 iPhone,则应该可以使用它。

  毫无疑问,聊天机器人将是多产的—在我们的家中,在我们的汽车中,在可穿戴设备中,在呼叫中心以及在电话中。 根据一项估计,聊天机器人的全球市场预计将从 2019 年的 42 亿美元增长到 2024 年的 157 亿美元,年复合增长率为 30.2%。 与其他技术一样,使用该技术成长的年轻人永远不会知道没有聊天机器人为我们服务并改善我们的生活会是什么样子。

  本节讨论了聊天机器人在未来几年内的外观。 在下一节中,我们将回到现实,并就如何利用现有的聊天机器人技术使用当今可用的工具创建出色的应用提供一些建议。

  在的上一节中,我们讨论了随着人工智能技术的发展,未来几年可能实现的目标。 与任何技术一样,我们不应该等到一切都变得完美为止。 在本节以及本章的其余部分,我们将重点介绍当今可行的方法以及使您自己的应用尽可能有用和用户友好的最佳实践。

  为了利用当今可用的现有技术,并且鉴于仍然需要使用域数据和特定意图来对当前的聊天机器人进行专门编程,因此,我们应该谨慎设计一个好的设计和好的计划来对我们的聊天机器人进行编程。 从为聊天机器人明确定义的目标开始,避免尝试提出广泛的解决方案。 当前,与定义为“万事通”的聊天机器人相比,在定义明确且狭窄的域空间中发挥作用的聊天机器人具有更好的表现和有用的机会。 设计用于在在线商务体验期间提供支持的聊天机器人不能用于诊断汽车问题,而必须在该域中重新编程。 将聊天机器人明确地放在特定的目标和空间上,这样很可能会为用户创造更好的体验。

  为了说明这一点,我将分享一个个人故事。 几年前,我参观了迈阿密的一家餐馆。 如您所知,英语是美国最常见的语言,但在迈阿密却不那么普遍。 我们看了看菜单,点了饮料,然后点了开胃菜。 现在该订购主菜了。 我决定与服务员开始一些闲聊。 我忘记了我的具体问题,但这与“您喜欢在迈阿密生活如何?”类似。 脸上惊慌失措的表情告诉我,他不明白这个问题,无论有多少次,我试图解释,他都不会。 为了使他放松,我切换到西班牙语并完成了我们的小聊天。

  这里的要点是服务生知道“餐馆英语”以及完成餐厅交易所需的所有短语和互动。 但是其他一切都超出了他的舒适范围。 同样,当我们在以下各节中开发聊天机器人时,只要我们停留在预期的域中,它就可以与我们的用户进行通信。 如果聊天机器人被开发用于预订餐厅,那么如果用户的意图是进行医疗诊断,它将无法提供帮助。

  今天的聊天机器人仍然有些狭窄。 目前,我们使用 Alexa,Siri 和 Google Home 可以做的事情很多,它们只能帮助我们完成特定的任务。 他们还不能很好地处理某些人类特质,例如同理心,讽刺和批判性思维。 在目前的状态下,聊天机器人将能够以人类为中心的方式帮助我们完成重复性的交易任务。

  但是,即使我们应该尝试使聊天机器人在域上保持尽可能紧密,但这并不意味着我们不应该在机器人中注入一些“个性”。 Alexa 有时可能会显得厚脸皮和幽默,因此您应该为自己的机器人而努力。 这样可以提高与机器人的互动度。

  人们在聊天时,通常希望对对话有一定程度的共同兴趣,因此,对话将以这样的方式进行:将存在回答后续问题的答案,以及有助于和促进对话的答案 。 使用一点语将使您的机器人更真实,更有吸引力。

  在深入研究自己的聊天机器人的设计之前,让我们介绍一些在开发过程中对我们有帮助的基础概念。

  在开发代码之前,让我们设定一个基准并访问一些与聊天机器人相关的有用定义。

  智能体

  智能体是一个可以处理所有对话并路由所有必要的操作的系统。 这是一种自然语言理解模块,需要经常接受训练以适应特定于使用的需求。

  意图

  当两个人进行通信时,他们俩都有他们开始进行通信的原因。 这可能很简单,例如与朋友追赶并找出他们在做什么。

  可能其中一个正在试图出售某物等等。 这些“意图”可分为三大类: 演讲者正在尝试娱乐:例如,有人告诉您开玩笑。演讲者正在尝试通知:有人问几点了,或者温度是多少? 他们收到了答案。演讲者试图说服:议程是试图出售一些东西。

  对于大多数聊天机器人,它们的作用是执行命令和执行任务。 由于的原因,他们需要执行的第一个任务是确定调用他们的人的意图。 意图具有诸如上下文,训练阶段,动作和参数以及响应之类的元素。

  上下文

  上下文是用来给予讨论的连贯性和流畅性,保留了对话中已经使用的关键概念。

  实体

  这基本上是将一组单词归为一个已定义的实体。 例如,笔,铅笔,纸,橡皮和笔记本可以称为文具。 因此,DialogFlow 提供了已经过训练的预建实体,或者我们可以构建自定义实体并对其进行训练。 这有助于减少训练短语的冗余。

  集成

  像 DialogFlow 和 Lex 这样的聊天机器人平台可以与大多数最受欢迎的对话和消息传递平台集成,例如 Google Assistant,Facebook Messenger,Kik 和 Viber 等。

  履行

  履行是一项连接服务,可让您根据最终用户的表达来执行操作,并将动态响应发送回用户。 例如,如果用户正在寻找员工详细信息,则您的服务可以从数据库中获取详细信息,并立即对用户结果进行响应。

  语气

  每当我们与某人进行对话时,使用稍有不同的方式提出相同的问题是完全正常的。 例如,我们可能会问“今天过得怎么样?”的问题,但是有很多方法可以问相同的问题。 示例包括: 告诉我你的一天你今天过得还好么?你今天过的好吗?工作进展如何?

  人类自然会善于从话语中解释含义,并回答发问者想问的问题而不是他们实际问的问题。 例如,对问题“您过得愉快吗?”的简单解释。 将要求答案为是或否。 但是作为人类,我们有足够的技巧来理解的真正含义可能是“告诉我您的一天”。

  许多聊天机器人平台都变得越来越好,不再要求我们拼出每一个发音,而是能够进行一些“模糊”匹配,并且不需要为每个单独的组合输入内容。

  唤醒词

  像 Alexa 或 Siri 这样的许多聊天机器人保持休眠状态,直到它们被“唤醒”并准备好接收命令为止。 要唤醒它们,需要一个“唤醒词”。 对于 Alexa,最常用的唤醒词是“Alexa”。 对于 Siri,默认唤醒字为“Hey Siri”。 并且,对于 StarShip 企业版,唤醒词是“Computer”。

  启动词

  聊天机器人唤醒后,很多时候我们希望该聊天机器人为我们执行一个动作,因此我们需要“启动”该动作。 一些启动词的示例是: (订购)(告诉我)(添加)(打开)

  您可以将启动词视为命令。

  插槽值或实体

  插槽值是字,将被转换为参数。 让我们看几个例子:

  插槽值带有下划线。 插槽值可以具有插槽类型。 就像参数可以具有参数类型(整数,字符串等)一样。 某些插槽类型是内置的,还可以创建自定义插槽类型。 插槽类型的一些示例是: 国名电子邮件地址电话号码日期

  一些聊天机器人平台将插槽类型称为实体。

  错误计划和默认情况

  设计良好的聊天机器人应始终优雅地处理无法预料的情况。 当聊天机器人没有针对特定交互的程序化答案时,它应该能够显示默认行为,以尽可能优雅地处理无法预料的情况。 例如,如果聊天机器人的功能是预订美国境内的国内航班,但用户请求飞往加拿大温哥华的包机,则聊天机器人应能够优雅地告诉用户他们仅服务于美国城市,然后再次询问目的地 。

  Webhooks

  Webhook 是,HTTP 推送 API 或 Web 回调。 它也称为反向 API,因为一旦事件发生,它就会将数据从应用发送到应用使用者。 它消除了消费者不断轮询应用的需求。

  既然我们已经介绍了与聊天机器人更好地协作所需的基本概念,让我们考虑如何创建一个有用的,“结构良好”的聊天机器人。

  为了使聊天机器人有用并使其高效,它必须具有某些特质。 我们将具有这些特质的聊天机器人称为“结构良好”的聊天机器人。 我们列出并定义以下质量:

  适应性

  自适应聊天机器人是一种可以理解并适应收到的所有语音的聊天机器人。 即使对于未明确编程的语音,也应该有一个优美的响应,以使聊天机器人用户重回正轨,或者利用此机会将会议转移给实时操作员。

  个性化设置

  作为人类,我们喜欢感到与众不同。 我们喜欢听到自己的名字,也喜欢别人记住我们的一些小事(我们孩子的名字,母校等等)。 个性化的聊天机器人会记住以前的交互以及他们收集的有关单个用户的信息。

  可用性

  应该有一个聊天机器人可以帮助用户。 这超出了传统平台的可用性。 当然,我们的聊天机器人应该随时准备提供帮助,并在需要时随时进行访问。 但这也适用于我们能够以多快的速度获取聊天机器人来帮助我们实现意图。 想一想在传统交互式语音响应(IVR)系统中的导航树,在这些导航树中,我们必须按很多数字,然后他们才知道我们要执行的意图。 此类系统的可用性较低。

  相关性

  与相关的聊天机器人可以使聊天机器人的用户感知到他们确实在进行正常的对话。

  我们几乎已经准备好继续开发自己的聊天机器人。 但是,在此之前,我们应该考虑主要的聊天机器人平台,这些平台是我们聊天机器人的开发和发行的基础。

  一些使用最广泛的聊天机器人是由主要供应商(例如 Google,AWS 和 Microsoft)开发的平台实现的。 在为聊天机器人选择技术栈时,应仔细考虑他们的服务产品。 这三大供应商均提供可靠且可扩展的云计算服务,这些服务将帮助您根据需要实现和自定义聊天机器人。 到目前为止,可以轻松创建基于文本或语音的机器人的最著名平台如下: DialogFlow(Google,以前为 Api.ai)Azure Bot 服务(Microsoft)Lex(AWS)Wit.ai(Facebook)Waston(IBM)

  当然可以使用此处列出的平台以及其他流行的平台编写功能强大的聊天机器人。 但是我们现在将更深入地研究一个平台,尤其是获得更深入的了解。 在聊天机器人服务中,DialogFlow 对于初学者来说是一个不错的选择。 我们将在下一节中讨论 DialogFlow,并在本章的其余部分中使用该平台进行聊天机器人的开发。

  Google 在机器学习和自然语言处理(NLP)中有着广泛的研究历史。 这项研究的大部分内容都反映在他们的 DialogFlow 工具中。 DialogFlow 与 Google Cloud 语音转文本 API 以及其他第三方服务(例如 Google Assistant,Amazon Alexa 和 Facebook Messenger)集成在一起。

  无需编写任何代码即可创建提供很多功能的聊天机器人。 最初,我们将回顾如何使用 Google Cloud Platform(GCP)控制台,仅通过即可不使用代码来配置聊天机器人。 在本章的以下各节中,我们将演示如何将聊天机器人与其他服务集成。 本章后面的部分将需要对 Python 语言有基本的了解。

  入门步骤 使用 Google 帐户在这里免费注册。为了使聊天机器人正常工作,您需要接受 DialogFlow 所请求的所有权限。 这样,您就可以管理 GCP 服务中的数据,并与 Google 助手集成。您可以通过这里访问 DialogFlow 控制台。最后,通过选择主要语言(以后可以添加其他语言)和 Google Project 标识符来创建新智能体。 要启用结算和其他设置,需要使用 Google Cloud Console 中的项目名称。 如果您没有现有项目,请不要担心:创建一个新项目。

  现在您已经注册并可以使用,让我们开始设置 DialogFlow。

  首次登录 DialogFlow 时,将要求您允许某些权限。 建议您允许这些权限。 否则,以下练习将无法正常进行:

  [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MXJ7E6po-1681568818800)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/ai-py/img/B15441_16_01.png)]

  图 1:Google Cloud Console 访问 DialogFlow 控制台的权限

  DialogFlow 中的开发利用了我们之前讨论的两个主要概念-意向和上下文。 目的标识用户向聊天机器人发出语音的目的。 上下文使对话变得连贯和流畅。

  单击意图选项卡后,您应该看到如下屏幕:

  [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f1qTCbmt-1681568818801)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/ai-py/img/B15441_16_02.png)]

  图 2:DialogFlow 聊天机器人意图创建

  正如我们先前看到的,聊天机器人开发中的另一个重要概念是插槽类型。 在 DialogFlow 中,我们将插槽类型称为实体。 通过实体,可以识别对话中的常见或重复出现的参数。 实体可以是内置的或定制的。 实体的使用使聊天机器人更具通用性和灵活性。 单击实体标签时,您应该看到以下屏幕:

  [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-93guXiQS-1681568818801)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/ai-py/img/B15441_16_03.png)]

  图 3:DialogFlow 聊天机器人实体创建

  让我们从仅使用意图的基本示例开始。 首先,我们将创建智能体,然后通过 DialogFlow 接口定义一些意图。 可以通过编程方式创建这些意图,但是为了使示例保持简单,我们将使用图形化界面来创建意图。 首先,让我们设置后备意图。 如果没有其他意图被调用,则将被调用:

  [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DbW3u07U-1681568818801)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/ai-py/img/B15441_16_04.png)]

  图 4:创建 DialogFlow 后备意图

  正如您在“图 4”中看到的那样,只需编写立即尝试表格即可获得答案。 最初,当尚未创建任何意图时,聊天机器人将使用后备意图。 具有后备意图可防止对话陷入停顿。

  当我们浏览默认回退意图时,我们看到响应的完整列表。 如您所见,已经定义了许多响应。 当意图匹配时,聊天机器人引擎将随机选择一个项目作为答案。

  让我们创建我们的第一个意图。 我们可以使用控制台执行此操作。 确保您还填写了训练短语表格。 这些是我们期望用户触发这些意图的句子。 我们在构造这些句子时越精确,越全面,那么聊天机器人在识别意图方面将越成功。

  现在,我们可以通过插入更多意图为聊天机器人添加更多功能来进行操作。 我们可以使用右侧的助手连续测试我们的聊天机器人。

  希望很明显,仅使用意图就可以创建功能强大的聊天机器人。 DialogFlow 正在为我们完成大部分繁重的工作。 为了使聊天机器人更加强大,我们可以开始向意图添加上下文。 我们可以通过在从一个意图转到另一个意图的同时添加参数,同时保持对话的上下文,来使我们的聊天机器人更加灵活。 在本教程的下一部分中,我们将看到如何将聊天机器人集成到网站中。

  可以通过两种方法将 DialogFlow 聊天机器人集成到网站中: 通过小部件使用 Python

  我们将从访问第一种方法开始,这是更简单的方法。 此方法使用将 DialogFlow 集成到网页中。 要使用此方法,请从左侧菜单中选择,并确保已启用。 复制 HTML 代码并将其粘贴到网页中,这样就可以在您的网站上使用聊天机器人了:

  [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iXxA2MDJ-1681568818802)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/ai-py/img/B15441_16_05.png)]

  图 5:使用将聊天机器人集成到网站中

  在下面的部分中,我们将考虑第二种方法-使用 Python。 如我们所见,集成聊天机器人的小部件方法非常简单。 但是,我们几乎无法控制机器人的实现方式。 使用 Python 将聊天机器人集成到站点中,可以在如何部署聊天机器人方面为开发人员提供更多的控制权和灵活性。

  调用 DialogFlow 聊天机器人的另一种方法是使用 Python。 首先,我们需要安装运行代码所需的包要求:

  该代码初始化一个以意图为输入的客户端会话,最后返回一个响应,即所谓的,并将相应的置信度作为一个十进制值。 我们要获取答案的句子保存在名为的变量中。 通过添加句子来编辑脚本。 使用 Python,很容易创建更多的自定义逻辑。 对于示例,您可以捕获意图,然后触发自定义操作:

  如您所见,该函数需要一个。 这是一个标识当前会话的值。 因此,我们建议您使用用户的 ID 使其易于检索。

  为了使 Python 代码正常工作,需要一个新令牌。 实际上,DialogFlow API 的 2.0 版依赖于身份验证系统,该系统基于与 GCP 服务帐户关联的私钥而不是访问令牌。 使用此过程,可以获取 JSON 格式的私钥。

  实现和网络挂钩

  现在我们已经建立了,如何创建会话,让我们将其用于一些有用的事情。 进行会话的目的是能够向服务器发出请求并接收可以满足该请求的响应。 在 DialogFlow 中,请求称为 Webhooks,并且大致对应于响应。 实现是 DialogFlow 的一项有用功能:通过实现,我们可以与后端进行通信并生成动态响应。 通过实现,我们可以开发一个 Webhook,该 Webhook 接受来自 DialogFlow 的请求,处理该请求,并使用与 DialogFlow 兼容的 JSON 进行响应。

  在 DialogFlow 中,当调用某些启用了 Webhook 的意图时,将使用 Webhook 从后端获取数据。 来自该意图的信息将传递到 webhook 服务,然后返回响应。

  为此,可以使用 ngrok 。 ngrok 软件是可用于调用 Webhook 的 Web 隧道工具。 它允许使用本地服务器测试 API 和 Webhooks。 本教程本节中将使用的另一个工具是 Flask 。 Flask 是一个轻量级的 Web 框架,可用于创建可调用外部应用的 Webhook 服务。 在我们的示例中,将被调用的外部应用是 DialogFlow 智能体。 要使用 Flask,我们首先需要安装它:

  要了解有关 Flask 的更多信息,您可以访问这里。

  使用 Flask 创建 Webhook

  首先,我们可以创建一个基本的 Flask 应用:

  使用以下命令测试应用:

  如果您看到前面的输出,这将确认该应用的初始版本正在运行。 到目前为止,我们仅使用本地服务器,因此其他外部客户端无法通过互联网访问该服务器。 要将其集成为 DialogFlow 的 Webhook,我们需要将其部署在可以通过互联网访问的服务器上。 那就是 ngrok 工具出现的地方。可以在这里下载该工具。

  要运行 ngrok,请使用以下命令:

  例如:

  收到的输出应该是这样的:

  [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lXKsDobf-1681568818802)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/ai-py/img/B15441_16_06.png)]

  图 6:ngrok 初始化输出

  在下一节中,我们将研究如何在 DialogFlow 中设置 Webhook。

  要在 DialogFlow 中设置 Webhook,请在左侧栏中选择实现,然后选择输入 ngrok 生成的 Webhook URL:

  [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N6vIpCmN-1681568818802)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/ai-py/img/B15441_16_07.png)]

  图 7:Dialogflow Webhook 设置

  确保将后缀添加到 URL 的末尾。 它看起来应该像这样:

  不:

  我们将在路由而不是索引路由上处理请求。

  如果该 URL 没有 webhook 后缀,则应出现以下错误:

  更正 URL 以包括后缀,这样可以解决该错误。

  接下来,需要启用 Webhook 以支持意图并获取服务器数据。 在下一节中,我们将介绍如何做到这一点。

  要为意图启用 webhooks ,请打开需要启用 webhook 的意图,向下滚动到页面底部,然后启用选项为此意图启用 webhook 调用:

  [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I5EmO2Y0-1681568818803)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/ai-py/img/B15441_16_08.png)]

  图 8:意图的 Dialogflow Webhook 启用

  触发意图后,它会向 Webhook 发送请求,然后将响应发送回去。 现在,我们可以继续设置训练阶段。

  训练短语是帮助聊天机器人确定被调用意图的语音。 这是一个应如何设置的示例:

  [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nNkvmRTd-1681568818803)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/ai-py/img/B15441_16_09.png)]

  图 9:意图的 Dialogflow 训练短语设置

  接下来,我们需要设置参数和操作。

  需要先设置操作和参数,然后才能在 Webhook 中使用来处理请求。

  在当前的示例中,被设置为动作。 每当意图使用请求调用 Webhook 时,将作为动作收到。 如果存在可以调用 Webhook 的多个意图,则将使用该动作进行区分,并由此生成不同的响应。

  我们还可以将参数传递到我们的 webhook。 为此,我们可以定义参数名称及其值。 在此示例中,我们将非常简单地开始,但最终我们将允许用户从餐厅订购食物。 因此,例如,用户可能会说:“我想订购汉堡和薯条”,而聊天机器人会将这种话语传递给后端,以进行验证,存储和处理:

  [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nb3xTMgE-1681568818803)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/ai-py/img/B15441_16_10.png)]

  图 10:Dialogflow 操作和参数设置

  动作和参数是可选值。 即使未传递操作和参数,Webhook 仍将运行。 为了区分没有动作的意图,可以在请求 JSON 中检查意图名称。

  Webhook 响应应该使用有效的 JSON 响应构造。 这样,DialogFlow 将能够在前端正确显示消息。

  可以使用 Python 构造响应。 可以使用以下响应类型: 简单响应基本卡片意见建议清单卡片浏览轮播轮播响应

  以下代码为 DialogFlow 生成一个简单的 JSON 响应,并带有文本:

  最初,这只是一个非常简单的示例,用于演示请求/响应(webhook /实现)机制。 用户应该看到以下意图响应:

  您可以看到我们已经使用以下命令从请求中提取了:

  在此示例中未使用操作,但可以将用于此目的。 现在,我们将研究如何从服务器获取响应以及如何根据响应来处理响应。

  使用窗口右侧的控制台,可以调用意向,并可以检查响应。 在当前示例中,响应将如下所示:

  [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QrS1wh3L-1681568818803)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/ai-py/img/B15441_16_11.png)]

  图 11:Dialogflow 响应验证

  如果要调试聊天机器人并对其进行故障排除,可以单击诊断信息。 在这里,我们可以查看所有 DialogFlow 请求的详细信息以及从 Webhook 发送回的响应。 如果 Webhook 中存在错误,则诊断信息也可以用于调试。

  本章的目的是介绍聊天机器人的基本知识。 在这一点上,我们的聊天机器人除了演示如何从服务器获取响应外,还没有做其他事情。 我们将其留给您,以探索如何进一步增强聊天机器人。 一些明显的增强功能包括:根据建立的菜单检查所请求的食物,以查看菜单上是否有可用项目; 根据当前库存检查请求的食物数量,以查看是否可以完成订单; 将订单存储在后端数据库中以进行记帐和跟踪; 并将聊天机器人连接到机器人或后端系统以实际完成订单。

  在本章中,我们首先了解了聊天机器人的潜在未来,以及聊天机器人变得越来越好将如何影响我们的社会。 然后,我们了解了当前聊天机器人技术的局限性以及当前局限性推荐的最佳实践。 我们了解了基本的聊天机器人概念以及最流行的聊天机器人平台。

  最后,我们更深入地研究了由 Google 开发的名为 DialogFlow 的聊天机器人平台。 通过执行基本练习,然后学习如何使用 Webhooks 与其他后端服务集成,我们熟悉了该平台。 我们一步一步地了解了如何测试聊天机器人的功能并确保其设置正确。

  在下一章中,我们将跳到另一个令人兴奋的主题,并学习如何训练序列数据并将其用于时间序列分析。

  在本章中,我们将学习如何构建序列学习模型。 为此,我们将涵盖许多主题,以使我们更好地掌握如何构建和使用这些模型。 我们将学习如何处理 Pandas 中的时间序列数据。 我们将了解如何分割时间序列数据并对其执行各种操作,然后我们将讨论如何滚动地从时间序列数据中提取各种统计信息。 接下来,我们将学习隐马尔可夫模型(HMM),然后实现一个用于构建这些模型的系统。 我们将了解如何使用条件随机场来分析字母序列,最后,我们将讨论如何使用到目前为止学到的技术来分析股市数据。

  在本章的最后,您将学到: 了解序列数据使用 Pandas 处理时间序列数据切片时间序列数据操作时间序列数据从时间序列数据中提取统计信息使用隐马尔可夫模型生成数据使用条件随机场识别字母序列股市分析

  让我们开始研究并理解序列数据。

  在机器学习的世界中,我们遇到了许多类型的数据,例如图像,文本,视频和传感器读数。 不同类型的数据需要不同类型的建模技术。 序列数据是指顺序很重要的数据。 序列数据可以在许多“野外”情况下找到。 这里有些例子:

  基因组序列数据:这个也许是我们拥有的序列数据的最好和最重要的例子。 基因出现的顺序是创造和维持生命的最基本水平。 基因组学序列包含使我们存活的信息。

  人类语言:沟通时顺序非常重要。 如果我们开始更改本书中单词的顺序,不久之后,本书将变得完全不可理解!

  计算机语言:在大多数计算机语言中,正确的输入顺序对于任何功能正常运行至关重要。 例如,在许多计算机语言中,符号的意思是“大于或等于”,而在其他语言中,的意思可能是赋值或产生语法错误。

  时间序列数据是序列数据的子分类。 时间序列数据的一些示例如下:

  股票市场价格:时间序列数据的圣杯是股票价格。 许多数据科学家将在其职业生涯中的某个时刻尝试使用其数据科学技能来尝试预测股市。 他们中的许多人将意识到这是一项艰巨的努力,并转向其他主题和问题。 股票预测困难的几个原因是: 在经济周期的不同时间,股票对经济状况的反应不同。影响股票价格的因素很多,这使它成为一个非常复杂的系统。股票中一些最剧烈的变动发生在市场交易时间之外,这使得实时处理这些信息变得困难。

  应用日志:根据定义,应用日志具有两个组成部分。 指示操作何时发生以及正在记录信息或错误的时间戳。

  IoT 活动:IoT 设备中的活动以时间顺序方式发生,因此可以用作时间的数据。

  时间序列数据是从任何数据源(例如传感器,麦克风,股票市场等)获得的时间戳值。 时间序列数据具有许多重要特征,需要对其进行建模才能进行有效分析。

  时间序列数据中某些参数的测量以固定的时间间隔进行。 这些测量被安排并存储在时间线上,并且它们的出现顺序至关重要。 此顺序用于从数据中提取模式。

  在本章中,我们将看到如何构建通常描述时间序列数据和序列数据的模型。 这些模型将用于了解时间序列变量的行为。 然后,我们将能够使用这些模型来预测和推断该模型以前未看到的值。

  时间序列数据分析被广泛应用于金融,传感器数据分析,语音识别,经济学,天气预报,制造以及更多领域。 在本章中,我们将广泛使用一个名为 Pandas 的库来处理与时间序列相关的操作。

  Pandas 是强大的和流行的 Python 包,用于数据处理和分析。 具体来说,它提供了用于操纵表结构的方法和操作。 这是一个可爱的名字,让人联想到毛茸茸的熊,但这里有一些没用的琐事。 Pandas 的名称来自面板数据一词,这是计量经济学术语,用于包含多个时间段内观测值的数据集。

  我们还将使用其他几个有用的包,例如和。 确保继续安装它们。

  可以通过运行以下命令来安装这些包:

  如果在安装时出错,则可以在这个页面上找到进一步的说明。 假设您已经成功安装了包,让我们继续进行下一部分,在此我们将研究如何通过和 Pandas 处理时间序列数据。

  Pandas 可以说是 Python 中最重要的库。 学习良好地使用其方法至关重要,当您将 Python 用于其他任何项目时,它将为您提供良好的服务。 除了时间序列分析外,Pandas 还可以执行更多功能,包括: 使用集成索引的数据帧操作从各种不同的文件格式读取数据并将数据写入内存数据结构的方法数据分类数据筛选缺失值估计重塑和旋转数据集基于标签的切片,索引和子集创建高效的列插入和删除数据集上的按分组操作合并和连接数据集

  在本节中,我们将使用它来将数字序列转换为时间序列数据并将其可视化。 Pandas 提供了添加时间戳,组织数据然后对其进行有效操作的选项。

  创建一个新的 Python 文件并导入以下包:

  定义一个函数以从输入文件中读取数据。 参数索引指示包含相关数据的列:

  定义函数以将字符串转换为 Pandas 日期格式:

  使用此函数可从输入文件的第一行获取开始日期:

  在执行操作时,Pandas 库需要结束日期为独占日期,因此我们需要将最后一行的字段增加一个月:

  使用开始日期和结束日期以及每月一次的频率来创建带有日期的索引列表:

  使用时间戳创建一个 Pandas 数据序列:

  定义和函数并指定输入文件:

  指定包含数据的列:

  遍历各列并读取每列中的数据:

  绘制时间序列数据:

  完整代码在文件中给出。 如果运行代码,您将看到两个屏幕截图。

  以下屏幕截图显示了第一维的数据:

  [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-av2rBG1A-1681568818804)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/ai-py/img/B15441_17_01.png)]

  图 1:使用每日数据绘制的第一维数据

  第二张屏幕截图以第二维表示数据:

  [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fESxTYX3-1681568818804)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/ai-py/img/B15441_17_02.png)]

  图 2:使用每日数据绘制的第二维数据

  在本节中,我们为如何使用 Pandas 从外部文件加载数据,如何将其转换为时间序列格式以及如何对其进行绘制和可视化奠定基础。 在下一节中,我们将学习如何进一步处理数据。

  现在我们已经加载了时间序列数据,让我们看看如何对其进行切片。 切片的过程是指将数据分为多个子间隔并提取相关信息。 当我们使用时间序列数据集时,这很有用。 我们将使用时间戳来切片数据,而不是使用索引。

  创建一个新的 Python 文件并导入以下包:

  从输入数据文件中加载第三列(零索引):

  定义开始和结束年份,然后以年级粒度绘制数据:

  定义开始和结束月,然后以月级粒度绘制数据:

  完整代码在文件中给出。 如果运行代码,您将看到两个数字。

  第一个屏幕截图显示了从 2003 到 2011 的数据:

  [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iUHlPxTM-1681568818804)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/ai-py/img/B15441_17_03.png)]

  图 3:使用每月滴答作图的数据(2003 年至 2011 年)

  第二张屏幕截图显示了 1998 年 2 月到 2006 年 7 月的数据:

  [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bIQOeqP7-1681568818804)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/ai-py/img/B15441_17_04.png)]

  图 4:使用月度滴答作图的数据(1998 年至 2006 年)

  正如我们在上一节创建的图表(“图 1”和“图 2”)中看到的那样,它们很难阅读。 数据被“捆绑”。 通过使用每月刻度对数据进行切片,可以更轻松地可视化数据的起伏。 在下一节中,我们将继续学习 Pandas 库中可用的不同功能,例如过滤和求和,以及该功能如何帮助更好地分析和处理数据集。

  Pandas 库可以有效地处理时间序列数据,并执行各种操作,例如过滤和加法。 可以设置条件,Pandas 会过滤数据集并根据条件返回正确的子集。 时间序列数据也可以加载和过滤。 让我们看另一个例子来说明这一点。

  创建一个新的 Python 文件并导入以下包:

  定义输入文件名:

  将第三和第四列加载到单独的变量中:

  通过命名两个维度来创建 Pandas 对象:

  通过指定开始和结束年份来绘制数据:

  使用条件过滤数据,然后显示它。 在这种情况下,我们将获取中所有小于的数据点和中所有大于的值:

  我们也可以在 Pandas 中添加两个序列。 让我们在给定的开始日期和结束日期之间添加和:

  完整代码在文件中给出。 如果运行代码,您将看到三个屏幕截图。 第一个屏幕快照显示了从到 1968 到 1975 的数据:

  [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1aRrYUO3-1681568818805)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/ai-py/img/B15441_17_05.png)]

  图 5:重叠数据(1968 年至 1975 年)

  第二张屏幕截图显示了他过滤的数据:

  [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-esLg8n8g-1681568818805)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/ai-py/img/B15441_17_06.png)]

  图 6:和的数据(1968 年-1975 年)

  第三个屏幕截图显示了求和结果:

  [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SVeBVigp-1681568818805)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/ai-py/img/B15441_17_07.png)]

  图 7:和的总和(1968 – 1975)

  在本节中,我们继续学习 Pandas 库中可用的不同功能,包括过滤和求和。 在数据科学中,选择和训练模型以了解正在分析的数据集很重要。 Pandas 是完成此任务的有用工具。 在下一节中,我们将介绍另外两个有用的库。 这些库用于计算有关数据集的各种统计信息。

  为了从时间序列数据中提取有意义的见解,我们可以从中生成统计数据。 这些统计信息的示例包括平均值,方差,相关性,最大值等操作。 这些统计信息可以使用窗口滚动计算。 我们可以使用预定的窗口大小,并在该窗口内计算这些统计信息。 当我们可视化一段时间内的统计信息时,我们可能会看到有趣的模式。 让我们看一个如何从时间序列数据中提取这些统计信息的示例。

  创建一个新的 Python 文件并导入以下包:

  定义输入文件名:

  将第三和第四列加载到单独的变量中:

  通过命名两个维度来创建 Pandas:

  沿每个维度提取最大值和最小值:

  提取前行的总体均值和行均值:

  使用窗口大小绘制滚动平均值:

  打印相关系数:

  使用窗口大小绘制滚动相关性:

  完整的代码在文件中给出。 如果运行代码,则会看到两个屏幕截图。 第一个屏幕截图显示了滚动平均值:

  [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0ChoPgCp-1681568818805)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/ai-py/img/B15441_17_08.png)]

  图 8:滚动平均值

  第二张屏幕截图显示了滚动相关性:

  [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dBS328sZ-1681568818806)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/ai-py/img/B15441_17_09.png)]

  图 9:滚动相关

  您也应该看到以下输出:

  [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XTuCWvny-1681568818806)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/ai-py/img/B15441_17_10.png)]

  图 10:最大和最小大小以及总体平均值

  如果向下滚动,则将看到按行平均值和打印出的相关系数:

  [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HgiTsHGg-1681568818806)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/ai-py/img/B15441_17_11.png)]

  图 11:逐行均值和相关系数

  上图中的相关系数表示每个维度与所有其他维度的相关程度。 的相关性表示完全相关,而的相关性表示变量根本不相关。 与完美相关,与完美相关。 在任何混淆矩阵中,情况总是如此。 只是说一个变量与其自身完全相关。 另外,与具有低相关性。 这意味着将具有较低的功率来预测的值。 到目前为止,我们将不会很快凭借我们的模型及其预测股票价格的能力而成为百万富翁。 在下一节中,我们将学习一种有用的技术来分析时间序列数据,称为隐马尔科夫模型(HMM)。

  隐马尔可夫模型(HMM)是一种用于分析连续数据的强大分析技术。 假设要建模的系统是具有隐藏状态的马尔可夫过程。 这意味着基础系统可以是一组可能状态中的一个。

  它经历一系列状态转换,从而产生一系列输出。 我们只能观察输出,而不能观察状态。 因此,这些状态对我们是隐藏的。 我们的目标是对数据建模,以便我们可以推断未知数据的状态转换。

  为了理解 HMM,让我们考虑旅行商问题(TSP)的版本。 在此示例中,推销员必须在以下三个城市之间旅行才能工作:伦敦,巴塞罗那和纽约。 他的目标是最大程度地减少旅行时间,以使其成为最有效率的人。 考虑到他的工作承诺和时间表,我们有一组概率决定了从城市到城市的机会。 在给出的以下信息中,表示从城市到城市的概率: 城市概率0.100.700.200.150.750.100.050.600.35

  让我们用过渡矩阵表示此信息: 伦敦巴塞罗那纽约伦敦0.100.700.20巴塞罗那0.750.150.10纽约0.600.350.05

  现在我们有了所有信息,让我们继续设置问题陈述。 推销员在星期二从伦敦开始他的旅程,并在星期五计划一些事情。 但这取决于他在哪里。 他星期五将在巴塞罗那举行的可能性是多少? 该表将帮助我们找出答案。

  如果我们没有马尔可夫链来对该问题进行建模,那么我们将不知道旅行时间表是什么样的。 我们的目标是非常确定地说他将在给定的一天在每个城市中。

  如果我们用表示过渡矩阵,而用表示当日,则:

  在我们的情况下,星期五距离星期二 3 天。 这个意味着我们需要计算。 计算将如下所示:

  因此,本质上:

  我们将设置为:

  下一步是计算矩阵的立方。 在线提供了许多工具来执行矩阵运算,例如这里。

  如果您进行了所有矩阵计算,那么您将看到在星期四将获得以下概率:

  我们可以看到他在巴塞罗那的机会要比其他任何城市都高。 这也具有地理意义,因为巴塞罗那比纽约更靠近伦敦。 让我们看看如何在 Python 中为 HMM 建模。

  创建一个新的 Python 文件并导入以下包:

  从输入文件加载数据:

  提取第三列进行训练:

  使用分量和对角协方差创建高斯 HMM:

  训练 HMM:

  打印 HMM 每个组成部分的均值和方差值:

  使用训练有素的 HMM 生成样本并绘制它们:

  完整代码在文件中给出。 如果运行代码,将看到以下屏幕截图,其中显示了 1200 个生成的示例:

  [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zXi8JuAa-1681568818806)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/ai-py/img/B15441_17_12.png)]

  图 12:生成的数据

  您还将看到以下输出:

  [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r9fDqcX5-1681568818806)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/ai-py/img/B15441_17_13.png)]

  图 13:HMM 训练

  在给定不同行程的情况下,我们解释图表的方式是遍历销售路线所需的时间不同。 第二个输出指示这些路径的均值和方差。

  既然我们已经了解了 HMM,现在让我们了解与时间序列分析相关的另一个主题。 在下一部分中,我们将学习通常称为条件随机场的概率模型及其与 HMM 的区别。

  条件随机场(CRF)是概率模型,经常用于分析结构化数据。 我们使用它们以各种形式标记和分割序列数据。 以下是一些应用 CRF 的最常见用例: 手写识别字符识别物体检测命名实体识别基因预测图像分割语音标记的一部分降噪

  关于 CRF 的注意事项之一是它们是判别模型。 将其与生成模型 HMM 对比。

  我们可以在标记的测量序列上定义条件概率分布。 我们将使用它来构建 CRF 模型。 在 HMM 中,我们定义了观察序列和标签上的联合分布。

  CRF 的主要优势之一是它们本质上是有条件的。 HMM 并非如此。 CRF 不假定输出观测值之间有任何独立性。 HMM 假定任何给定时间的输出在统计上均独立于先前的数据点。 HMM 必须做出此假设,以确保推理过程以可靠的方式工作。 但是这个假设并不总是正确的。 现实世界的数据充满了时间依赖性。

  在自然语言处理,语音识别,生物技术等各种应用中,CRF 往往优于 HMM。 在本节中,我们将讨论如何使用 CRF 分析和识别单词。

  这是一个很好的用例,将突出显示识别数据中依存关系的能力。 英语单词中字母的顺序决不是随机的。 例如,考虑单词。 在第一个字母之后的下一个字母将成为元音的可能性高于其在辅音中的可能性。 单词中的第二个字母变为字母的可能性不为零。 我们可以想到几个符合此条件的单词-豁免,准确,展示等。 但是,考虑到第一个字母是,单词中第二个字母是的概率是多少? 我们想不出一个符合该标准的单词。 即使它们存在,也没有那么多,因此可能性较低。 CRF 利用这一事实。

  创建一个新的 Python 文件并导入以下包:

  定义一个函数以解析输入参数。 我们可以将值作为输入参数。 参数控制我们要对错误分类进行惩罚的程度。 较高的值表示我们会在训练过程中对错误分类施加更高的罚款,但最终可能会使模型过拟合。 另一方面,如果我们为选择较低的值,则可以使模型更好地推广。 但这也意味着我们将对训练数据点的错误分类处以较低的罚款。

  定义一个类来处理构建 CRF 模型的所有功能。 我们将使用带有的链式 CRF 模型:

  定义一个函数来加载训练数据:

  定义一个函数来训练 CRF 模型:

  定义一个函数来评估 CRF 模型的准确率:

  定义一个函数以在未知数据点上运行经过训练的 CRF 模型:

  定义一个函数以根据索引列表从字母中提取子字符串:

  提取字母:

  定义主函数并解析输入参数:

  创建 CRF 模型对象:

  加载输入数据并将其分为训练集和测试集:

  训练 CRF 模型:

  评估 CRF 模型的准确率并打印:

  在一些测试数据点上运行它并打印输出:

  完整的代码在文件中指定为。 如果运行代码,则应看到以下输出:

  [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0yBNGUwt-1681568818807)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/ai-py/img/B15441_17_14.png)]

  图 14:CRF 模型训练

  如果滚动到末尾,还应该看到以下输出: :

  [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0gAq0SJn-1681568818807)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/ai-py/img/B15441_17_15.png)]

  图 15:原始输出与预测输出

  如我们所见,可以正确预测中的大多数单词。 希望我们能够说明 CRF 的功能以及它们与 HMM 的区别。 在下一节中,我们将重新介绍 HMM,并在示例中应用它们来分析股票市场数据。

  我们将在本节中使用 HMM 分析股票市场数据。 这是一个已经组织好数据并加上时间戳的示例。 我们将使用包中的可用数据集。 数据集包含这些年来不同公司的股票价值。 HMM 是生成模型,可以分析此类时间序列数据并提取底层结构。 我们将使用此模型来分析股票价格变化并生成输出。

  请不要指望此模型产生的结果将接近生产质量,并且您将能够使用此模型执行实时交易并从中获利。 它将为开始思考如何实现这一目标提供基础。 如果您愿意,我们建议您继续增强模型,并针对不同的数据集强调该模型,并可能将其与当前市场数据一起使用。 我们不对模型的盈利或不盈利做任何表述。

  创建一个新的 Python 文件并导入以下包:

  加载 1970 年 9 月 4 日至 2016 年 5 月 17 日的历史股票市场报价。您可以自由选择任何日期范围:

  每天计算收盘报价的百分比差异:

  堆叠两个数据列以创建训练数据集:

  使用分量和对角协方差创建并训练高斯 HMM:

  使用训练有素的 HMM 模型来生成样本。 您可以选择生成任意数量的样本。

  绘制生成的差异百分比值:

  绘制交易股票数量的生成值:

  完整代码在文件中给出。 如果运行代码,您将看到以下两个屏幕截图。 第一个屏幕截图显示了 HMM 生成的差异百分比:

  [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hCg7vGfQ-1681568818807)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/ai-py/img/B15441_17_16.png)]

  图 16:差异百分比

  第二张屏幕截图显示了 HMM 为交易的股票数量生成的值:

  [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7NxNzjS2-1681568818807)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/ai-py/img/B15441_17_17.png)]

  图 17:股票数量

  我们将其留给阅读器,以针对数据集中的实际数据点计算 HMM 模型预测的值的准确率。 然后将需要一些工作来使用它来产生交易信号。 正如我们在本节开头提到的,我们不建议您使用此代码来使用真实货币进行实际交易。

  在本章中,我们学习了如何构建序列学习模型。 我们了解了如何处理 Pandas 中的时间序列数据。 我们讨论了如何分割时间序列数据并对其执行各种操作。 我们学习了如何以滚动方式从时间序列数据中提取各种统计信息。 我们了解了隐马尔可夫模型,然后实现了构建该模型的系统。

  我们讨论了如何使用条件随机场来分析字母序列。 我们学习了如何使用各种技术来分析股票市场数据。 在下一章中,我们将继续学习如何在图像识别领域内实现 AI。

  在本章中,我们将学习有关对象检测和跟踪的知识。 首先,我们将花费一些时间来理解为什么图像识别对于机器学习非常重要。 然后,我们将学习称为 OpenCV 的图像识别包,该包是计算机视觉的流行库。 我们还将学习如何安装 OpenCV 并讨论帧差异,以了解如何检测视频中的运动部分。 我们将学习如何使用色彩空间跟踪对象,以及如何使用背景减法来跟踪对象。 之后,我们将使用 CAMShift 算法构建交互式对象跟踪器,并学习如何构建基于光流的跟踪器。 我们将讨论人脸检测和相关概念,例如 Haar 级联和积分图像。 然后,我们将使用此技术来构建眼睛检测器和跟踪器。

  在本章结束时,您将了解: 安装 OpenCV帧差分使用色彩空间跟踪对象使用背景减法跟踪对象使用 CAMShift 算法构建交互式对象跟踪器基于光流的跟踪人脸检测和追踪将 Haar 级联用于对象检测将积分映射用于特征提取眼睛检测和跟踪

  我们将从介绍 OpenCV 开始,然后逐步介绍如何安装它。

  作为,希望从本书的主题中变得清晰起来,一般的人工智能,尤其是机器学习,是推动当今社会发生数字化转型的一些技术。 能够“看到”是人类学习过程的关键组成部分。 类似地,即使他们使用不同的方法“查看”,捕获图像并识别这些图像中包含的内容对于计算机来说也是最重要的,以便创建数据集以馈入机器学习管道并从该数据中获取洞察力。

  无人驾驶技术就是一个明显的例子。 在这种情况下,计算机就像人类的同类计算机一样,需要能够在任何给定的每秒内提取千兆字节的数据,分析这些数据,并实时做出改变人生的决定。 当这项技术被广泛使用的那天,我感到非常兴奋。 我的估计是,这将尽早发生。 根据世界卫生组织的数据,2013 年道路交通事故死亡人数为 125 万人。部署自动驾驶汽车时,可以避免其中的很大比例。

  无人驾驶技术只是图像识别的一种应用,其应用几乎是无限的,仅受我们的想象力限制。 其他一些流行的用途是:

  自动图像分类:我们可以在 Google 相册中以及在将图像上传到 Facebook 以及查看 Facebook 如何向我们提供有关图像中人物的建议时看到的第一手示例。

  反向图像搜索:Google 除其他功能外,还提供功能,您可以将图像用作输入,而不是使用关键字作为输入并获取图像,而 Google 可以猜测图片内容。 您可以在这里尝试。

  光学字符识别:将图像转换为文本非常依赖于图像识别。

  MRI 和超声解释:在识别癌症和其他疾病方面,某些工具的表现优于人类。

  考虑了图像识别的一些实际应用后,让我们进入将要使用的包以亲自了解它。

  在本章中,我们将使用名为 OpenCV 的包。 其名称暗示了 OpenCV(开源计算机视觉)是一个开源跨平台 Python 包,可用于启用实时计算机视觉。 该工具起源于英特尔实验室。

  OpenCV 可以与 TensorFlow,PyTorch 和 Caffe 结合使用。

  安装

  在本章中,我们将使用名为 OpenCV 的包。 您可以在此处了解更多信息。 在继续操作之前,请确保已安装。 以下是在各种操作系统上使用 Python3 安装 OpenCV 3 的链接: WindowsUbuntuMac

  现在您已经安装了它,让我们转到下一部分,我们将讨论帧差异分段。

  帧差分是可用于识别视频中运动部分的最简单技术之一。 直观地,在大多数应用中,这是有趣的部分所在。 如果我们有一个跑步者的视频,我们可能想分析跑步者的跑步情况,而不是背景图像。 当我们看电影时,我们主要关注最前沿的人物在说话和做事时。 我们不会倾向于关注背景中无聊的相框。

  有时候,您会发现一个一次性的极客,会在隐藏在这种背景下的电影中发现问题,正如我们在《权力的游戏》的最新剧情中几次看到,有人在背景中发现一杯星巴克,但这是例外而不是规则。

  当我们观看实时视频流时,从该流捕获的连续帧之间的差异为我们提供了很多信息。 让我们看看如何获??取连续帧之间的差异并显示差异。 本节中的代码需要连接的摄像头,因此请确保您的计算机上装有摄像头。

  创建一个新的 Python 文件并导入以下包:

  定义一个函数来计算帧差。 首先计算当前帧和下一帧之间的差异:

  计算当前帧和上一帧之间的差异:

  计算两个差异帧之间的按位与并返回:

  定义一个函数以从网络摄像头抓取当前帧。 首先从视频捕获对象中读取它:

  根据缩放比例调整框架大小并返回:

  将图像转换为灰度并返回:

  定义函数并初始化视频捕获对象:

  定义比例因子以调整图像大小:

  抓取当前的帧,下一帧以及之后的帧:

  无限期迭代,直到用户按下键。 首先计算帧差异:

  更新变量:

  从网络摄像头抓取下一帧:

  检查用户是否按下了键。 如果是这样,请退出循环:

  退出循环后,请确保所有窗口均已正确关闭:

  完整代码在提供给您的文件中给出。 如果运行代码,您将看到一个显示实时输出的输出窗口。 如果四处走动,您会在这里看到自己的轮廓在这里展示:

  [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bEd2rIlr-1681568818808)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/ai-py/img/B15441_18_01.png)]

  图 1:轮廓图像

  前面的屏幕截图中的白线表示轮廓。 我们取得了什么成就? 为什么这很重要? 根据应用的不同,我们可能不需要原始图像提供的所有信息。 原始图像具有更多细节,更多对比度和更多颜色。 让我们以自动驾驶汽车为例。 我们可能不在乎我们前面的车是红色还是绿色。 我们更担心要知道汽车是否正在驶向我们并即将撞向我们。 通过过滤所有额外的不相关信息,它允许系统中的其他算法更有效地处理图像中的相关信息,因此可以更快地对任何潜在的危险做出反应。

  这种过滤可能有用的另一个实例是,加载视频的空间有限或成本高昂,我们需要压缩图像并提高空间利用率。 我们将由读者提出其他可能有用的方案,但希望我们能给您足够的灵感,激发您的想象力和创造力。

  通过帧差分获得的信息很有用,但是我们将无法使用它构建健壮的跟踪器。 它对噪声敏感,并且不能真正完全跟踪物体。 要构建健壮的对象跟踪器,我们需要知道可以使用对象的哪些特征来精确跟踪它。 这是色彩空间变得重要的地方,我们将在扩展部分中讨论。

  可以使用各种色彩空间来表示图像。 RGB 颜色空间可能是最流行的颜色空间,但不适用于对象跟踪之类的应用。 因此,我们将改用 HSV 颜色空间。 这是一种直观的色彩空间模型,更接近于人类对色彩的感知方式。 您可以在此处了解更多信息。

  我们可以将捕获的帧从 RGB 转换为 HSV 颜色空间,然后使用颜色阈值跟踪任何给定的对象。 我们应该注意,我们需要知道对象的颜色分布,以便为阈值选择合适的范围。

  创建一个新的 Python 文件并导入以下包:

  定义一个函数以从网络摄像头抓取当前帧。 首先从视频捕获对象中读取它:

  根据缩放比例调整框架大小并返回:

  定义函数。 首先初始化视频捕获对象:

  定义用于调整捕获帧大小的比例因子:

  无限期地进行迭代,直到用户按下键。 抓取当前帧开始:

  使用 OpenCV 中可用的内置函数将图像转换为 HSV 颜色空间:

  为人类皮肤的颜色定义近似 HSV 颜色范围:

  阈值 HSV 图像以创建掩码:

  计算遮罩和原始图像之间的按位与:

  运行中值模糊以使图像平滑:

  显示输入和输出帧:

  检查用户是否按下了键。 如果是这样,则退出循环:

  退出循环后,请确保所有窗口均已正确关闭:

  提供给您的文件中提供了完整的代码。 如果运行代码,您将获得两个屏幕截图。 标题为输入的窗口是捕获的帧:

  [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hm0VzIN1-1681568818808)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/ai-py/img/B15441_18_02.png)]

  图 2:捕获的帧

  标题为输出的第二个窗口显示皮肤遮罩:

  [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3DnrGKLo-1681568818808)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/ai-py/img/B15441_18_03.png)]

  图 3:输出框架

  如您在中看到的输出帧,我们现在只在图像中看到一种颜色,它对应于任何皮肤。 其他一切都是黑色的。 与上一节中看到的类似,我们对图像进行了过滤,以仅包含我们感兴趣的信息。在这种情况下,过滤是不同的,但结果是事实是我们现在仅具有进一步处理图像所需的信息。 我想到了一些应用: 检测异常皮肤状况或变色。仅在看到人的肤色时才会打开的安全系统。 这可用于人类可能藏在容器中的港口。

  您还能想到其他一些应用吗? 在下一节中,我们将学习另一种称为背景减法的图像转换技术。

  背景减法是一种技术,它对给定视频中的背景进行建模,然后使用该模型来检测运动对象。 该技术在视频压缩和视频监视中大量使用。 在必须检测静态场景中的移动物体的情况下,它的表现很好。 该算法的基本原理是检测背景,为其建立模型,然后从当前帧中减去背景以获得前景。 该前景对应于移动的对象。

  这里的主要步骤之一是建立背景的模型。 它与帧差分不同,因为我们不差分连续帧。 我们正在对背景进行建模并实时更新,这使其成为一种自适应算法,可以适应不断变化的基线。 因此,它的表现要比帧差分好得多。

  创建一个新的 Python 文件并导入以下包:

  定义一个函数以获取当前帧:

  调整框架大小并返回:

  定义函数并初始化视频捕获对象:

  定义背景减法器对象:

  定义历史记录和学习率。 关于的全部内容,以下注释不言自明:

  无限期迭代,直到用户按下键。 首先抓取当前帧:

  使用先前定义的背景减法器对象计算:

  将从灰度转换为 RGB:

  显示输入和输出图像:

  检查用户是否按下了键。 如果是这样,请退出循环:

  退出循环后,请确保释放视频捕获对象并正确关闭所有窗口:

  完整代码在提供给您的文件中给出。 如果运行代码,您将看到一个显示实时输出的窗口。 如果四处走动,您将部分看到自己,如下所示:

  [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BxjcI5zi-1681568818808)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/ai-py/img/B15441_18_04.png)]

  图 4:背景减影

  一旦停止移动,它就会开始褪色,因为您现在是背景的一部分。 该算法会将您视为背景的一部分,并开始相应地更新模型:

  [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-neH7E4tG-1681568818809)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/ai-py/img/B15441_18_05.png)]

  图 5:背景减影

  当您保持静止时,它将继续消失,如下所示:

  [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yJM8lDxp-1681568818809)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/ai-py/img/B15441_18_06.png)]

  图 6:背景减影

  淡入淡出的过程表示当前场景是,而背景模型是。

  您已经可以想象到,仅在移动时才生成图像将节省大量存储空间。 一个简单的例子是使用安全摄像机。 看着一个小时或几个小时的镜头对准空旷的停车场,可能比看着油漆枯燥更无聊,但是如果安全系统足够智能,可以在车架发生运动时进行记录,我们将能够辨别出“有趣的东西”。 视频中的“”部分。

  基于颜色空间的跟踪允许我们跟踪有色对象,但是我们必须首先定义颜色。 这似乎是限制性的! 让我们看看如何在实时视频中选择一个对象,然后使用一个可以跟踪它的跟踪器。 这是,在其中 CAMShift 算法(代表连续自适应均值漂移)变得很重要。 这基本上是 MeanShift 算法的自适应版本。 我们将在下一节讨论 CAMShift。

  为了理解 CAMShift,首先让我们了解均值漂移的工作原理。 考虑给定帧中的感兴趣区域。 我们选择该区域是因为它包含感兴趣的对象。 我们要跟踪该对象,因此在其周围绘制了一个粗糙的边界,这就是感兴趣的区域所指的区域。 我们希望我们的对象跟踪器在视频中四处移动时跟踪该对象。

  为此,我们基于该区域的颜色直方图选择一组点,然后计算质心。 如果此质心的位置在该区域的几何中心,则我们知道该对象没有移动。 但是,如果质心的位置不在此区域的几何中心,则我们知道对象已移动。 这意味着我们还需要移动封闭边界。 质心的运动直接指示物体的运动方向。 我们需要移动边界框,以使新质心成为此边界框的几何中心。 我们对每一帧都保持这种状态,并实时跟踪对象。 因此,此算法称为均值平移,因为均值(即质心)一直在移动,我们使用此跟踪对象。

  让我们看看这与 CAMShift 有何关系。 均值平移的问题之一是不允许对象的大小随时间变化。 绘制边界框后,无论物体离相机有多近,它都将保持不变。 因此,我们需要使用 CAMShift,因为它可以使边界框的大小适应于对象的大小。 如果您想进一步探索,可以查看以下链接。

  让我们看看如何构建跟踪器。

  创建一个新的 Python 文件并导入以下包:

  定义一个类来处理与对象跟踪有关的所有功能:

  捕获当前帧:

  设置比例因子:

  调整框架大小:

  创建一个窗口以显示输出:

  设置鼠标回调函数以从鼠标获取输入:

  初始化变量以跟踪矩形选择:

  定义一个函数来跟踪鼠标事件:

  当鼠标左键按下时,表明用户已经开始绘制矩形:

  如果用户当前正在拖动鼠标以设置矩形选区的大小,请跟踪宽度和高度:

  设置矩形的和坐标的:

  获取坐标的最大值和最小值,以使其与拖动鼠标以绘制矩形的方向无关:

  重置选择变量:

  完成矩形选择:

  如果选择完成,则设置标志,指??示我们应该开始跟踪矩形区域内的对象:

  定义跟踪对象的方法:

  调整框架大小:

  创建框架的副本。 我们稍后将需要它:

  将帧的颜色空间从 RGB 转换为 HSV:

  根据预定义的阈值创建掩码:

  检查用户是否选择了区域:

  从 HSV 图像以及遮罩中提取感兴趣的区域。 根据以下这些计算感兴趣区域的直方图:

  标准化直方图:

  从原始帧中提取感兴趣的区域:

  计算感兴趣区域的按位非。 这仅用于显示目的:

  检查系统是否处于跟踪模式:

  计算直方图的反向投影:

  计算直方图和掩码之间的按位与:

  定义跟踪器的终止条件:

  将 CAMShift 算法应用于反投影直方图:

  在对象周围绘制一个椭圆并显示它:

  如果用户按下,则退出循环:

  退出循环后,请确保正确关闭所有窗口:

  定义函数并开始跟踪:

  完整代码在提供给您的文件中给出。 如果运行代码,您将看到一个窗口,显示来自网络摄像头的实时视频。

  拿一个对象,将其握在手中,然后在其周围绘制一个矩形。 绘制矩形后,请确保将鼠标指针从最终位置移开。 该图像将如下所示:

  [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yd1Yne08-1681568818809)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/ai-py/img/B15441_18_07.png)]

  图 7:物体检测图像

  完成选择后,将鼠标指针移动到另一个位置以锁定矩形。 该事件将开始跟踪过程,如下图所示:

  [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-365Ldw7J-1681568818809)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/ai-py/img/B15441_18_08.png)]

  图 8:物体检测图像 2

  让我们将对象移动到并查看是否仍在跟踪中

  [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ylcmADbV-1681568818809)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/ai-py/img/B15441_18_09.png)]

  图 9:物体检测图 3

  看起来运作良好。 您可以移动物体,以查看如何实时对其进行跟踪。

  希望到现在为止,您已经看到了图像识别的许多应用的可能性,并且可能已经提出了关于如何应用到目前为止所学知识的自己的想法。 他们使用的技术可能比我们在本章中使用的技术要复杂一些,但是概念并没有什么不同。 NFL 实际上使用这些技术在电视上设置 10 码标记,而美国职业棒球大联盟使用与我们在本节中学到的技术类似的技术来绘制打击区。 与我们在这里看到的最接近的示例是温网锦标赛用来确定网球着陆的位置并确定其进出的例子。 在下一节中,我们将学习基于光流的跟踪。 这是用于图像识别的有用技术。

  2020 年 1 月,宣布由马丁·斯科塞斯(Martin Scorsese)执导的电影《爱尔兰人》被提名奥斯卡奖。 这部电影详细介绍了卡车司机,徒和队友弗兰克·希兰(Frank Sheeran)的生活(由罗伯特·德尼罗(Robert DeNiro)饰演)。 在电影中,我们看到希兰生活中的不同时期。 从他 20 多岁到 80 多岁。 整个过程中,我们在屏幕上看到 DeNiro 的时候很明显是他,你真的可以看出他是 20 岁还是 80 岁。

  在以前的电影中,这可能是通过化妆实现的。 对于这部电影,没有为此目的使用化妆。 相反,他们使用特殊效果,并使用数字化妆修饰了 DeNiro 的脸。 太好了吧?

  多年来,用计算机制作逼真的面孔非常困难,但好莱坞及其特效艺术家终于破解了密码。 显然,他们正在使用比本章将介绍的技术更复杂的技术,但是光流技术是开始实现此功能的基础技术。 您必须能够在视频移动的任何时刻跟踪该人的脸,然后才能在视频中更改该人的脸。 这是光流可以解决的问题之一。

  光流是计算机视觉中使用的一种流行技术。 它使用图像特征点来跟踪对象。 在实时视频的连续帧中跟踪各个特征点。 当我们在给定帧中检测到一组特征点时,我们将计算位移向量以对其进行跟踪。 我们显示了连续帧之间这些特征点的运动。 这些向量被称为运

上一篇:有好看的恐怖片推荐吗?除了贞子和《咒怨》?
下一篇:用动物培育无排斥甚至无伦理问题的人体器官

最近更新娱乐资讯