通过 Python 使用 当当开放平台 API 实现书籍推荐系统
情感人工智能
导言
计算机软件能否设计得更加感性?想象一下与电脑 对话 的情景,也许是在查看天气。天气似乎很冷,一天中的早些时候还下着雨。这自然会给大多数人带来某种消极的感觉,甚至是恐惧。 当今的典型计算机程序只会简单地报告天气并提示下一个查询,而不会考虑用户的反应。这几乎不会引起用户的共鸣,甚至会导致用户对软件产生负面联想。 这对对话式用户界面的影响尤为明显,因为对话式用户界面依赖于成功和反复的人机交互才能产生效果。
如果一个使用人工智能的计算机程序能做出更积极的回应呢?也许,该软件会提到,虽然目前外面在下雨,但今天下午晚些时候天气就会转暖,晴空万里。 这样做时,用户无需特别询问当天晚些时候的天气情况。想象一下这对使用软件的个人会产生什么影响。这会激励用户与计算机进行更多互动吗? 一台能与用户建立更亲密联系的计算机最终很可能会刺激软件使用量的增加,最终带来更高的需求和生产率,更不用说为开发软件的公司带来更多利润了!
在本文中,我们将建立一个概念验证程序,能够在软件中模拟情感,也称为 情感计算 。我们将探索利用人工智能对人类反应进行情感分析的方法,测量和反应对话中的情感(如爱与恨),并在人类和计算机之间建立更长久的关系。这似乎有些牵强? 让我们试一试!
当今的软件
对话式用户界面作为人类与计算机之间的一种自然语言交流方式由来已久。它的使用时间几乎与计算机终端的存在时间一样长。 允许用户通过文字聊天或语音与计算机软件交流,通常被认为是人类与机器之间的终极连接。
早期的终端程序可以通过一个简单的命令提示符控制台与用户交互。如今,在许多基于文本的界面中,包括 Windows、Mac 或 Linux 命令提示符,以及数据库和其他各种软件中,仍然可以找到这种终端程序。 这通常需要用户输入简短而具体的命令来执行代码,并接收软件的文本回复。通信内容通常隐晦难懂。此外,还经常需要按顺序输入多个命令才能完成特定任务。
从控制台到对话式用户界面
不难看出,对话式用户界面可以改进传统的命令行文本界面。 通常情况下,完成一项任务可能需要五道命令和五次响应,而现在只需向软件传达一句话即可完成。软件的响应可以更加人性化,甚至可以根据需要完成其他任务。
从命令行文本界面到基于语音的软件,让我们更容易看到对话式用户界面背后的力量。 由于可以通过互联网随时访问成千上万的应用程序接口(API),软件可以轻松利用网络服务,实现比以往更强大的功能。 当它与基于语音的对话式用户界面和先进的语音识别精确度相结合时,计算机与用户之间的交互就会达到一个全新的水平。 指点和点击将发展成为完整的对话,用户会越来越感觉到计算机实际上是在 “与 “用户一起工作,而不是 “为 “用户工作。
自然而然,这就更容易将情感融入对话中,努力使软件交互更加人性化。
那么,我们究竟该如何构建情感软件呢?让我们来看看需要哪些条件。
情感软件设计
在软件中创建人工智能情感可归结为两个核心概念。首先,它需要识别用户的情感。其次,需要对用户的情感做出回应。
下表是表达这些任务的基本表格,以及可能的解决方案。
# | 情感软件的核心概念 | 解决方案 |
1 | 认识情感 | 情感分析 |
2 | 以情感回应 | 状态机转换 |
认识情感
第一个要求,即识别,可以基于对用户措辞中的情感分析判断。如果短语中包含负面关联关键词,就很有可能是用户在表达负面情绪或挫败感。 同样,积极的关键词可以表示用户的积极态度。通过这种判断,软件可以触发相关状态,进行积极或消极的情感互动。
情绪反应
这就引出了第二个要求,即情感响应。一旦确定了用户短语的情感,软件就需要做出回应,包括在适用的情况下使用情感短语,或在其他情况下使用标准短语。
由于对某一特定查询可以有多种可接受的计算机回复,因此在给定的情感状态下,查询至少需要两个(中性、正面,甚至更多)回复。
软件情感要求
下面是一个将情感纳入对话式用户界面的简单示意图。请注意,软件的对话是如何由一系列对询问的可能回应组成的。 根据情绪,软件可能会改变其响应,首先主动获取更多数据,然后在数据被认为是有利的情况下对用户做出响应。这种效果是通过在中性、积极和消极情绪之间转换状态机而产生的。
情感人工智能计划:情感分析与状态转换
[User Query] -> [Sentiment Analysis] -> [Software Response Array] -> [Neutral Response] [Positive Response] -> [Automatic Query for Additional Data] [Locate Positive Data] [Activate or Skip Response] [Negative Response] -> [Automatic Query for Additional Data] [Locate Tempering Data] [Activate or Skip Response] |
对用户查询的每个回复都由一系列句子甚至操作组成。这些额外的操作会根据情感状态触发,代表用户获取额外的数据,只有在认为有利的情况下才返回给用户。 当然,用户仍然可以明确要求获得这些数据,但关键在于让软件与用户产生共鸣,通过积极的数据点为对话 “加油打气”。
软件情感实例:股票图表
让我们举一个例子,用户要求查看当天的股票图表。数据看起来令人失望。 用户可能会说 “我对这些财务数据很不满意 “或 “哦,太好了”。对于当前状态,软件可以包含三种可能的回复,如下图所示:
用户询问:”我对这些财务数据真的很不满意”。 情感情绪:消极 软件状态:已向用户提供股票价格。 可提供的答复: “请说出股票代码” “虽然数字有所下降,但 30 天移动平均线仍处于正值范围内”。 “数字确实是积极的,我们是否也应该审查一下数量?”
在上面的例子中,由于用户在购买股票时出现了亏损,软件判断出了用户的负面情绪。对话式用户界面的典型反应可能是简单地提示用户询问另一个股票代码。 不过,一旦确定了情绪,软件就可以主动获取股票的 30 天移动平均线,如果是正面的,就会让用户知道这一利好消息。 如果附加指标是负值,软件可以搜索另一个指标(60 天移动平均线、成交量、YTD 涨幅等),直到找到正值指标或搜索完毕。 同样,如果用户对股价表达了明显的积极情绪,软件或许也会主动要求查看股票成交量。
综上所述,情感显然在形成情绪反应方面发挥着重要作用。让我们来详细了解一下。
防止对话式用户界面中的挫败感
在对话式用户界面中测量情绪的首要条件是检测特定对话中的积极或消极情绪。具体来说,我们要检测的是人与计算机之间的对话。 在这种情况下,简短的键入命令已被流畅的句子所取代。因此,用户在与软件对话的同时,也在为某个目标执行任务。
如果用户说了一个听不清或无效的短语,计算机通常会用一个 “包罗万象 “的短语来回应,要求用户重复问题或提供一个选项列表。这可能是不必要的,甚至会引起用户的不满。 提前发现用户的挫败感,并为用户提供完成任务的替代方案,可能会更有优势。
要检测用户的挫败感,我们可以利用情感分析。具体来说,我们可以尝试测量句子中的积极程度,并在整个对话过程中跟踪这种情绪水平。 如果水平低于某个阈值,软件就会采取纠正措施,以友好的方式为用户提供帮助,或者至少表示出同情。
软件情感实例:音乐播放器 1.0
下面是一个比较传统的软件交互示例。请注意用户是如何在电脑播放了错误的歌曲后表示沮丧的。然而,电脑并没有识别出用户的命令,只是没有回复。
Hello, what song would you like to play? > Play a random song from Britney Spears. Playing music from Green Day. > No, I said Britney Spears. … [unrecognized phrase, no response from computer] … > Play Britney Spears. Please state the name of a song. > Play Toxic from Britney Spears. Ok, playing Toxic from Britney Spears. |
在上述对话中,计算机不再回复带负电荷的口语短语,原因很简单,没有一个词与程序的任何关键短语相匹配。我们很幸运,在这种情况下,用户会再次尝试,并以不同的形式重新发出新的询问。 对于某些用户来说,我们可能就没那么幸运了,在这种情况下,用户会直接退出软件并放弃。计算机会识别新的短语,推进其内部状态(以确定一首特定的歌曲),并要求用户说出要播放的歌曲。
软件情感实例:音乐播放器 2.0
试想一下,如果把对话改成这样
Hello, what song would you like to play? > Play a random song from Britney Spears. Playing music from Green Day. > No, I said Britney Spears. I’m sorry, could you repeat the name of the song? > Toxic. Ok, playing Toxic from Britney Spears. |
在上面的对话中,我们可以看到更加流畅的交互。事实上,当用户第一次表示沮丧时,电脑甚至表现出了同理心。 通过更像人类的方式做出反应,用户会感到安心,甚至会觉得使用软件更愉快。
此外,请注意计算机是如何跟踪对话上下文的。在用户发出播放歌曲的请求后,对话用户界面将其上下文设置为 “播放歌曲”。 虽然播放的是错误的歌曲(来自 Green Day 而不是 Britney Spears),但 “播放歌曲 “的语境仍然有效。 当用户做出 “不,我说的是布兰妮-斯皮尔斯 “的否定回答时,软件就会理解用户想要播放一首歌(这就是我们当前的状态),并将上下文主题从 “绿日 “更新为 “布兰妮-斯皮尔斯”。 现在,计算机可以询问是哪首歌曲,因为它已经知道歌手和任务,用户只需说出歌名即可。
对话式用户界面状态转换
我们可以深入研究上述示例场景的状态机转换。软件状态可能如下所示:
{ sentiment: neutral, action: null, subject: null, song: null } Hello, what song would you like to play? > Play a random song from Britney Spears. { sentiment: neutral, action: playing_a_song, subject: “Green Day”, song: “random” } Playing music from Green Day. > No, I said Britney Spears. { sentiment: negative, action: playing_a_song, subject: “Britney Spears”, song: null } I am sorry, could you repeat the name of the song? > Toxic. { sentiment: neutral, action: playing_a_song, subject: “Britney Spears”, song: “Toxic” } Ok, playing Toxic from Britney Spears. |
在上述状态流程中,请注意软件的内部变量是如何根据情感触发进行转换的。 最初,内部状态被设置为播放某位艺术家的歌曲。当用户表示对歌手的理解有误时(通过语音识别失败),负面情绪就会被检测到,并导致主题的转换。 此外,歌曲值被设置为空。现在软件会要求用户提供歌曲值,此时状态转换就可以完成了。
既然我们已经了解了情感分析对于确定人与计算机之间对话的状态有多么重要,那么让我们来深入了解一下计算情感的细节。
用情感分析衡量积极性
很明显,有些关键词和短语会让人产生消极或沮丧的情绪。如果我们能从这些短语中找到关键字,就能检测到用户的情绪变化,并做出更恰当的回应,帮助引导用户完成任务。
测量对话情感的一种方法是通过人工智能和自然语言处理,以及机器学习和情感分析。
情感分析有多种不同的方法,每种方法的准确度各不相同。基本技术包括简单的关键词搜索,如使用 AFINN 词表或其他基于词典的算法。基于人工智能的技术包括训练有素的情感分析,其准确度往往高于非人工智能技术。
∗ 请注意,我们即将进入一些细枝末节的数据科学内容!如果你愿意,可以 直接跳到 演示!
情感分析:基于关键词与机器学习
举例说明基于关键词的情感分析与人工智能机器学习模型之间的区别,我们可以在一个大型 Twitter 数据集上 进行一些简单的准确性测试。
该数据集包含特定时间内记录的 160 万条推文。通过检测推文正文中的快乐 🙂 或悲伤 🙁 表情符号,每条推文都会被自动 评分 为具有积极或消极情绪。
下表显示了使用不同算法进行的情感分析准确性测量结果。
情感分析的准确性很难做到恰到好处。 标准的基于关键字的方法由于只考虑了一系列情感化的术语,因此准确率较低。此外,基于非机器学习的算法无法通过从训练集中学习更多特征来提高准确率。 相比之下,机器学习算法能够在更大的数据集中识别更多的特征,从而在更大的数据量中提高 准确性 。
使用 AFINN 进行情感分析
让我们来看看 AFINN 词表在情感分析方面的准确性如何。AFINN 是一个英文单词列表,它为不同的情感词汇设定了 -5 到 +5 之间的分数。这些词语都是人工标注的。
我们可以使用 R 来加载 Twitter 数据集,并处理一小部分数据子集,以进行情感分析的准确性评分。
首先,我们将使用以下 R 软件包:
packages <- c(‘syuzhet’, ‘data.table’, ‘caTools’, ‘slam’, ‘tm’, ‘SnowballC’, ‘randomForest’, ‘xgboost’) if (length(setdiff(packages, rownames(installed.packages()))) > 0) { install.packages(setdiff(packages, rownames(installed.packages())), dependencies=T) } library(syuzhet) library(data.table) library(caTools) library(tm) library(randomForest) library(xgboost) |
接下来,我们可以使用以下代码读取 Twitter 数据集,进行情感分析和准确性测量。
data <- fread(‘training.csv’, header=F) names(data) <- c(‘sentiment’, ‘id’, ‘date’, ‘query’, ‘user’, ‘text’) data$sentiment <- as.factor(data$sentiment) set.seed(777) spl <- sample.split(data$sentiment, 0.05) mdata <- subset(data, spl == TRUE) spl <- sample.split(mdata$sentiment, 0.7) train <- subset(mdata, spl == TRUE) test <- subset(mdata, spl == FALSE) train$sentimentp <- train$sentiment == 4 test$sentimentp <- test$sentiment == 4 train$afinn <- apply(train, 1, function(row) { get_sentiment(row[“text”], method=’afinn’) }) train$positive <- train$afinn >= 0 table(train$sentimentp, train$positive) (10952 + 25244) / nrow(train) |
运行上述代码后,我们发现 AFINN 对 Twitter 数据集进行情感分析的准确率为 64.64%。这当然比随机概率要好,但还有待提高。
使用机器学习进行情感分析
我们还可以使用机器学习人工智能方法检查 Twitter 数据集的情感分析准确性。为此,我们首先要为数据集中的术语建立一个语料库。 这实际上就是我们的术语词典。然后,我们删除标点符号、停止词和数字,并使用词干法使同一词的变体变得常见。 最后,我们使用稀疏术语缩小字典范围,只保留在所有文档中出现频率较高的术语。这有助于加快机器学习算法的训练时间。
我们的最终结果是一个文档术语矩阵,由语料库中每个术语的列和每个文档的行组成。每个单元格中的值与该术语在文档中出现的频率相对应。 文档术语矩阵是一种有用的文本编码方式,可用于各种自然语言处理任务,如 流行话题 、 文档分类 、 关键词搜索 ,甚至 检测黑客推文 。
下面是一个建立语料库的例子。
corpus <- Corpus(VectorSource(train$text)) tdm <- DocumentTermMatrix(corpus, list(removePunctuation = TRUE, stopwords = TRUE, stemming = TRUE, removeNumbers = TRUE)) sparse <- removeSparseTerms(tdm, 0.9997) tdmtrain <- as.matrix(sparse) tdmtrain <- as.data.frame(tdmtrain) tdmtrain$y <- as.numeric(train$sentimentp) corpusTest <- Corpus(VectorSource(test$text)) tdmtest <- DocumentTermMatrix(corpusTest, control = list(dictionary = Terms(sparse))) tdmtest <- as.matrix(tdmtest) tdmtest <- as.data.frame(tdmtest) tdmtest$y <- as.numeric(test$sentimentp) |
在上面的代码中,你可以看到我们是如何从 Twitter 数据集创建文档术语矩阵的,这实际上是将推文编码为每个术语的数字数组。 由于每个文档现在都是一行,列数相同(每个术语一列),因此我们的数组可以很好地用于机器学习算法的处理。
我们还设置了一个测试文档术语矩阵,它使用与训练集相同的单词字典。这意味着测试数组将包含与训练数组相同的列数,因此可用于我们创建的任何训练有素的机器学习模型。
让我们从逻辑回归模型开始。
逻辑回归
对于我们首次尝试的情感倾向分析准确性,我们可以尝试一个简单的逻辑回归模型。我们将把文档术语矩阵的所有列(所有术语)传入该算法,并根据 “y “值(表示正面情感)进行训练。代码如下所示。
sentimentLog <- glm(y ~ ., data=tdmtrain, family=’binomial’) predictLog <- predict(sentimentLog, type=’response’) c <- table(train$sentimentp, predictLog >= 0.5) (c[1,1] + c[2,2]) / nrow(train) predictLog <- predict(sentimentLog, type=’response’, newdata=tdmtest) c <- table(test$sentimentp, predictLog >= 0.5) (c[1,1] + c[2,2]) / nrow(test) |
在训练逻辑回归模型后,我们发现训练集的准确率为 76%,测试集的准确率为 67%。这与 AFINN 相比,虽然进步很小,但也是一种进步。
XGBoost
对于下一步的情感分析准确性测量,我们可以尝试使用 XGBoost 算法。下面是代码示例。
n <- ncol(tdmtrain) set.seed(777) t <- as.matrix(tdmtrain) t2 <- as.matrix(tdmtest) sentimentXG <- xgboost(data = t[,-n], label = t[,n], eta=0.2, nround = 5000, subsample = 0.5, colsample_bytree = 0.5, objective = “binary:logistic”) results <- predict(sentimentXG, t) c <- table(t[,n], results >= 0.5) (c[1,1] + c[2,2]) / nrow(train) results <- predict(sentimentXG, t2) c <- table(t2[,n], results >= 0.5) (c[1,1] + c[2,2]) / nrow(test) |
在对模型进行训练后,我们发现训练集的准确率为 84%,测试集的准确率为 67%。这略高于逻辑回归模型
支持向量机 (SVM)
利用支持向量机(SVM)模型,我们可以进一步提高情感分析的准确率。使用更大的训练数据集,在交叉验证集上可以达到约 82% 的准确率。
通过更大的数据集和更长时间的训练,可以进一步提高准确率。其他技术还包括使用 递归神经网络 来考虑情感重要术语在句子中的位置。
编写响应情感的软件
既然我们已经解决了如何检测对话情绪的问题,那么我们就可以开始讨论帮助用户的解决方案了。 情绪分析为我们提供了中性、积极或消极情绪的指标,可用作触发机制,推进对话式用户界面或人工智能例程的内部状态。
我们在上面已经看到了一些例子,说明这样的状态机可能是什么样子的。让我们试着实现一个!
软件情感实例:书评 1.0
作为书评应用程序简单对话式用户界面的首次尝试,我们将实现一个基本的聊天机器人界面。 为了保持代码简洁易懂,我们将只使用少量硬编码的关键字和回复,聊天机器人对话式用户界面将识别并作出回应。
以下主题将引起回应:
hello Alice in wonderland Pemberley Bye Help |
我们将在一个键/值对中存储关键词及其相关回复,我们称之为 “大脑”。我们只需比较用户的文本(或语音,如果使用语音识别),即可在机器人大脑中找到任何匹配的关键词。 如果发现匹配,机器人只需回复结果值即可。
与书评聊天 1.0
下面是使用书评对话式用户界面 1.0 版聊天的示例会话。
> hello Hello, please say the name of a book to get a review. > how about Alice in Wonderland? The book Alice in Wonderland has a rating of 4 stars. > I love Alice in Wonderland! The book Alice in Wonderland has a rating of 4 stars. > What about Pemberley? The book Pemberley has a rating of 2 stars. > Hm, Pemberley sounds like a book I would dislike. The book Pemberley has a rating of 2 stars. > You’re not much help, pretty sad! Please say the name of a book to get a review. |
请注意,在上述与聊天机器人的对话中,用户一开始只是说 “你好 “来问候机器人。机器人会识别这个关键词,因为它与大脑中的一个硬编码术语相匹配,并输出相关的回复。 指导用户如何与机器人互动以获取书评。
接下来,用户询问《爱丽丝梦游仙境》这本书的内容,聊天机器人会简单明了地回答这本书的评分。接下来是最重要的部分!
当用户发出 “我喜欢《爱丽丝梦游仙境》!”的感叹时,聊天机器人只是简单地回复了这本书的评分。这是意料之中的,因为软件的运行完全符合预期。 它只是简单地匹配一个关键词并给出一个值,并没有进一步确定用户的情感倾向特征。
同样,第二个书评请求包含一个负面评价。同样,聊天机器人没有任何明显的表情,只是简单地回复了书的评分。毫无疑问,用户对软件感到不满,于是说出了自己的感受并终止了应用。
稍后,我们将把 “书评 “应用程序升级到 2.0 版本。在那里,我们将添加情感!不过,首先让我们快速浏览一下原始版本的代码。
书评内参 1.0
如果你好奇,第一个书评应用程序的代码如下所示。你可以看到大脑的请求和响应模型是多么简单。 我们只需存储键/值对,并使用简单的 indexOf()
命令与用户输入进行匹配。虽然这款软件可能不会赢得任何奖项,但它却能让人明白,我们要实现的是一款简单的对话式用户界面应用程序。
var brain = [ { key: “hello”, value: “Hello, please say the name of a book to get a review.” }, { key: “alice in wonderland”, value: “The book Alice in Wonderland has a rating of 4 stars.” }, { key: “pemberley”, value: “The book Pemberley has a rating of 2 stars.” }, { key: “bye”, value: “Goodbye.” }, { key: “help”, value: “Please say the name of a book to get a review.” } ]; function respond(input) { var result = “Sorry, I don’t understand.”; input = input.toLowerCase().replace(/[.,\/#!$%\^&\*;:{}=\-_`~()]/g, ”); for (var i in brain) { var response = brain[i]; if (input.indexOf(response.key.toLowerCase()) != -1) { result = response.value; break; } } return result; } |
您可以在 https://jsfiddle.net/dbyzztxp/1/ 上找到该聊天机器人的完整代码和演示。
软件情感实例:书评 2.0
我们刚刚看到的书评应用程序就是一个简单的例子,它利用对话式用户界面与用户聊天。机器人没有任何情绪表达,只是以简单的方式回答用户的询问。 由于软件只需匹配关键字并做出响应,因此没有对用户的输入特征或情绪倾向进行测量。
现在,我们要给机器人升级,让它拥有一些内在情感!
与书评 2.0 对话
下面是使用书评会话用户界面 2.0 版聊天的示例会话,其中使用了情感反应。请注意,对话变得多么不同,甚至可以说是亲密无间。
> hello Hello, please say the name of a book to get a review. > Hello, the other version of you was quite bad. Perhaps, a good book would cheer you up. Please say the name of a book to get a review. > Ok, how about Alice in Wonderland? The book Alice in Wonderland has a rating of 4 stars. > I love Alice in Wonderland! That’s great to hear that you enjoy the book. You might also like “The Annotated Alice: The Definitive Edition” by the same author, with a rating of 4.5. Would you like to hear about it? > No thanks. What about Pemberley? The book Pemberley has a rating of 2 stars. > That’s too bad. Pemberley doesn’t sound too good. Although this book has quite a low rating, you might enjoy “Mrs Darcy’s Dilemma”, by Diana Birchall, with a rating of 3.4. Would you like to hear about it? > I dislike that book too. Can you help? Retrieving book reviews can actually be quite easy! Just say the name of a book to get a review. > This is great! But, time to go. Bye. I’m glad to have helped! Please come back soon. Goodbye. |
和以前一样,用户以 “你好 “的问候语开始与聊天机器人对话。聊天机器人检测不到用户的任何情绪,只是简单地回复了一句标准问候语。到目前为止,这与我们的第一个版本没有什么不同。
接下来,用户对上一版本软件的不良功能提出了意见。 具体来说,用户在信息中再次使用了 “hello”(发起另一次问候),但同时也使用了 “bad”(这恰好是我们的机器人大脑中用于衡量情感的一个关键词短语),表达了明显的负面情绪。
聊天机器人匹配了 “hello “一词,但它并没有简单地回复默认值,而是对句子进行了情感测量。检测到情绪是负面的,机器人就会做出回应,提供一篇书评来帮助用户振作起来。酷毙了
接下来,用户要求对 “爱丽丝梦游仙境 “进行评论。聊天机器人会再次进行情感测量,检测出中性回复,并回复该情感的相关值。 这恰好是一个标准的中性回复,与第一版应用程序相同。不过,在听到 4 星好评后,用户会感叹道:”我喜欢《爱丽丝梦游仙境》!” (就像上一个例子中的用户一样)。(就像上一个例子一样)。 这就是情感真正发挥作用的地方!
对话式用户界面中的人工智能会对用户输入的句子进行情感测量。由于 “爱 “这个词对应的是积极情绪,因此聊天机器人会做出积极的回应。 在这种情况下,回复是推荐同一作者的类似书籍。让我们考虑一下这样做的后果。
软件中情感人工智能的真正力量
聊天机器人刚刚成功测量了用户回复的情绪,并将其确定为积极的。这与刚刚检索到的某本书的评论相关联。 软件可以推断出用户可能喜欢这本书(也喜欢作者),从而推荐同一作者的类似书籍。
用户并没有明确要求提供类似书籍。我们也没有在网页用户界面上添加可能会分散注意力的信息,如相关书籍、类似书籍和他人已购买书籍的列表。 相反,我们专门针对用户表达的积极情感情绪,并根据这一指标推荐同一作者的另一本书。
通过调整用户的情感倾向,我们可能刚刚提高了软件的使用价值(更不用说图书销售了!)。
用书评 2.0 继续对话
您可以跟进聊天机器人会话对话的其余部分。用户询问另一篇书评,这次是关于 “彭伯里 “的(就像第一个版本的例子一样)。聊天机器人会检测到中性情绪,并回复该书的普通评分。 不过,这次当用户对评论表达负面情绪时(因为这本书只有 2 星评论),聊天机器人就能根据检测到的负面情绪做出相应的回应。
在检测到负面情绪后,对话式用户界面会检索与该主题相关的负面反应,即向用户提供由不同作者撰写的评分较高但类似的书籍。
我们再次挖掘用户情感的隐藏价值,利用潜在机会。 此时,用户可能会直接退出应用程序(负面情绪有可能会导致这种情况!),而机器人则试图通过提供另一本书来重新确定对话的语境。 这可以提高应用程序的用户留存率,并通过推荐相关(和情感主题)书籍促进图书销售!
在结束对话时,用户表示他们也不喜欢推荐的书(这让我们很失望),并向应用程序寻求帮助。聊天机器人再次检测到了用户求助中的负面情绪。 机器人与用户产生共鸣,试图让用户的情绪变得更积极,提醒用户检索其他书评很容易。随后,机器人还提供了检索另一篇书评的说明。
书评内幕 2.0
在我们的书评对话式用户界面聊天机器人中加入情感元素后,我们刚刚看到了一些非常有趣的结果。让我们看看这一切是如何实现的。
与第一个版本一样,我们也有一个包含键/值对响应的大脑数据库。但这次不同的是,对于每个匹配的关键词,我们都提供了三个不同的对应值。每个值之间用情感分隔。
下面是这种简单数据结构的示例。
var brain = [ { key: “hello”, value: { neutral: “Hello, please say the name of a book to get a review.”, positive: “Hello, please say the name of a book to get a review.”, negative: “Perhaps, a good book would cheer you up. Please say the name of a book to get a review.” } }, { key: “alice in wonderland”, value: { neutral: “The book Alice in Wonderland has a rating of 4 stars.”, positive: “That’s great to hear that you enjoy the book. You might also like \”The Annotated Alice: The Definitive Edition\” by the same author, with a rating of 4.5. Would you like to hear about it?”, negative: “Although this book might be disappointing, you might enjoy \”The House at Pooh Corner\”, by A.A. Milne, with a rating of 4.3. Would you like to hear about it?” } } … ]; |
请注意,每个术语都有多个回复,并根据检测到的情绪加以区分。 虽然此示例中的响应是针对特定书籍硬编码的,但我们可以很容易地看到如何动态查询 API,并将这些结果纳入针对特定情感的响应中。
主要的 respond()
方法与第一个版本几乎完全相同,但包括了情感测量。
function respond(input) { var result = “Sorry, I don’t understand.”; input = input.toLowerCase().replace(/[.,\/#!$%\^&\*;:{}=\-_`~()]/g, ”); for (var i in brain) { var response = brain[i]; if (input.indexOf(response.key.toLowerCase()) != -1) { var sentiment = getSentiment(input); result = response.value[sentiment]; break; } } return result; } |
上述方法虽然与原始版本相似,但现在增加了一行来确定情感。它使用得出的情感值来检索与匹配关键词相关的回复。 这样,任何一个主题都可以找到多个潜在的答案。
计算 情感的代码只是一个硬编码的关键词列表,其中包含了一些带有情感色彩的术语(与前面讨论过的 AFINN 情感测量模型不太一样)。这样做是为了保持演示的简单性。 不过,正如我们前面所展示的,使用人工智能机器学习模型可以进行更精确的情感计算。
您可以在 https://jsfiddle.net/z0rkyq4L/2/ 上找到该聊天机器人的完整代码和演示。
结论
很显然,除了简单的关键词和短语匹配之外,对话式用户界面还有更多需要识别的地方。毕竟,在考虑用户与软件对话时的情感倾向时,我们刚刚看到了情感的强大作用。
传统的对话式用户界面会忽略情感等上下文属性,并倾向于通过简单的语句匹配对用户的询问做出简单的回复,而情感则能将聊天机器人的对话提升到一个全新的水平。
通过添加情感检测功能,我们能够增强对话式用户界面,与用户更紧密地结合在一起,对他们的情绪状态感同身受,并做出相应的反应。 通过使用情感识别回复,对话式用户界面能够根据用户对主题的情感推断推荐产品,从而挖掘潜在的错失机会。
当检测到积极情绪时,聊天机器人会选择特定的回复类型和产品推荐。同样,负面情绪会帮助聊天机器人将对话引向其他方向,为用户提供其他产品推荐和帮助。
考虑到情感分析在对话式用户界面中的效果,我们或许可以进一步考虑传统上隐藏的属性。 通过认识到更多语音特征(包括情感、情绪、语调、响度、性别和其他各种指标)的重要性和机遇,我们有望在计算机与人类交互之间建立更紧密的联系。
下载 @ GitHub
该项目的 源代码 可在 GitHub 上获取。
原文链接: https://www.primaryobjects.com/2016/10/24/emotional-artificial-intelligence/