详细介绍NLP对话系统

news2024/11/16 21:43:41

任务型对话系统

任务型对话系统主要应用于固定领域。任务型对话的广泛应用的方法有两种,一种是模块法,另一种是端到端的方法。
模块法是将对话响应视为模块,每个模块负责特定的任务,并将处理结果传送给下一个模块。
端到端的任务型对话系统不再独立地设计各个子模块,而是直接学习对话上下文到系统回复的映射关系,设计方法更简单。相关研究可以划分为两大类:基于检索的方法和基于生成的方法。
在这里插入图片描述
(NLU)模块的主要任务是将用户输入的自然语言映射为用户的意图和槽位。该模块的主要作用也是会以三元组的形式输出用户意图、槽位和槽位对应的槽值,输出给对话状态跟踪模块。

【案例分析】
用户输入:“今天北京天气怎么样”
用户意图定义:询问天气
槽位定义:
槽位一:时间
槽位二:地点
我们针对“询问天气 ”任务定义了两个必要槽位,是“时间 ”和“地点 ”。
在这里插入图片描述

意图和槽位

意图识别,就是将用户输入的自然语言会话进行划分类别,类别对应的就是用户的意图分类,例如“现在几点了 ”,其意图为“询问时间 ”。“今天气温多少度”,“询问天气的”。其实意图识别就是典型的分类问题,并且一般为多分类问题。也就是我们常用的文本分类任务。
意图识别的方法:基于SVM\TextCNN 等算法,也是通过序列标注、特征提取等方法,再经过模型训练的方式实现意图识别。

槽位,即意图对应的参数,确定意图之后(是问天气,还是查询图书),一个意图可以对应若干个参数。例如在线图书馆查找一本图书时,需要给出书名、作者、出版社等必要参数,以上参数即“查询图书 ”这一意图对应的槽位。
槽位填充的方法:槽位填充是序列标注问题,用机器学习HMM、SVM和深度学习RNN等算法都可以实现。

对话状态跟踪(DST)

填槽工作可能是通过多轮对话来完成,状态跟踪模块包括持续对话的各种信息,它根据旧状态(即对话历史),用户状态(即目前槽值填充情况)与系统状态(即通过与数据库的查询情况)来更新当前的对话状态。

系统与用户多轮对话,逐步明确用户需求,用户表达需求的过程,就是不断的填槽过程。
在这里插入图片描述

对话策略学习(DPL)

对话策略学习(DPL)是用来决策模型在当前状态下采取何种回复策略。
当用户输入语句后,由NLU、DST模块处理后形成3个结果向量。其中意图、槽位、槽值三个向量会拼接成一个高纬度的特征向量,输入LSTM模型。
LSTM经过Softmax激活函数输出系统当前时刻各系统动作的概率分布,再经过概率最大化取到概率最大元素所在索引等一些列动作处理和特定生成模板,生成系统的回复返回给用户。
在这里插入图片描述

自然语言生成(NLG)

自然语言生成(NLG)其目的是将语义表示转化为自然语言话语。
自然语言生成主要有三种生成方法:
(1)基于模板的方法。
通过预先设定好模板,进行自然语言生成,来返回给用户。例如已经为您预定{time}的从{origin}到{destination}的机票。
(2)基于语法规则的方法。
和自然语言理解中提到的方法类似,判断用户的语句是疑问句还是陈述句等,结合词性进行自然语言内容的生成。
(3)基于生成的方法。
通过依靠Seq2Seq等模型,计算上下文向量;最终Decoder部分结合Encoder的输入状态,上下文向量,以及Decoder的历史输入,预测当前输出对应于词典的概率分布。

在对话系统中,首先从训练语料中提取大量的问题模板,并构成一个对应的模板池。从问题集里通过关系向量与答案模板池多对多对应。

闲聊式对话系统

闲聊式对话系统也被称为开放领域对话系统,或者聊天机器人。
闲聊式对话系统是无任务驱动、为了纯聊天或者娱乐而开发的,它的目的是生成有意义且相关的内容回复。
开放领域闲聊式对话系统主要分为检索式和生成式对话系统。在检索式对话系统通过对用户的输入信息先进行查询和排序,再给出最佳答案的方法。生成式对话系统是通过已有的语料生成新文本作为回答。目前生成式闲聊对话系统的研究属性大于应用属性,很多问题尚在探索阶段。

检索式对话系统

检索式对话系统通过匹配技术从预定义数据库中检索与用户查询匹配的话语并排序,选取出排名最高的回复,核心是如何构建较好的查询-回复匹配模型。

案例分析:最简单的对话系统

import random
# 提问数据存储
greetings = ['你好', 'hello', 'hi', '早上好', 'hey!','hey']
# 随机函数选择提问
random_greeting = random.choice(greetings)
# 对于“你好吗? ”这个问题的回复
question = ['How are you?','你好吗?']
# “我很好 ”
responses = ['Okay',"I'm fine"]
# 随机选一个回
random_response = random.choice(responses)
# 死循环让程序不断接受提问,当输入“再见 ”程序退出
while True:
    userInput = input(">>> ")
    if userInput in greetings:
        print(random_greeting)
    elif userInput in question:
        print(random_response)
    # 当你说“拜拜 ”程序结束
    elif userInput == '再见':
        break
    else:
        print("我不知道你在说什么")

输出如下结果:

>>>你好
早上好
>>>你好吗?
我不知道你在说什么?
>>>你好吗?
I’m fine

检索式聊天系统的架构过程通常经过问题解析、规则系统、粗排、精排等几个过程。
最后选择语料库中得分最高的回复。
在这里插入图片描述

粗排模型

粗排模型是检索式问答的一种方法,目的是从语料库中快速检索出相似问题。理解粗排模型首先需要了解倒排索引。

倒排索引(Inverted index)常被称为反向索引。倒排索引打乱了语料的正向排序,故称倒排索引。通常来说,以文档id作为索引,以文档内容作为记录;而倒排索引则以文档内容作为索引,以文档id作为记录。
在这里插入图片描述
燕山大学对应的记录是0说明第0篇文档中包含燕山大学这个词。
在这里插入图片描述
粗排模型
倒排索引之后,就可以快速的将包含所在词的文档找到,这样就大大提高了搜索速度。包含单字的、包含介词等内容的顺序靠后排。而出现次数少的词,模型认为有可能是关键语句,则需要往前排。
粗排模型实现:按问题句中词的出现次数进行升序排序,取靠前的候选问题句作为粗排结果。

精排模型

在粗排模型中我们按照词的方式进行比较。而精排模型,我们是要比较两个问答句的相似度。不难发现,查询词语序的问题并没有考虑进去,“我请你吃饭 ”和“你请我吃饭 ”在粗排模型中都是一个结果。
并且倒排索引也严重依赖分词,例如上面例子中“燕山 ”、“大学 ”和“燕山大学 ”就是两种不同的分词,结果也是完全不同的。
分词问题主要的解决方式,最近两年的做法是以字为单位输入,以字为输入单位的方式逐渐的超过了以词为单位的效果。而词序的问题,我们可以通过深度学习网络解决。
Sentence2Vector 精排模型结构
在这里插入图片描述

以句子为单位输入到LSTM模型中,LSTM模型把句子处理成时序信息,为句子中的每个字都建立关联。将每个字上一时刻的输出作为这一时刻的输入。这样“你请我吃饭 ”和“我请你吃饭 ”由于字的时序不一样,这样就解决了粗排模型中遗留的语序问题和必须分词的问题。
Self-Attention就是在信息处理过程中,对不同的词分配不同的注意力权重。
Dense模块,是将Self-Attention层输出转换成向量,分别将问题句和语料库中的问题句做向量内积,从而得到两句话的相似程度。

Sentence2Vector模型与CBOW模型用多个词预测一个词结构基本类似,只是Sentence2Vector是把词换成了句子,是一个对句子进行向量化,同时可以进行相似度计算的一个模型。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/83068.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分布式事务 - Seata - TCC模式

目录一、什么是TCC二、AT & TCC区别 及 适用场景三、代码集成示例3.1 升级Seata 1.5.23.2 示例场景说明3.3 TCC核心接口定义3.4 TCC相关阶段规划3.5 TCC核心代码四、TCC三大问题(幂等、空回滚、悬挂)之前介绍过分布式事务之Seata AT模式,…

智慧新零售异业联盟帮你搞定多店跨界整合,让你开启共富时代

大家好,我是林工,在如今的时代,不管你所看到的商业模式是什么样的,以不变应万变,目的只有一个,把买卖发展壮大,想要将买卖发展壮大,那就需要精准的吸粉引流获客方式和能力。 林工常常…

Fluent Mybatis 牛逼!

这玩意比ThreadLocal叼多了,吓得我赶紧分享出来。 推荐一些chrome浏览器必装的插件! 40 个 SpringBoot 常用注解 VSCode 花式玩法(摸鱼)收藏一下 ! 使用fluent mybatis可以不用写具体的xml文件,通过jav…

【面试大全】互联网面试软实力【必看】

软实力 推荐大家使用Markdown语法写简历,然后再将Markdown格式转换为PDF格式后进行简历投递。如果你对Markdown语法不太了解的话,可以花半个小时简单看一下Markdown语法说明: http://www.markdown.cn/ 面试 假如你是网络申请者【拉勾、boss等】&…

Latex 分式格式处理

分式 分式命令:\frac{分子}{分母}。 对于行内短分式,可用斜线/输入,例如:(xy)/2 举例: 行内分式 \(\frac{xy}{yz} \) (显示为:) 行间分式 \[\frac{xy}{yz}\] (显示为&a…

【PCB设计特别篇之阻抗计算】还在用SI9000进行阻抗计算?

有了叠层信息后,才可以进行阻抗计算,走线阻抗与线宽、线距、介质厚度、绿油厚度、介质介电常数、铜箔厚度等一些信息相关,所以要现有叠层,才能进行阻抗计算。 阻抗计算的工具有很多,下面介绍几种: 1、SI900…

RSS Can:使用 Golang 实现更好的 RSS Hub 服务(一)

聊聊之前做过的一个小东西的踩坑历程,如果你也想高效获取信息,或许这个系列的内容会对你有用。 这个事情涉及的东西比较多,所以我考虑拆成一个系列来聊,每篇的内容不要太长,整理负担和阅读负担都轻一些。 本篇是第一…

Go代码审计学习(二)

文章目录环境搭建漏洞一:代码逻辑错误、没有做有效的鉴权漏洞二:目录穿越、任意文件读取漏洞三:条件竞争漏洞四:钩子函数执行命令参考链接环境搭建 Gitea是从gogs衍生出的一个开源项目,是一个类似于Github、Gitlab的多…

自学python第三年才懂,这事儿影响着最终的学习结果

前言 如果这件事你还没搞明白,那你学python会跟我一样,学了几年跟没学差不多! 当然,这件事仅限于学python是想赚钱或者提升职场竞争力的人明白即可,其他人别浪费时间了。 这事儿很重要 我从2018年底开始自学python&a…

SpringBoot2核心技术(基础入门)- 03 自动配置原理【3.1依赖管理+2容器功能】

1、SpringBoot特点 1.1、依赖管理 ● 父项目做依赖管理 依赖管理 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.4.RELEASE</version> </parent…

(已更新)2023春节倒计时新款HTML单页源码

2023春节倒计时新款HTML单页自适应页面&#xff0c;有兴趣的可以看看&#xff01;背景图片自己修改喜欢的&#xff01; 源码介绍 自适应页面&#xff0c;支持安卓和ioswx背景音乐播放附带多个背景音乐&#xff0c;由于技术原因&#xff0c;一些js进行了加密&#xff08;支持i…

Spring boot 使用@DS 配合druid连接池切换数据源及切换数据源失效情况

一、导入包 <!-- dynamic-datasource --> <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.2.1</version> </dependency> 二、配置yam配置文…

【Flask框架】——09 视图和URL总结

目录一、创建flask项目1、安装环境2、创建项目3、启动程序4、访问项目二、flask参数说明1.初始化flask项目2.参数说明3.DEBUG调试模式三、应用程序的参数加载1.从配置对象中加载2.从配置文件中加载3.从环境变量中加载4.从Pycharm中的运行时设置环境变量的方式加载5.企业项目开发…

Flink-多流转换(合流,分流,双流join)

8 多流转换 8.1 分流 简单实现 对流三次filter算子操作实现分流 // 筛选 Mary 的浏览行为放入 MaryStream 流中DataStream<Event> MaryStream stream.filter(new FilterFunction<Event>(){Overridepublic boolean filter(Event value) throws Exception {retur…

vue-admin-template侧边栏修改成抽屉式

目录 一、修改sidebar组件 二、修改store 三、修改sidebaritem页面 四、修改navbar页面 五、修改layout 六、修改样式 一、修改sidebar组件 src—layout—components—sidebar—index.vue 把组件sidebar改成drawer <template><div :class"{ has-logo: s…

【AGC】崩溃服务flutter报缺失recordFatalException方法的问题

问题背景&#xff1a; cp反馈集成AGC-崩溃服务的flutter插件&#xff0c;使用最新的1.3.0300版本&#xff0c;出现下面错误 /Users/yin/Documents/projects/flutter/.pub-cache/hosted/pub.dartlang.org/agconnect_crash-1.3.0300/android/src/main/java/com/huawei/agconnec…

【脚本项目源码】Python制作艺术签名生成器,打造专属你的个人艺术签名

前言 本文给大家分享的是如何通过利用Python制作艺术签名生成器&#xff0c;废话不多直接开整~ 开发工具 Python版本&#xff1a; 3.6 相关模块&#xff1a; requests模块 PIL模块 PyQt5模块 环境搭建 安装Python并添加到环境变量&#xff0c;pip安装需要的相关模块即…

一个.NET的轻量级JWT库

这两天网上闲逛的时候&#xff0c;看到一个.NET的轻量级JWT库LitJWT&#xff0c;LitJWT号称主要关注性能&#xff0c;能提升至少5倍的编码/解码速度&#xff0c;以及更少的配置&#xff01; LitJWT支持的平台为netstandard 2.1或net5.0更高。 LitJWT宣传的性能对比图&#xf…

vulnhub靶机:presidential1

目录 进行靶机ip的扫描 nmap扫描开发的端口和服务信息 目录扫描 修改host文件 子域名搜集 phpmyadmin管理端登录 phpmyadmin漏洞利用 反弹shell capabilities提权 获取root权限 靶机总结 靶机下载网址&#xff1a;Presidential: 1 ~ VulnHub Kali ip&#xff1a;19…

数据分析方法-五大理论、分析框架、应用、数据分析作用

1、统计学理论 1.1 大数定量 定义&#xff1a; 指大量重复某一实验时&#xff0c;最后的频率会无限接近于事件的概率 数据的样本量越大&#xff0c;我们预测和计算的概率就越准确 数据的样本量越小&#xff0c;我们预测和计算的概率就越可能失效 举例&#xff1a; 某产品用户…