前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >建立一个线上购物的面向任务的对话系统

建立一个线上购物的面向任务的对话系统

作者头像
Mezereon
发布2018-09-13 13:35:01
8620
发布2018-09-13 13:35:01
举报
文章被收录于专栏:MyBlogMyBlog

1. 摘要

该文给出了针对用于线上购物的面向任务的对话系统的一个一般的解决方案, 目标是协助用户完成多样化的购买相关任务, 比如搜索商品和回答问题, 如同正常人之间的对话. 作为一个创始工作, 我们会展现NLP的技术, 数据源以及可以利用的众包来建立这样一个关于电子商务的面向任务的对话系统. 为了示范它的效果, 我们将我们的系统集成到一个移动端在线购物应用, 据我们所知道的最好的消息, 这个系统实际用于百万级别的用户群体, 我们的实验部分将会展现有趣的和有深刻见解的观察, 基于人机对话日志的分析, 同时也给出了未来的一些挑战.

2. 介绍

一般来说, 对话系统分为面向任务的以及非面向任务的系统, 而本文中的线上购物的对话系统既需要面向任务, 同时也需要具备普通交流的功能, 但是以前我们利用特定领域的知识来对语义槽进行设计和填充, 不过这种方法在整个系统冷启动的条件下很难进行应用, 我们需要大量的人和人的语料, 可是这确是难以获得的.

为了解决这些问题, 我们的工作专注于三种类型的数据(对于电子商务web服务是共通的, 同时是易于爬取获得的):

  1. 产品知识库(结构化存储的产品信息)
  2. 搜索日志(产品, 自然语言查询和用户选择的行为)
  3. 社交网站(用户自然语言中所表露出的意图)

我们应用的bot可以和用户进行交流, 同时尝试去帮助用户比较相同类型的商品, 或者是和用户闲聊, 通过对 聊天日志的分析, 可以找出用户的兴趣点.

我们提出的方法和之前的方法主要有两个不同:

  1. 训练数据 大多数之前的对话系统依赖于带有标记的数据作为有监督的学习, 最终训练一个统计模型来实现槽的填充, 对话状态跟踪, 策略选择等, 但是这样带有标记的数据在实际应用上基本没有, 比如线上购物, 我们提出了可选择的方案来利用已存在的数据建立一个面向任务的对话系统, 和轻量级众包一起, 这并不意味着我们的方法更加聪明, 而是在冷启动条件下比较适用.
  2. 领域伸缩 大多数之前的对话系统只能适用于特定的领域, 预先定义的实体以及语义标记(有限的大小), 与此相反, 此篇论文中所使用的领域知识库十分庞大, 不仅给算法和模型都带来了挑战, 而且产品设计亦是一个问题, 进一步, 我们也提出了一个管道来解决意图挖掘和检测任务.

3. 系统形式化

一般地, 一个面向任务的对话系统包含一下几个组成部分:

DS = \{QU, ST, DM, PKB \}
DS = \{QU, ST, DM, PKB \}
QU
QU

为问题理解, 输入是

Q_t
Q_t

, 输出是

M_t
M_t

,

Q_t
Q_t

代表着用户在时间

t
t

的话语,

M_t
M_t

代表

Q_t
Q_t

的形式化的意思表示.

ST
ST

为状态跟踪, 输入是

M_t
M_t

H_{t-1}
H_{t-1}

, 输出是

H_t
H_t

,

H_t
H_t

代表着时间

t
t

的对话状态, 通过时间逐渐累积的意味表达.

DM
DM

为对话管理, 输入是

H_t
H_t

, 输出是自然语言回应

R_t
R_t

, 内部函数即是基于当前对话状态

H_t
H_t

来选择一个更为合适的action伴随着自然语言表示来回应用户.

PKB
PKB

为产品知识库, 也就是由一堆三元组

<p,n,v>\in P \times N \times V
<p,n,v>\in P \times N \times V

组成的集合,

P
P

是产品集合,

N
N

是属性集合,

V
V

是属性值.

4. 问题理解

给定话语

Q_t
Q_t

, 自然语言理解模块就是生成它的表示

M_t
M_t

, 特别地对于线上购物场景:

M_t = <I,C,A>
M_t = <I,C,A>

其中

I
I

就是通过用户话语表达出来的意图

Q_t
Q_t

, 用于确定action(推荐或者是QA)

C
C

Q_t
Q_t

所涉及的产品种类, 用于确定可能的产品以供DM来进行分析.

A
A

是二元组

<n,v>
<n,v>

的集合,

n
n

代表属性名字,

v
v

代表对应的值,

4.1 问题意图检测

同一产品的话语提及可能是完全不同的, 系统需要基于用户意图来确定如何进行动作, 文中提及了一个意图分析的例子, 利用几个简单的模板来套用就可以得到相应的意图, 但是意图检测仍然是一个比较大的问题.

4.2 意图分析挖掘

有很多地方人们会表露出购买的意图, 包括搜索引擎, 社交站点, 社交网络等, 我们提出关于购物意图分析挖掘的算法, 这个算法在社交网站上的问题进行信息挖掘, 这些问题都是能表现出明显的购物意图,

意图分析挖掘算法: 1. 收集和过滤社交网站中提交的问题, 成为一个问题集合

Q_D=\{ q_1, ..., q_D\}
Q_D=\{ q_1, ..., q_D\}

, 这些问题至少包含产品名称, 牌子名称, 或者种类名称中的一个(基于产品知识库) 2. 在

Q_D
Q_D

上运行ParseSegmentation来分割每一个

q_k
q_k

到一个短语序列

\{ph_{k1}, ..., ph_{kn}\}
\{ph_{k1}, ..., ph_{kn}\}

** 3. 在已经分割好的

Q_D
Q_D

上运行ParseLDA来得到主题聚类 ** **4. 购物相关意图的集合通过众包来定义, 基于基于主题的短语聚类 ** 5. 对于每一个意图, 通过众包选取短语的一个集合 6. 返回一个购买意图集合

I
I

, 以及带有标记的意图短语

特别地, 三种状态相关的意图也被考虑进来:

  1. 添加过滤条件 添加多个过滤条件使得对话成为多轮的对话系统
  2. 查看更多 意味着用户想查看更多商品, 比如"其他的", "下一个"
  3. 协商 意味着用户并不满足当前推荐的产品但是没有很明确的表现出理由
4.3 意图分类

对于每一个意图

I_k\in I
I_k\in I

, 我们从

Q_D
Q_D

中收集了2000个问题, 每一个都至少包括一个

I_k
I_k

的意图短语, 我们也收集了2000个没有购买意向的问题, 所有这些有标记的问题都被用来训练成一个多类别的分类器, 进而确定用户言语表现的意图, 或者只是闲聊.

5. 产品类别检测

在这个环节中, 我们将产品类别检测看作是一个多分类的问题, 给定一个带有购买意图的用户言语, 产品类别检测的目的就是预测出用户说的东西的类别, 这东西的用处在于缩小预测的范围, 利用预先检测出来的类别来从浩瀚的产品库中选取一部分子集, 再在其中进行一定的搜索匹配.

为了解决这个分类任务, 使用了基于CNN的方法.

输入层: 传统地, 每一个词利用one-hot编码成一个向量, 维度取决单词的种类, 然而如果是中文, 那么维度是一个问题, 对于学习出模型的参数的代价相当昂贵, 为了缓解这个问题, 我们将中文字符表示成特性的计数向量, 我们对于话语

Q
Q

使用

t^{th}
t^{th}

个n元词法模型, 主要是将每个词连接起来, 类似于

l_t=[w^{T}_{t-d}, ... ,w^{T}_{t}, ..., w^{T}_{t+d}]^{T}
l_t=[w^{T}_{t-d}, ... ,w^{T}_{t}, ..., w^{T}_{t+d}]^{T}

其中

w_t
w_t

为第t个词的表示, 并且

n = 2d + 1
n = 2d + 1

为上下文窗口大小, 我们设置成3

卷积层: 卷积层实现基于窗口滑动的特征抽取, 进而对于每个n元文法单词向量表示

l_t
l_t

投影到上下文特征向量

h_t
h_t

:

h_t = tanh(W_c * l_t)
h_t = tanh(W_c * l_t)

其中

W_c
W_c

是卷积矩阵

池化层: 池化层聚集通过卷积层抽取的局部特征, 进而构建固定大小的和输入语句长度无关的语句水平的全局特征. Max pooling被用来推动网络进而通过

l_p = [v_1, v_2, ..., v_K]^K
l_p = [v_1, v_2, ..., v_K]^K

保持最有用的局部特征, 其中

v_i = \max_{t = 1, .., T} \{h_t(i)\}
v_i = \max_{t = 1, .., T} \{h_t(i)\}

语义层: 对于

Q
Q

的全局表示

l_p
l_p

, 一个非线性转换被这样应用:

y(Q) = tanh(W_s * l_p)
y(Q) = tanh(W_s * l_p)

其中

W_s
W_s

是语义投影矩阵,

y(Q)
y(Q)

是最后的语义向量表示.

给定一个用户话语

Q
Q

, 和排行的产品类型列表, 我们首先使用CNN来计算出

Q
Q

的语义向量并且所有的产品类型 接着, 我们计算出

Q
Q

和每一个产品类型

C_i
C_i

的相似度, 相似度的计算使用语义向量的余弦相似度

Sim(C_i, Q) = Cosine(y(Q), y(C_i))
Sim(C_i, Q) = Cosine(y(Q), y(C_i))

给定用户话语的一个产品类型的后验概率, 通过一个softmax函数, 基于相似性分数来进行计算, 模型用来最大化正确匹配话语和产品类型的似然性, 这里使用随机梯度下降

6. 产品属性抽取

给定用户话语

Q
Q

, 产品属性抽取的目的就是通过属性名和值

T^* = t_1^{K}
T^* = t_1^{K}

去标注

Q
Q

,

T^* = argmax_{T}P(T|Q) \\ = argmax_{T}P(t_1^K|m_1^K) \\ = argmax_{T}\prod_{k=1}^{K} P(t_k|m_k)
T^* = argmax_{T}P(T|Q) \\ = argmax_{T}P(t_1^K|m_1^K) \\ = argmax_{T}\prod_{k=1}^{K} P(t_k|m_k)

其中

m_k \in Q
m_k \in Q

是n元词法,

t_k \in A \ \ or\ \ t_k \in V
t_k \in A \ \ or\ \ t_k \in V

m_k
m_k

涉及的属性名(或者属性值),

P(t_k|m_k)
P(t_k|m_k)

m_k
m_k

能够被

t_k
t_k

标记的概率

对于一个不能被标记属性或者值的单词, 我们将其标注为[word], 同时具有一个小的值代表概率

P([word]|m)
P([word]|m)

而如何获得这个概率呢, 这就需要一个释义挖掘任务

  • 属性值是产品名的时候: 我们通过产品搜索日志数据来进行释义的挖掘, 这是由于电子商务网站给用户提供搜索服务, 那么肯定就会产生一堆日志
    1. 首先我们从日志中获得
    <q, url_p>
    <q, url_p>

    对, 其中

    q
    q

    是一个搜索引擎的query,

    url
    url

    是通过

    q
    q

    搜索到的, 然后点进去名字是

    p
    p

    的页面.

    1. 我们计算出
    link(p|q)作为分数, 其中
    link(p|q)作为分数, 其中

    q是产品

    p
    p

    的一个可选表达

    link(p|q) = p(p|q)*p(q|p)\\ = \frac{\#(p,q)}{\sum_{p'}{\# (p',q)}}*\frac{\#(p,q)}{\sum_{q'}{\# (p, q')}}
    link(p|q) = p(p|q)*p(q|p)\\ = \frac{\#(p,q)}{\sum_{p'}{\# (p',q)}}*\frac{\#(p,q)}{\sum_{q'}{\# (p, q')}}
\# (p,q)
\# (p,q)

为query q下点击进入产品名是p页面的次数, 基于

link(p,q)
link(p,q)

, 我们可以进一步计算出分布

P(p|q) = \frac{link(p|q)}{\sum_{p'}link(p'|q)}
P(p|q) = \frac{link(p|q)}{\sum_{p'}link(p'|q)}

其中,

P(p|q)
P(p|q)

实际上为query q在产品相关集合上的分布, 注意到, 用户也会使用品牌名, 产品类别, 或者它们的结合来进行搜索, 因此, 对于每一个三元组<p, q, P(q|p)>, 当

P(q|p)
P(q|p)

超过预定义的阈值的时候, 我们只对产品属性抽取的使用而保留,

  • 对于其他属性值和名字: 我们通过大量的不同的数据来挖掘释义, 包括知识库中的条目, web文档中的链接文字, 维基百科的重定向表, 还有通过开放信息抽取的被挖掘出来的同义词(Hearst pattern)

我们使用一个基于动态规划的算法来获取

T^*
T^*

Input: Q Output:

T^* = t_1^K
T^* = t_1^K
T = \emptyset
T = \emptyset
T_{nBest} = \emptyset
T_{nBest} = \emptyset
GlobalSearch(0, Q_t, T, T_{nBest})
GlobalSearch(0, Q_t, T, T_{nBest})
  1. 返回
T^* = arg \max_{T \in T_{nBest}} Score(T)
T^* = arg \max_{T \in T_{nBest}} Score(T)

其中

T_{nBest}
T_{nBest}

储存

Q
Q

的所有可能的标记结果,

Score(T)
Score(T)

类似

\prod_{k=1}^{K}{P(t_k|m_k)}来计算出来
\prod_{k=1}^{K}{P(t_k|m_k)}来计算出来

, 其中

T = t_1^K
T = t_1^K

给出GlobalSearch的具体算法

GlobalSearch Input:

index, Q_t, T, T_{nBest}
index, Q_t, T, T_{nBest}

if

index == |Q_t|
index == |Q_t|

then

\ | \ \ \ \ T_{nBest}.Add(T)
\ | \ \ \ \ T_{nBest}.Add(T)

end else

\ | \ \ \ \ m = \emptyset
\ | \ \ \ \ m = \emptyset
\ | \ \ \ \
\ | \ \ \ \

for

( i = index; \ i<|Q_t| ; i++)
( i = index; \ i<|Q_t| ; i++)
\ | \ \ \ \
\ | \ \ \ \
\ | \ \ \ \
\ | \ \ \ \
m = m+
m = m+
\ | \ \ \ \
\ | \ \ \ \
\ | \ \ \ \
\ | \ \ \ \
Add<m, [word], P([word]|m)> to\ T
Add<m, [word], P([word]|m)> to\ T
\ | \ \ \ \
\ | \ \ \ \
\ | \ \ \ \
\ | \ \ \ \
GlobalSearch(i+1, Q_t, T, T_{nBest})
GlobalSearch(i+1, Q_t, T, T_{nBest})
\ | \ \ \ \
\ | \ \ \ \
\ | \ \ \ \
\ | \ \ \ \
Remove<m, [word], P([word]|m)> from \ T
Remove<m, [word], P([word]|m)> from \ T
\ | \ \ \ \
\ | \ \ \ \
\ | \ \ \ \
\ | \ \ \ \

for each

<m, [word], P([word]|m)> \in Para
<m, [word], P([word]|m)> \in Para

do

\ | \ \ \ \
\ | \ \ \ \
\ | \ \ \ \
\ | \ \ \ \
\ | \ \ \ \
\ | \ \ \ \

if

m == m_k
m == m_k

then

\ | \ \ \ \
\ | \ \ \ \
\ | \ \ \ \
\ | \ \ \ \
\ | \ \ \ \
\ | \ \ \ \
\ | \ \ \ \
\ | \ \ \ \
Add<m_k, t_k, P(t_k|m_k)> to \ T
Add<m_k, t_k, P(t_k|m_k)> to \ T
\ | \ \ \ \
\ | \ \ \ \
\ | \ \ \ \
\ | \ \ \ \
\ | \ \ \ \
\ | \ \ \ \
\ | \ \ \ \
\ | \ \ \ \
GlobalSearch(i+1, Q_t, T, T_{nBest})
GlobalSearch(i+1, Q_t, T, T_{nBest})
\ | \ \ \ \
\ | \ \ \ \
\ | \ \ \ \
\ | \ \ \ \
\ | \ \ \ \
\ | \ \ \ \
\ | \ \ \ \
\ | \ \ \ \
Remove<m_k, t_k, P(t_k|m_k)> from \ T
Remove<m_k, t_k, P(t_k|m_k)> from \ T
\ | \ \ \ \
\ | \ \ \ \
\ | \ \ \ \
\ | \ \ \ \
\ | \ \ \ \
\ | \ \ \ \

end

\ | \ \ \ \
\ | \ \ \ \
\ | \ \ \ \
\ | \ \ \ \

end

\ | \ \ \ \
\ | \ \ \ \

end end

询问理解在许多AI相关的主题中扮演重要的角色. 基于规则的方法需要标记以及具有不可伸缩性质, 数据驱动的方法使用大量的方法解决了这个问题, 比如HMM/CFG, CRF, SVM, RNN等等, 但是这些都依赖于有标记的数据, 而这些数据通常对于特定领域的不适用, 我开发了一种利用已存在的目标领域的资源的其他方法, 利用下个步骤进行进一步的优化.

7. 状态跟踪

状态跟踪模块

ST
ST

, 保持对话状态

H_t
H_t

, 对话状态也即是直到时间

t
t

的对话时段表示,

ST
ST

按如下进行作用:

  1. 基于函数
SessionAwareIntentUpdate(M_t, H_{t-1})
SessionAwareIntentUpdate(M_t, H_{t-1})

更新意图状态

M_t.i
M_t.i

, 基于以下规则来更新

M_t
M_t

的意图

  • 如果
M_t.i\in I
M_t.i\in I

, 不是Session-Aware的意图, 则保持

M_t.i
M_t.i

不改变

  • 如果
M_t.i\in I
M_t.i\in I

, 是Session-Aware的意图, 并且

H_{t-1}.i = Recommendation
H_{t-1}.i = Recommendation

, 设置

M_t.i
M_t.i

Remonmendation
Remonmendation
  • 其他情况, 设置
M_t.i
M_t.i

Chit-chat
Chit-chat

  1. 如果话语被检测为
Chit-chat
Chit-chat

, 则没有更新,

H_t = H_{t-1}
H_t = H_{t-1}
  1. 如果当前话语的产品类别被确认为储存在
H_{t-1}
H_{t-1}

的产品类别, 则

H_t
H_t

会继承

H_{t-1}
H_{t-1}

的所有信息, 否则,

H_t
H_t

的内容将会完全基于

M_t
M_t

来进行更新, 包括

I, C, A
I, C, A

, 也就是意图, 产品类别和属性-值的集合

注意到, 如果chit-chat话语的连续长度超过某一个预定义的阈值, 或者在时间t时两个连续的话语的时间间隔超过某个预定义长度, 则

H_t
H_t

会被清除, 作为一种遗忘的方法.

对话状态的跟踪是保证多轮对话中用户体验的关键, 本文中由于为了规避冷启动的问题, 使用了Session水平的标记数据来提高置信状态跟踪.

8. 对话管理

对话管理模块

DM
DM

利用当前对话状态

H_t
H_t

作为输入, 基于该状态进行不同的动作, 并且输出相应的结果. 这里给出在线购物场景的各种动作:

  • 推荐
H_t.i
H_t.i

Recomendation
Recomendation

的时候将会触发, 它将会利用产品类别和属性值在产品库当中进行检索, 最后储存到

H_t
H_t

  • 比较 需要满足两个条件才会触发比较:
H_t.i = Comparision
H_t.i = Comparision
  1. 相同类别的多个产品或者品牌的名字在
H_t
H_t

被检测出来 将会对它们的优缺点都进行比较

  • 观点总结
H_t.i
H_t.i

Ask \ Opnion
Ask \ Opnion

的时候将会触发, 将会总结存储在

H_t
H_t

中的目标产品和牌子, 基于电子商务伙伴提供的产品review数据

  • 问题回答 这个动作会在一个产品的名字或者属性在
H_t
H_t

中被检测到的时候触发, 同时对应的属性值没有检测到, 将会通过产品数据库来返回没有提及的属性值, 我们将其视作单轮的KB-QA(知识库-问题回答)任务, 通过Yih的方法解决

Yih, W.-t.; Chang, M.-W.; He, X.; and Gao, J. 2015. Semantic parsing via staged query graph generation: Question answering with knowledge base. In Proceedings of Annual Meeting of the Association for Computational Linguistics (ACL).

  • 前瞻性的提问 这个动作会在满足三个条件的时候触发:
  1. 一个Recomendation被检测出来
  2. 产品类别被识别出来
  3. 没有任意的约束, 包括在
H_t
H_t

中也没有

注意到, 这样形式的问题通常会是众包的数据中会含有的

  • 闲聊 当没有任何的购买意图被检测到的时候, 将会触发这个动作, 使用Ji, Lu和Li的方法基于IR的回应生成策略, 该模块基于以下的条件, 在给定的用户话语
q_t
q_t

下, 生成一个回应:

\tilde{r} = arg \max_{<q,r>\in DB_{QR}}\sum_{i}\lambda_i \cdot h_i(q,q_t)
\tilde{r} = arg \max_{<q,r>\in DB_{QR}}\sum_{i}\lambda_i \cdot h_i(q,q_t)

其中

DB_{QR} = \{ <q_1,r_1>, <q_2,r_2>, \dots , <q_M,r_M>\}
DB_{QR} = \{ <q_1,r_1>, <q_2,r_2>, \dots , <q_M,r_M>\}

为从web上收集来的(问题-回答)的数据,

q_m
q_m

是用户的问题, 而

r_m
r_m

是其他用户对这个问题的回答,

h_i
h_i

是第

i
i

个特征, 用于度量utterance和query的相似性,

\lambda_i
\lambda_i

h_i
h_i

的特征权重, 该模块的目的为:

  • 找到存在的和
q_t
q_t

相似的

\tilde{q}
\tilde{q}
  • 返回
\tilde{q}
\tilde{q}

的回答

\tilde{r}
\tilde{r}

, 作为

q_t
q_t

的回答

Ji, Z.; Lu, Z.; and Li, H. 2014. An information retrieval approach to short text conversation. arXiv preprint arXiv:1408.6988.

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.08.18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 摘要
  • 2. 介绍
  • 3. 系统形式化
  • 4. 问题理解
    • 4.1 问题意图检测
      • 4.2 意图分析挖掘
        • 4.3 意图分类
        • 5. 产品类别检测
        • 6. 产品属性抽取
        • 7. 状态跟踪
        • 8. 对话管理
        相关产品与服务
        腾讯智能对话平台
        腾讯智能对话平台(Tencent Bot Platform,TBP)专注于“对话即服务”的愿景,全面开放腾讯对话系统核心技术,为大型企业客户、开发者和生态合作伙伴提供开发平台和机器人中间件能力,实现便捷、低成本构建人机对话体验和高效、多样化赋能行业。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档