它可以理解您的语音命令,搜索新闻和知识来源,并为您总结和朗读内容。
查看演示视频。
《Chatbots》杂志将我的 Delbot 文章列入《Chatbots 杂志》前 100 篇文章中。
python app.py
以启动 Web 服务。机器人仍然是一个热门话题。每个人都在谈论他们。
从头开始构建一个怎么样?我们今天要构建的简单模型将理解并回答以下问题:
我们的目标是从头开始编写机器人代码,并在此过程中使用自然语言处理 (NLP)。
此外,如果您也完成网络应用程序部分,我们的机器人将支持语音且基于网络。最好的部分是我们不需要为语音识别和合成做任何花哨的事情:我们将使用现代网络浏览器的内置功能。
在较高的层次上,我们希望能够理解两种广泛类型的查询。以下是流程图。
我们可能会询问消息。例如:
《守护者》中《神奇动物在哪里》的最新动态是什么?
机器人将查询所请求新闻源(如果未指定,则为《纽约时报》)的 API 并汇总结果:
[...] 将第一部《哈利·波特》电影(2001 年的《哈利·波特与魔法石》)与最后一部(2011 年的《哈利·波特与死亡圣器第二部》)进行比较,有点类似于将《小鹿斑比》与《落水狗》进行比较。我们第一次见到他是在 20 世纪 20 年代的纽约——这比哈利出生还要早 60 年——他在那里 [...]
(来源:https://www.theguardian.com/books/2016/nov/25/jk-rowling-fantastic-beasts-screenplay)
我们可能会问一个知识问题。例如:
什么是 RDF 三元组?
机器人会回答:
语义三元组(或简称三元组)是资源描述框架 中的原子数据实体。n这种格式使知识能够以机器可读的方式表示。特别是,RDF 三元组的每个部分都可以通过唯一的 URI 单独寻址。例如,上面的第二条语句可能在 RDF 中表示为 http://example.name#BobSmith12 http://xmlns.com/foaf/0.1/知道http://example.name#JohnDoe34。
(来源:https://en.wikipedia.org/wiki/Semantic_triple)
我们定义一个简单的规则来对输入进行分类:如果查询包含单词news或latest ,则它是新闻查询。否则就是知识查询。
QueryAnalyzer
类的predict
函数是我们机器人的主要入口点。它执行上述分类。它调用其他函数
最后,它返回输出和一个指示是否有错误的标志。
我们假设输入是以下形式之一。
《纽约时报》关于星球大战的最新消息是什么?
给我读一下有关英国脱欧的最新消息。
请告诉我《卫报》关于2017 年漫威电影宇宙电影的新闻。
代币 | 给 | 我 | 这 | 最新的 | 消息 | 在 | 唐纳德 | 王牌 | 从 | 这 | 新的 | 约克 | 时代 | 。 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
销售点 | 动词 | 普罗恩 | 乙二胺四乙酸 | 调整 | 名词 | 腺苷二磷酸 | 丙二醇 | 丙二醇 | 腺苷二磷酸 | 乙二胺四乙酸 | 丙二醇 | 丙二醇 | 丙二醇 | 旁路CT |
标签 | VB | 富血小板血浆 | DT | 锦江山 | 神经网络 | 在 | 国家NP | 国家NP | 在 | DT | 国家NP | 国家NP | 国家NP | 。 |
上述结构的句子有一个模式。介词是关键。
搜索的主题位于第一个介词和最后一个介词之间。请求的来源位于最后一个介词之后。最后一个名词块是来源。
如果未指定来源,如第二个示例所示,则假定第一个介词之后的所有内容都是搜索主题。
介词,简单来说就是介词和后置词。
在像英语这样的中心词首语言中,介词通常位于名词短语之前。例如来自漫威电影宇宙的角色。在像古吉拉特语这样的中心词语言中,介词位于名词短语后面。这些是后置词。例如માર્વેલચલચિત્રજગત_ના_પાત્રો,逐字翻译为:漫威电影宇宙人物。
我们从QueryExtractor
类调用get_news_tokens
,该类从输入中提取源和查询。在内部,它调用_split_text
从输入中提取名词块、词性和完全解析的文本。我们对查询中的术语进行词形还原。
接下来,我们根据source对 media_aggregator.py 中的Aggregator
类之一进行查询来调用get_news
函数。这将返回新闻 API 作为响应发送的新闻文章列表。我们目前支持卫报 API 和纽约时报 API。
最后,我们从响应列表中选择第一项(默认情况下)并使用shorten_news
函数对其进行总结。
我们假设输入是以下形式之一。
约翰迪尔
圣女贞德
唐纳德·特朗普是谁?
JRR托尔金是谁?
什么是主语谓语宾语?
告诉我有关粒子物理学的知识。
代币 | 什么 | 是 | 一个 | RDF | 三倍 | ? |
---|---|---|---|---|---|---|
销售点 | 名词 | 动词 | 乙二胺四乙酸 | 丙二醇 | 名词 | 旁路CT |
标签 | 湿性粉剂 | VBZ | DT | 国家NP | 神经网络 | 。 |
代币 | 告诉 | 我 | 关于 | 他 | - | 男人 | 和 | 这 | 大师 | 的 | 这 | 宇宙 | 。 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
销售点 | 动词 | 普罗恩 | 腺苷二磷酸 | 普罗恩 | 旁路CT | 名词 | 康杰 | 乙二胺四乙酸 | 名词 | 腺苷二磷酸 | 乙二胺四乙酸 | 名词 | 旁路CT |
标签 | VB | 富血小板血浆 | 在 | 富血小板血浆 | HYPH | 神经网络 | CC | DT | 神经网络系统 | 在 | DT | 神经网络 | 。 |
如果我们找到一个助动词,我们会将其第一次出现后的所有内容视为查询。因此,在示例 1中,查询是RDF Triple 。
否则,我们将第一个之后的所有名词块视为查询。因此,在示例 2中,查询是he-man the masters the Universe 。
我们从QueryExtractor
类调用get_knowledge_tokens
来提取查询。
我们将其传递给get_gkg
函数,该函数通过维基百科Python 包查询维基百科 API,并返回顶部结果的 5 句话摘要。
我使用 NLTK 文本摘要中的FrequencySummarizer
类。或者,您可以使用 sumy。
除了包re 、 bs4 、 requests 、 operator 、 collections 、 heapq 、 string和nltk之外,我们还将使用以下包。
spaCy :请按照安装 spaCy 文档中的规定进行设置。 spaCy 会帮助我们做一些快速的 NLP。我们可以使用 NLTK,但 spaCy 会让你走得更快。我们在这个项目中使用 spaCy。
维基百科:这有助于查询维基百科 API。您可以在此处阅读维基百科Python 包的文档。
Summarizer :我用的这个是从 JustGlowing 写的 The Glowing Python 博客借来的。它总结了冗长的内容。或者,您可以使用 sumy。
Flask-RESTful、Flask(可选) :这些用于构建 Web 应用程序并通过 RESTful Web 服务操作我们的机器人。
我们添加了一个很酷的网页,您可以从中发出语音查询并让浏览器读出响应内容。为此,我们使用 Web Speech API。
我们用不到 20 行代码就启动并运行了基于 Flask 的 REST Web 服务。 QueryService
类处理请求。
截至目前,我们只需要一次服务调用即可将网络应用程序的输入发送到机器人。这是通过QueryService
类的post
函数完成的。 post
反过来调用predict
函数,这是上面提到的主要入口点。
我构建了一个基本网页来演示该机器人。它使用 Web Speech API 接收语音输入并读出内容。您可以在 templates 文件夹中找到 index.html 文件。确保您已安装所有必需的软件包和库,并且在打开网站之前 Web 服务已启动并正在运行。
我们的简单机器人可以理解有限范围的请求。它无法理解如下其他类型的请求。
具有不同结构的知识请求
向我解释一下什么是引导聚合。
告诉我一些关于计算神经科学的事情。
具有不同结构的新闻请求
《纽约时报》对罗杰·费德勒的最新比赛有何评价?
网球世界正在发生什么?
其他类型的知识请求
奶酪是如何制作的?
JK罗琳出生在哪里?
我们能在金星上建造一座天空之城吗?
法国大革命是什么时候发生的?
木星为什么有大红斑?
后续问题和背景
向我解释一下什么是引导聚合。
然后:它与随机森林有何关系?
理解它在后续问题中所指的内容属于所谓的照应解析。这是理解上下文的一部分。不同的词在不同的上下文中意味着不同的东西。虽然人类对这些有细致入微的理解,但向机器传授同样的知识却要困难得多。
我们实现了根据我们定义的一些规则构建机器人的目标。我们还使用了一些 NLP 技术。最后,我们将机器人部署到 Web 应用程序上。然而,我们的机器人能够理解和回答的查询类型有限。为什么它的理解范围如此狭窄?
总的来说,让计算机真正理解语言是一个人工智能难题。 NLP 中有一个称为 NLU(自然语言理解)的领域专门致力于此。
我们可以实施基于机器学习的解决方案,这样我们的机器人就有可能理解更广泛的请求。
请务必阅读此处使用的 API 的使用条款。