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

作者: Mezereon | 来源:发表于2018-08-18 18:51 被阅读2次

    1. 摘要

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

    2. 介绍

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

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

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

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

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

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

    3. 系统形式化

    一般地, 一个面向任务的对话系统包含一下几个组成部分:
    DS = \{QU, ST, DM, PKB \}
    QU为问题理解, 输入是Q_t, 输出是M_t, Q_t代表着用户在时间t的话语, M_t代表Q_t的形式化的意思表示.

    ST为状态跟踪, 输入是M_tH_{t-1}, 输出是H_t, H_t代表着时间t的对话状态, 通过时间逐渐累积的意味表达.

    DM为对话管理, 输入是H_t, 输出是自然语言回应R_t, 内部函数即是基于当前对话状态H_t来选择一个更为合适的action伴随着自然语言表示来回应用户.

    PKB为产品知识库, 也就是由一堆三元组<p,n,v>\in P \times N \times V组成的集合, P是产品集合, N是属性集合, V是属性值.

    4. 问题理解

    给定话语Q_t, 自然语言理解模块就是生成它的表示M_t, 特别地对于线上购物场景:
    M_t = <I,C,A>
    其中I就是通过用户话语表达出来的意图Q_t, 用于确定action(推荐或者是QA)
    CQ_t所涉及的产品种类, 用于确定可能的产品以供DM来进行分析.
    A是二元组<n,v>的集合, n代表属性名字, v代表对应的值,

    4.1 问题意图检测

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

    4.2 意图分析挖掘

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

    意图分析挖掘算法:
    1. 收集和过滤社交网站中提交的问题, 成为一个问题集合Q_D=\{ q_1, ..., q_D\}, 这些问题至少包含产品名称, 牌子名称, 或者种类名称中的一个(基于产品知识库)
    2. 在Q_D上运行ParseSegmentation来分割每一个q_k到一个短语序列\{ph_{k1}, ..., ph_{kn}\} **
    3. 在已经分割好的Q_D上运行ParseLDA来得到主题聚类 **
    **4. 购物相关意图的集合通过众包来定义, 基于基于主题的短语聚类 **
    5. 对于每一个意图, 通过众包选取短语的一个集合
    6. 返回一个购买意图集合I, 以及带有标记的意图短语

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

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

    4.3 意图分类

    对于每一个意图I_k\in I, 我们从Q_D中收集了2000个问题, 每一个都至少包括一个I_k的意图短语, 我们也收集了2000个没有购买意向的问题, 所有这些有标记的问题都被用来训练成一个多类别的分类器, 进而确定用户言语表现的意图, 或者只是闲聊.

    5. 产品类别检测

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

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

    输入层:
    传统地, 每一个词利用one-hot编码成一个向量, 维度取决单词的种类, 然而如果是中文, 那么维度是一个问题, 对于学习出模型的参数的代价相当昂贵, 为了缓解这个问题, 我们将中文字符表示成特性的计数向量, 我们对于话语Q使用t^{th}个n元词法模型, 主要是将每个词连接起来, 类似于l_t=[w^{T}_{t-d}, ... ,w^{T}_{t}, ..., w^{T}_{t+d}]^{T}

    其中w_t为第t个词的表示, 并且n = 2d + 1为上下文窗口大小, 我们设置成3

    卷积层:
    卷积层实现基于窗口滑动的特征抽取, 进而对于每个n元文法单词向量表示l_t投影到上下文特征向量h_t:
    h_t = tanh(W_c * l_t)

    其中W_c是卷积矩阵

    池化层:
    池化层聚集通过卷积层抽取的局部特征, 进而构建固定大小的和输入语句长度无关的语句水平的全局特征. Max pooling被用来推动网络进而通过l_p = [v_1, v_2, ..., v_K]^K保持最有用的局部特征, 其中
    v_i = \max_{t = 1, .., T} \{h_t(i)\}

    语义层:
    对于Q的全局表示l_p, 一个非线性转换被这样应用:
    y(Q) = tanh(W_s * l_p)
    其中W_s是语义投影矩阵, y(Q)是最后的语义向量表示.

    给定一个用户话语Q, 和排行的产品类型列表, 我们首先使用CNN来计算出Q的语义向量并且所有的产品类型
    接着, 我们计算出Q和每一个产品类型C_i的相似度, 相似度的计算使用语义向量的余弦相似度
    Sim(C_i, Q) = Cosine(y(Q), y(C_i))

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

    6. 产品属性抽取

    给定用户话语Q, 产品属性抽取的目的就是通过属性名和值T^* = t_1^{K}去标注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)

    其中m_k \in Q是n元词法, t_k \in A \ \ or\ \ t_k \in Vm_k涉及的属性名(或者属性值), P(t_k|m_k)m_k能够被t_k标记的概率

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

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

    • 属性值是产品名的时候:
      我们通过产品搜索日志数据来进行释义的挖掘, 这是由于电子商务网站给用户提供搜索服务, 那么肯定就会产生一堆日志
      1. 首先我们从日志中获得<q, url_p>对, 其中q是一个搜索引擎的query, url是通过q搜索到的, 然后点进去名字是p的页面.
      2. 我们计算出link(p|q)作为分数, 其中q是产品p的一个可选表达
        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)为query q下点击进入产品名是p页面的次数, 基于link(p,q), 我们可以进一步计算出分布
    P(p|q) = \frac{link(p|q)}{\sum_{p'}link(p'|q)}

    其中, P(p|q)实际上为query q在产品相关集合上的分布, 注意到, 用户也会使用品牌名, 产品类别, 或者它们的结合来进行搜索, 因此, 对于每一个三元组<p, q, P(q|p)>, 当P(q|p)超过预定义的阈值的时候, 我们只对产品属性抽取的使用而保留,

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

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

    Input: Q
    Output:T^* = t_1^K

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

    其中T_{nBest}储存Q的所有可能的标记结果, Score(T)类似\prod_{k=1}^{K}{P(t_k|m_k)}来计算出来, 其中T = t_1^K

    给出GlobalSearch的具体算法

    GlobalSearch
    Input: index, Q_t, T, T_{nBest}
    if index == |Q_t| then
    \ | \ \ \ \ T_{nBest}.Add(T)
    end
    else
    \ | \ \ \ \ m = \emptyset
    \ | \ \ \ \ for ( i = index; \ i<|Q_t| ; i++)
    \ | \ \ \ \ \ | \ \ \ \ m = m+
    \ | \ \ \ \ \ | \ \ \ \ Add<m, [word], P([word]|m)> to\ T
    \ | \ \ \ \ \ | \ \ \ \ GlobalSearch(i+1, Q_t, T, T_{nBest})
    \ | \ \ \ \ \ | \ \ \ \ Remove<m, [word], P([word]|m)> from \ T
    \ | \ \ \ \ \ | \ \ \ \ for each <m, [word], P([word]|m)> \in Para do
    \ | \ \ \ \ \ | \ \ \ \ \ | \ \ \ \ if m == m_k then
    \ | \ \ \ \ \ | \ \ \ \ \ | \ \ \ \ \ | \ \ \ \ Add<m_k, t_k, P(t_k|m_k)> to \ T
    \ | \ \ \ \ \ | \ \ \ \ \ | \ \ \ \ \ | \ \ \ \ GlobalSearch(i+1, Q_t, T, T_{nBest})
    \ | \ \ \ \ \ | \ \ \ \ \ | \ \ \ \ \ | \ \ \ \ Remove<m_k, t_k, P(t_k|m_k)> from \ T
    \ | \ \ \ \ \ | \ \ \ \ \ | \ \ \ \
    end

    \ | \ \ \ \ \ | \ \ \ \end
    \ | \ \ \ \end
    end

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

    7. 状态跟踪

    状态跟踪模块ST, 保持对话状态H_t, 对话状态也即是直到时间t的对话时段表示, ST按如下进行作用:

    1. 基于函数SessionAwareIntentUpdate(M_t, H_{t-1})更新意图状态M_t.i, 基于以下规则来更新M_t的意图
      • 如果M_t.i\in I, 不是Session-Aware的意图, 则保持M_t.i不改变
      • 如果M_t.i\in I, 是Session-Aware的意图, 并且H_{t-1}.i = Recommendation, 设置M_t.iRemonmendation
      • 其他情况, 设置M_t.iChit-chat
    2. 如果话语被检测为Chit-chat, 则没有更新, H_t = H_{t-1}
    3. 如果当前话语的产品类别被确认为储存在H_{t-1}的产品类别, 则H_t会继承H_{t-1}的所有信息, 否则, H_t的内容将会完全基于M_t来进行更新, 包括I, C, A, 也就是意图, 产品类别和属性-值的集合

    注意到, 如果chit-chat话语的连续长度超过某一个预定义的阈值, 或者在时间t时两个连续的话语的时间间隔超过某个预定义长度, 则H_t会被清除, 作为一种遗忘的方法.

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

    8. 对话管理

    对话管理模块DM利用当前对话状态H_t作为输入, 基于该状态进行不同的动作, 并且输出相应的结果.
    这里给出在线购物场景的各种动作:

    • 推荐
      H_t.iRecomendation的时候将会触发, 它将会利用产品类别和属性值在产品库当中进行检索, 最后储存到H_t
    • 比较
      需要满足两个条件才会触发比较:
    1. H_t.i = Comparision
    2. 相同类别的多个产品或者品牌的名字在H_t被检测出来
      将会对它们的优缺点都进行比较
    • 观点总结
      H_t.iAsk \ Opnion的时候将会触发, 将会总结存储在H_t中的目标产品和牌子, 基于电子商务伙伴提供的产品review数据
    • 问题回答
      这个动作会在一个产品的名字或者属性在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中也没有

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

    • 闲聊
      当没有任何的购买意图被检测到的时候, 将会触发这个动作, 使用Ji, Lu和Li的方法基于IR的回应生成策略, 该模块基于以下的条件, 在给定的用户话语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>\}为从web上收集来的(问题-回答)的数据, q_m是用户的问题, 而r_m是其他用户对这个问题的回答, h_i是第i个特征, 用于度量utterance和query的相似性, \lambda_ih_i的特征权重, 该模块的目的为:
    • 找到存在的和q_t相似的\tilde{q}
    • 返回\tilde{q}的回答\tilde{r}, 作为q_t的回答

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

    相关文章

      网友评论

        本文标题:建立一个线上购物的面向任务的对话系统

        本文链接:https://www.haomeiwen.com/subject/wcofiftx.html