精华内容
下载资源
问答
  • 2020-06-19 17:31:42

    目录

    【Unity3D从入门到进阶】文章目录及设置这个专栏的初衷

    一、前言

    Dialogue System是一个分支式的统一会话系统。它不需要任何脚本,但它是设计为易于由程序员扩展。

    Unity对话系统让你:

    • 用分支逻辑编写交互式对话。
    • 在灵活的、完全可自定义的UI系统中显示会话。
    • 定义玩家要完成的任务/任务。
    • 播放镜头序列,如相机剪辑和音频。
    • 保存和加载游戏,并在场景更改中持久化数据。
    • 使用本地化来显示文本,并在不同的语言中播放剪裁场景。
    • 导入和导出各种格式,如:draft、Chat Mapper和CSV。

    效果图:
    在这里插入图片描述

    二、下载地址

    https://download.csdn.net/download/q764424567/12326896

    三、正文

    1、开始

    设置

    如果你的项目使用Unity5.x,则您必首先更改为强制文本序列化

    • Edit → Project Settings → Editor
    • 然后改变Asset Serialization到Force Text和Version Control到Visible Meta Files

    更多相关内容
  • Ractive Window作为Ractive组件有点奇怪,因为它主要是动态组装而不是预定义的模板中构建的。 您将获得一个Host组件,该组件管理多个Window组件。 当前无法管理模板中的窗口。 所有的API都JS端。 < ractive...
  • confirm() 方法 confirm() 方法用于显示一个带有指定消息和确定及取消按钮的对话框。...) 返回 true。...) 返回 false 一种: 代码如下: 弹出窗口</a> 二种: 代码如下: [removed] function ...
  • 仅用于window7中无法资源管理器中打开FTP时使用
  • 请注意:由于自定义LP窗口的功能最近两年中得到了增强,因此不再维护此SDK。 您仍然可以使用它,但不会对其进行更新,我们也没有正式支持它。 如何实现以前需要此SDK的用例的更多信息, 。 介绍 用于LiveEngage ...
  • Xwindow

    2012-11-17 22:04:00
    西安高性能算中心完全免费向合格申请用户提供计算资源,用户使用方式一般是通过远 程SSH Client 客户端来使用中心的资源,然而对于有些用户来说,可能其运行的不是命令行 程序,而是GUI 应用程序...Window对话的方式。
  • JS window对象详解

    2021-03-13 02:47:34
    window 是客户端浏览器对象模型的基类,window 对象是客户端 JavaScript...全局作用域客户端浏览器中,window 对象是访问 BOM 的接口,如引用 document 对象的 document 属性,引用自身的 window 和 self 属性等。...

    window 是客户端浏览器对象模型的基类,window 对象是客户端 JavaScript 的全局对象。一个 window 对象实际上就是一个独立的窗口,对于框架页面来说,浏览器窗口每个框架都包含一个 window 对象。

    全局作用域

    在客户端浏览器中,window 对象是访问 BOM 的接口,如引用 document 对象的 document 属性,引用自身的 window 和 self 属性等。同时 window 也为客户端 JavaScript 提供全局作用域。

    示例

    由于 window 是全局对象,因此所有的全局变量都被解析为该对象的属性。

    var a = "window.a"; //全局变量

    function f () { //全局函数

    console.log(a);

    }

    console.log(window.a); //返回字符串“window.a”

    window.f(); //返回字符串“window.a”

    使用 delete 运算符可以删除属性,但是不能删除变量。

    访问客户端对象

    使用 window 对象可以访问客户端其他对象,这种关系构成浏览器对象模型,window 对象代表根节点,浏览器对象关系的关系如图所示,每个对象说明如下。

    window:客户端 JavaScript 顶层对象。每当

    或 标签出现时,window 对象就会被自动创建。

    navigator:包含客户端有关浏览器信息。

    screen:包含客户端屏幕的信息。

    history:包含浏览器窗口访问过的 URL 信息。

    location:包含当前网页文档的 URL 信息。

    document:包含整个 HTML 文档,可被用来访问文档内容及其所有页面元素。

    9bbb50e704b99157cbbb7b3275918f1b.png

    使用系统对话框

    window 对象定义了 3 个人机交互的方法,主要方便对 JavaScript 代码进行调试。

    alert():确定提示框。由浏览器向用户弹出提示性信息。该方法包含一个可选的提示信息参数。如果没有指定参数,则弹出一个空的对话框。

    confirm():选择提示框。。由浏览器向用户弹出提示性信息,弹出的对话框中包含两个按钮,分别表示“确定”和“取消”按钮。如果点击“确定”按钮,则该方法将返回 true;单击“取消”按钮,则返回 false。confirm() 方法也包含一个可选的提示信息参数,如果没有指定参数,则弹出一个空的对话框。

    prompt():输入提示框。可以接收用户输入的信息,并返回输入的信息。prompt() 方法也包含一个可选的提示信息参数,如果没有指定参数,则弹出一个没有提示信息的输入文本对话框。

    示例1

    下面示例演示了如何综合调用这 3 个方法来设计一个人机交互的对话。

    var user = prompt("请输入您的用户名");

    if (!! user) { //把输入的信息转换为布尔值

    var ok = confirm ("您输入的用户名为:\n" + user + "\n 请确认。"); //输入信息确认

    if (ok) {

    alert ("欢迎您:\n" + user);

    } else { //重新输入信息

    user = prompt ("请重新输入您的用户名:");

    alert ("欢迎您:\n" + user);

    }

    } else { //提示输入信息

    user = prompt ("请输入您的用户名:");

    }

    这 3 个方法仅接收纯文本信息,忽略 HTML 字符串,只能使用空格、换行符和各种符号来格式化提示对话框中的现实文本。提示,不同的浏览器对于这 3 个对话框的显示效果略有不同。

    也可以重置这些方法。设计思路:通过 HTML 方式在客户端输出一段 HTML 片段,然后使用 CSS 修饰对话框的显示样式,借助 JavaScript 来设计对话框的行为和交互效果。

    示例2

    下面是一个简单的 alert() 方法,通过 HTML + CSS 方式,把提示信息以 HTML 层的形式显示在页面中央。

    window.alert = function (title, info) {

    var box = document.getElementById ("alert_box");

    var html = '

    ' + title + '
    ' + info + '

    if (box) {

    box.innerHTML = html;

    box.style.display = "block";

    } else {

    var div = document.createElement("div");

    div.id = "alert_box";

    div.style.display = "block";

    document.body.appendChild (div);

    div.innerHTML = html;

    }

    }

    alert ("重写alert()方法","这仅是一个设计思路,还可以进一步设计");

    下面是 CSS样式:

    #alert_box { position: absolute; left: 50%; top: 50%; width: 400px; height: 200px; display:none;}

    #alert_box dl { position: absolute; left: -200px; top: -100px; width: 400px; height: 200px; border: solid 1px #999; border-radius: 8px; overflow: hidden; }

    #alert_box dt { background-color: #ccc; height: 30px; text-align: center; line-height: 30px; font-weight: bold; font-size: 15px; }

    #alert_box dd { padding: 6px; margin: 0; font-size: 12px; }

    显示效果如下:

    d72dfaac6455baa02f521e9bb9d2e0a0.gif

    显示系统对话框的时候,JavaScript 代码会停止执行,只有当关闭对话框之后,JavaScript 代码才会恢复执行。因此,不建议在实战中使用这 3 种方法,仅作为开发人员的内测工具即可。

    打开和关闭窗口

    使用 window 对象的 open() 方法可以打开一个新窗口。用法如下:

    window.open (URL, name, features, replace)

    参数列表如下:

    URL:可选字符串,声明在新窗口中显示网页文档的 URL。如果省略,或者为空,则新窗口就不会显示任何文档。

    name:可选字符串,声明新窗口的名称。这个名称可以用作标记 和 的 target 目标值。如果该参数指定了一个已经存在的窗口,那么 open() 方法就不再创建一个新窗口,而只是返回对指定窗口的引用,在这种情况下,features 参数将被忽略。

    features:可选字符串,声明了新窗口要显示的标准浏览器的特征,具体说明如下表所示。如果省略该参数,新窗口将具有所有标准特征。

    replace:可选的布尔值。规定了装载到窗口的 URL 是在窗口的浏览历史中创建一个新条目,还是替换浏览历史中的当前条目。

    该方法返回值为新创建的 window 对象,使用它可以引用新创建的窗口。

    新窗口显示特征

    特征

    说明

    fullscreen = yes | no | 1 | 0

    是否使用全屏模式显示浏览器。默认是 no。处于全屏模式的窗口同时处于剧院模式

    height = pixels

    窗口文档显示区的高度。单位为像素。

    left = pixels

    窗口的 x 坐标。单位为像素。

    location = yes | no | 1 | 0

    是否显示地址字段。默认是 yes。

    menubar = yes | no | 1 | 0

    是否显示菜单栏。默认是 yes。

    resizable = yes | no | 1 | 0

    窗口是否可调节尺寸。默认是 yes。

    scrollbars = yes | no | 1 | 0

    是否显示滚动条。默认是 yes。

    status = yes | no | 1 | 0

    是否添加状态栏。默认是 yes。

    toolbar = yes | no | 1 | 0

    是否显示浏览器的工具栏。默认是 yes。

    top = pixels

    窗口的 y 坐标

    width = pixels

    窗口的文档显示区的宽度。单位为元素。

    新创建的 window 对象拥有一个 opener 属性,引用打开它的原始对象。opener 只在弹出窗口的最外层 window 对象(top)中定义,而且指向调用 window.open() 方法的窗口或框架。

    示例1

    下面示例演示了打开的窗口与原窗口之间的关系。

    win = window.open(); //打开新的空白窗口

    win.document.write ("

    这是新打开的窗口

    "); //在新窗口中输出提示信息

    win.focus (); //让原窗口获取焦点

    win.opener.document.write ("

    这是原来窗口

    "); //在原窗口中输出提示信息

    console.log(win.opener == window); //检测window.opener属性值

    使用 window 的 close() 方法可以关闭一个窗口。例如,关闭一个新创建的 win 窗口可以使用下面的方法实现。

    win.close;

    如果在打开窗口内部关闭自身窗口,则应该使用下面的方法。

    window.close;

    使用 window.closed 属性可以检测当前窗口是否关闭,如果关闭则返回 true,否则返回 false。

    示例2

    下面示例演示如何自动弹出一个窗口,然后设置半秒钟之后自动关闭该窗口,同时允许用户单击页面超链接,更换弹出窗口内显示的网页 URL。

    var url = "c.biancheng.net"; //要打开的网页地址

    var features = "height=500, width=800, top=100, left=100, toolbar=no, menubar=no,

    scrollbars=no,resizable=no, location=no, status=no"; //设置新窗口的特性

    //动态生成一个超链接

    document.write('切换到C语言中文网首页');

    var me = window.open(url, "newW", featrues); //打开新窗口

    setTimeout (function () { //定时器

    if (me.closed) {

    console.log("创建的窗口已经关闭。");

    } else {

    me.close();

    }

    }, 5000); //半秒钟之后关闭该窗口

    使用定时器

    window 对象包含 4 个定时器专用方法,说明如下表所示,使用它们可以实现代码定时执行,或者延迟执行,使用定时器可以设计演示动画。

    window 对象定时器方法列表

    方法

    说明

    setInterval()

    按照执行的周期(单位为毫秒)调用函数或计算表达式

    setTimeout()

    在指定的毫秒数后调用函数或计算表达式

    clearInterval()

    取消由 setInterval() 方法生成的定时器

    clearTimeout()

    取消由 setTimeout() 方法生成的定时器

    【setTimeout() 方法】

    setTimeout() 方法能够在指定的时间段后执行特定代码。用法如下:

    var o = setTimeout(code, delay);

    参数 code 表示要延迟执行的字符串型代码,将在 Windows 环境中执行,如果包含多个语句,应该使用分号进行分隔。delay 表示延迟时间,以毫秒为单位。

    该方法返回值是一个 Timer ID,这个 ID 编号指向延迟执行的代码控制句柄。如果把这个句柄传递给 clearTimeout() 方法,则会取消代码的延迟执行。

    示例1

    下面示例演示了当鼠标指针移过段落文本时,会延迟半秒钟弹出一个提示对话框,显示当前元素的名称。

    段落文本

    var p = document.getElementsByTagName("p") [0];

    p.onmouseover = function (i) {

    setTimeout (function () {

    console.log(p.tagName);

    }, 500);

    }

    setTimeout() 方法的第一个参数虽然是字符串,但是也可以是一个函数。一般建议把函数作为参数传递给 setTimeout() 方法,等待延迟调用。

    示例2

    下面示例演示了如何为集合中每个元素都绑定一个事件延迟处理函数。

    var o = document.getElementsByTagName("body") [0].childNodes; //获取body下所有子元素

    for (var i = 0; i < o.length; i ++){ //遍历元素集合

    o[i].onmouseover = function (i) { //注册鼠标经过事件处理函数

    return function () { //返回闭包函数

    f (o[i]); //调用函数f,并传递当前对象引用

    }

    } (i); //调用函数并传递循环序号,实现在闭包中存储对象序号值

    }

    function f (o) { //延迟处理函数

    var out = setTimeout (function () {

    console.log(o.tagName); //显示当前元素的名称

    }, 500} //定义延迟半秒钟后执行代码

    }

    这样当鼠标指针移过每个页面元素时,都会在延迟半秒钟后弹出一个提示对话框,提示元素名称。

    示例3

    可以利用 clearTimeout() 方法在特定条件下清除延迟处理代码。例如,当鼠标指针移过某个元素,停留半秒钟之后才会弹出提示信息,一旦鼠标指针移出当前元素,就立即清除前面定义的延迟处理函数,避免干扰。

    var o = document.getElementsByTagName("body") [0].childNodes;

    for (var i = 0; i < o.length; i ++ ) {

    o[i].onmouseover = function (i) { //为每个元素注册鼠标移过时事件延迟处理函数

    return function () {

    f (o[i]);

    }

    } (i);

    o[i].onmouseover = function (i) { //为每个元素注册鼠标移出时清除延迟处理函数

    return function () {

    clearTimeout (o[i].out); //清除已注册的延迟处理函数

    }

    } (i);

    }

    function f (o) { //把延迟处理定时器存储在每个元素的 out 属性中

    o.out = setTimeout (function () {

    nsole.log(o.tagName);

    }, 500);

    }

    如果希望反复执行 setTimeout() 方法中包含的代码,可以在 setTimeout() 方法中包含对自身的调用,这样就可以把自身注册为可以被反复执行的方法。

    示例4

    下面示例会在页面内的文本框中按秒针速度显示递加的数字,当循环执行 10 次后,会调用 clearTimeout() 方法清除对代码的执行,并弹出提示信息。

    var t = document.getElementsByTagName("input") [0];

    var i = 1;

    function f () {

    var out = setTimeout( //定义延迟执行的方法

    function () { //延迟执行函数

    t.value = i ++; //递加数字

    f (); //调用包含setTimeout()方法的函数

    }, 1000); //设置每秒执行一次调用

    if (i > 10) { //如果超过10次,则清除执行,并弹出提示信息

    clearTimeout (out);

    console.log("10秒钟已到");

    }

    }

    f(); //调用函数

    【setInterval() 方法】

    setInterval() 方法能够周期性执行指定的代码,如果不加以处理,那么该方法将会被持续执行,直到浏览器窗口关闭或者跳转到其他页面为止。用法如下:

    var o = setInterval (code, interval)

    该方法的用法与 setTimeout() 方法基本相同,其中参数 code 表示要周期执行的代码字符串,参数 interval 表示周期执行的时间间隔,以毫秒为单位。

    该方法返回值是一个 Timer ID,这个 ID 编号指向对当前周期函数的执行引用,利用该值对计时器进行访问,如果把这个值传递给 clearTimeout() 方法,则会强制取消周期性执行的代码。

    如果 setInterval() 方法的第 1 个参数是一个函数,则 setInterval() 方法可以接收任意多个参数,这些参数将作为该函数的参数使用。格式如下:

    var o = setInterval(functioin, interval[,arg1, arg2, ... argn])

    示例5

    针对示例 4 可以按以下方法进行设计。

    var t = document.getElementByTagName("input") [0];

    var i = 1;

    var out = setInterval (f, 1000); //定义周期性执行的函数

    function f () {

    t.value = i ++;

    if (i > 10) { //如果重复执行10次

    clearTimeout (out); //则清除周期性调用函数

    console.log("10秒钟已到");

    }

    }

    setTimeout() 方法主要用来延迟代码执行,而 setInterval() 方法主要实现周期性执行代码。它们都可以设计周期性动作,其中 setTimeout() 方法适合不定时执行某个动作,而 setInterval() 方法适合定时执行某个动作。

    setTimeout() 方法不会每隔固定时间就执行一次动作,它受 JavaScript 任务队列的影响,只有前面没有任务时,才会按时延迟执行动作。而 setInterval() 方法不受任务队列的限制,它只是简单的每隔一定的时间就重复执行一次动作,如果前面任务还没有执行完毕,setInterval()  可能会插队按时执行动作。

    使用框架集

    HTML 允许使用 frameset 和 frame 标签创建框架集页面。另外,在文档中可以使用 iframe 标签创建浮动框架。这两种类型的框架性质是相同的。

    示例1

    下面是一个框架集文档,共包含了 4 个框架,设置第 1 个框架装载文档名为 lef,htm,第 2 个框架装载文档名为 middle.htm,第 3 个框架装载了文档名为 right.htm,第 4 个框架装载文档名为 bottom.htm。

    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd>

    框架集

    以上代码创建了一个框架集,其中前三个框架居上,后一个框架居下。

    每个框架都有一个 window 对象,使用 frames 可以访问每个 window 对象。frames 是一个数据集合,存储客户端浏览器中所有 window 对象,下标值从 0 开始,访问顺序为从左到右、从上到下。例如,top.window.frames[0]、parent.frames[0] 表示第一个框架的 window 对象。

    使用 frame 标签的 name,可以以关联数组的形式访问每个 window 对象。例如,top.window.frames["left"] 表示第一个框架的 window 对象。

    框架之间可以通过 window 相关属性进行引用,详细说明如下表所示。

    window 对象属性

    属性

    说明

    top

    如果当前窗口是框架,它就是对包含这个框架的顶级窗口的 window 对象的引用。注意,对于嵌套在其他框架中的框架,top 未必等于 parent

    parent

    如果当前的窗口是框架,它就是对窗口中包含这个框架的父级框架引用

    window

    自引用,是对当前 window 对象的引用,与 self 属性同义

    self

    自引用,是对当前 window 对象的引用,与 window 属性同义

    frames[]

    window 对象集合,代表窗口中的各个框架(如果存在)

    name

    窗口的名称。可被 HTML 标签 的 target 属性使用

    opener

    对打开当前窗口的 window 对象的引用

    示例2

    针对示例 1,下面代码可以访问当前窗口中的第 3 个框架。

    window.onload = function () {

    document.body.onclick = f;

    }

    var f = function () { //改变第三个框架文档的背景色为红色

    parent.frames[2].document.body.style.backgroundColor = "red";

    }

    示例3

    针对示例 1,在 left.htm 文档中定义一个函数。

    function left () {

    alert ("left.htm");

    }

    然后,就可以在第 2 个框架的 middle.htm 文档中调用该函数。

    window.onload = function () {

    document.body.onclick = f;

    }

    var f = function () {

    parent.frames[0].left(); //调用第一个框架中的函数left()

    }

    控制窗口大小和位置

    window 对象定义了 3 组方法分别用来调整窗口位置、大小和滚动条的偏移位置:moveTo() 和 moveBy()、resizeTo() 和 resizeBy()、scrollTo() 和 scrollBy()。

    这些方法都包含两个参数,分别表示 x 轴偏移值和 y 轴偏移值。包含 To 字符串的方法都是绝对的,也就是 x 和 y 是绝对位置、大小或滚动偏移;包含 By 字符串的方法都是相对的,也就是它们在窗口的当前位置、大小或滚动偏移上增加所指定的参数 x 和 y 的值。

    方法 moveTo() 可以将窗口的左上角移动到指定的坐标,方法 moveBy() 可以将窗口上移、下移或左移、右移指定数量的像素。方法 resizeTo() 和 resizeBy() 可以按照绝对数量和相对数量调整窗口的大小。

    示例

    下面示例能够将当前浏览器窗口的大小重新设置为 200 像素宽、200 像素高,然后生成一个任意数字来随机定位窗口在屏幕中的显示位置。

    window.onload = function () {

    timer = window.setInterval("jump()", 1000);

    }

    function jump () {

    window.resizeTo (200, 200);

    x = Math.ceil (Math.random() * 1024);

    y = Math.ceil (Math.random() * 760);

    window.moveTo(x, y);

    }

    window 对象还定义了 focus() 和 blur() 方法,用来控制窗口的显示焦点。调用 focus() 方法会请求系统将键盘焦点赋予窗口,调用 blur() 方法则会放弃键盘焦点。

    展开全文
  • showModalDialog,测试中,IE,Firefox中正常运行,但是google中,点击后没什么反应,网上看了一下,谷歌浏览器不支持showModalDialog模态对话框和无法返回returnValue,得到了一个解决办法 [removed] //...
  • 我们经常能科幻影片里能看到各种机器人与人类同台出演,与人类自由的沟通交流,甚至比人类更加聪明。大家肯定想知道这样的人造机器是如何做到的,我们现在真的能造出这样的机器人吗?开玩笑,我这绝不可能...Window
  • 浏览器对象模型 (BOM) 使 JavaScript 有能力与浏览器”对话”。 浏览器对象模型 (BOM) 浏览器对象模型(Browser Object Model (BOM))尚无正式标准。 由于现代浏览器已经(几乎)实现了 JavaScript 交互性方面的...
  • 对话文本摘要概述

    2021-11-30 23:09:56
    本篇文章会探究对话文本的特点和对话摘要的实现,基于三个不同的对话场景(会议、医患沟通、客服对话),分别介绍一篇有代表性的近期顶会paper,并最后总结不同对话文本特点对应的解决方案。 引言 当前,对文本...

    文本摘要是NLP领域一个重要的任务,它以凝练的语句去描述原始文本中的主要信息。文本的形式是多种多样的,其中,对话文本是人们在不同交流场景下产生的交互式文本。提取对话中的主要信息,在实际应用中可以减少人理解的时间,也可以更好地辅助后续可能的任务。

    本篇文章会探究对话文本的特点和对话摘要的实现,基于三个不同的对话场景(会议、医患沟通、客服对话),分别介绍一篇有代表性的近期顶会paper,并在最后总结不同对话文本特点对应的解决方案。

    引言

    当前,对文本摘要的研究主要集中在新闻领域,而从广泛的对话文本(包括会议、访谈、辩论、医患沟通、客服对话和日常聊天等)中提取关键信息,也有着重要的价值和应用场景。但直接把新闻摘要的模型和方法移植到对话文本上,并不能获得期望的效果,因为对话文本有着它不一样的特点:

    1、角色交互:对话文本是有两个或多个角色参与的交互式文本,每个角色差异较大,有着各自的观点和态度;

    2、文本超长:对话文本很长,一般都比新闻文本要长;

    3、话题跳转:对话过程中,经常会有话题的跳转;

    4、数据匮乏:相比新闻摘要数据集,公开的对话摘要数据集太少。

    以上是对话文本的特点,其实也是对话摘要方案要解决的难点。不同对话场景下的侧重点不一样,下面会在会议、客服和医患场景下,介绍对应论文如何去解决该场景下的难点问题。

    会议场景

    会议场景下的对话摘要,其实就是会议纪要,让参会者和未参会者都可以快速回顾和了解会议的主要内容。

    会议文本,一般都很长很长,角色众多且不固定,又因为会议的私密性,公开数据集很少。下面这篇 EMNLP2020 的文章 [1] ,在一个模型中,通过针对性的设计来尝试解决这些问题。

    在这里插入图片描述

    这篇文章提出了一个 Hierarchical Meeting summarization Network (HMNet) 模型,它的模型结构图如下:

    在这里插入图片描述

    HMNet 是一个 Hierarchical Transformer,能够融合整个对话文本和角色信息,端到端地生成会议摘要。

    它包括两个 Encoder,一个是 Word-level Encoder,输入是一轮对话,指某一个角色连续说的话,并会在最前面加上一个 [BOS] 开始标志位,其在最后一层的输出作为本轮对话的语义向量,这一点和BERT一样;另一个是 Turn-level Encoder,它的输入是每轮对话的语义向量,也就是上一个 Encoder [BOS] 位向量,并会在后面concat上这轮对话说话者的角色向量。

    不同于一般的 Transformer Decoder, 在 HMNet Decoder 中,每一个 Block 块会有两个 Cross-Attention 层,先对 Word-level 信息做 Attention,再对 Turn-level 信息做 Attention,以此去融合整个对话的信息。

    针对角色交互问题,HMNet 对每一个会议参与者都设计了一个角色向量(role vector),如产品经理和开发人员… 让模型去感知不同角色的差异,文中的消融实验也验证了,角色向量的增加对摘要生成效果,有着不错的提升。

    针对文本超长问题,HMNet 对文本进行层次化的理解,先表征每轮对话,再理解整通对话,不需要做截断,也不会因为 Attention O(n^2) 的复杂度而要求过高的内存资源。但因为不同轮次之间没有token级别的 Attention ,token表示上会不及完全的 Attention 。

    HMNet 所有参数都是随机初始化,并完全从0开始训练的,因此对训练数据量有着较大的要求,而公开的会议数据集并不多。论文通过将公开的新闻摘要数据构造成对话文本的形式,对 HMNet 进行预训练,再在会议数据集上微调的方式,解决数据匮乏的问题。

    具体构造方式是 concat M篇新闻文章变成一个 M人的会议文本,每篇文章中的每句话,作为当前角色的一轮,并将M篇文章的每轮随机地交织在一起,模拟对话的交互结构,同时,将每篇文章的摘要合在一起作为最终的对话摘要。虽然这样得到的文本不是真正的对话,但让模型去学会摘要任务,去感知角色信息,能给后面基于会议数据的微调起到不错的预热效果。

    HMNet 在一个模型中,采用层次结构、角色向量和跨领域预训练的设计,针对性地解决了会议对话文本的多个难点问题。

    客服场景

    客服场景,一般是用户和客服两个人的对话,去解决一个或多个问题,会涉及话题的跳转,还有很多无意义的口水句,客服对话摘要则需要去捕捉每一个话题的核心内容。

    下面这篇 AAAI2021 的文章 [2],从名字也可以看出来,主要是去解决客服对话过程中话题跳转的问题。

    在这里插入图片描述

    论文引入了神经主题模型去捕捉对话中的主题信息,如下图(a)所示,基础的神经主题模型本质是一个无监督的变分自编码器,通过重构输入,获取中间的隐层向量作为主题向量,更多细节可以参考:基于深度学习的主题模型研究 [5]。

    在这里插入图片描述

    论文则改进了神经主题模型,如上图(b)所示,使其能区分有价值主题和无意义主题。上面那条通路是去重构参考摘要中的词 s,对应有价值主题;下面的通路是去重构对话内容中除开参考摘要的词 d-s,对应无意义主题。这也使得改进后的神经主题模型变成了一个有监督的学习过程。

    同时,论文将改进的神经主题模型分别应用到客服对话,用户对话和完整对话,用不同的主题向量去表征不同角色的主题信息,并 concat 到一起去辅助抽取(utterance extractor)和生成(abstractive refiner)两阶段的对话摘要模型。

    在这里插入图片描述

    上图中间部分的 Topic-Informed Attention Mechanism 是融合了主题信息的 Cross Attention,通过类似 Pointer Network 的方式让模型学到对 query-based attention 和 topic-guided attention 的自动选择,前者的 Q 是来自 Decoder 的输入,后者的 Q 是来自 Topic Model 的主题向量,改造后的 Cross Attention 会替换原始 Transformer Decoder 中的 Cross Attention。

    为了让模型感知角色交互信息,抽取阶段会在对话的每一句前面加上一个角色 token ,去表示这句话的说话者。为了让两阶段模型能够联合训练,使用了策略梯度的方法,这样第一阶段的抽取就不需要标注,但也会增加模型训练的难度。

    神经主题模型的加入,对于往往包含多个主题的客服对话摘要有很好的加成作用,让模型能够感知主题的跳转,识别无意义的话术,并捕捉每一个主题的核心内容。

    医患场景

    医患场景下的对话摘要,和上面的会议与客服场景有一些差异,它不是去得到一个归纳性的摘要,而是有确定性的诉求,比如摘要中需要包括:用户的病情,医生的诊断等。

    实际上与 query-based summarization 有点类似,只不过医患场景下的 query 并不是多种多样的,而是确定性的诉求。下面这篇 ACL2021 的论文 [3] 就是用模块化的摘要技术去生成医患对话的不同诉求摘要。

    在这里插入图片描述

    医患对话摘要包括四个部分,SOAP:(Subjective information ) 患者报告的主观信息; (Objective observations) 客观观察,例如实验室结果; (Assessments) 医生的评估和诊断; (Plan) 未来的治疗计划,包括诊断测试、药物治疗。而且,这四部分还会被再细分为15个 subsection,但这个在论文中没有具体描述。

    论文中的医患对话参考摘要,是SOAP四个部分的 concat,并且摘要中的每个句子都在对话中标注了它的支撑句,也就是这个句子的归纳来源。而基于如此的数据集结构,论文把医患对话摘要任务分解成了先抽取后生成两个子任务,并实验了四种对话摘要方案,按照对生成模型的依赖排序如下:

    CONV2NOTE:没有抽取阶段,直接端到端地从对话生成摘要。

    EXT2NOTE:抽取模块会预测出所有的关键句,但不区分关键句对应哪一个诉求,生成模块基于抽取出的关键句产生完整摘要。

    EXT2SEC:抽取模块在预测关键句的同时,会分类到具体的诉求,生成模块再用这部分关键句去生成对应诉求的摘要,有几个摘要诉求,生成模块就对应生成几次。

    CLUSTER2SENT:在EXT2SEC抽取模块基础上,还会对每个类别下的关键句再进行聚类分割,用聚类得到的每个片段,去生成摘要中的一句话。

    下图就是使用 CLUSTER2SENT 生成的一个医患对话摘要示例:

    在这里插入图片描述

    图中第二列的紫色框被抽取模块分类为一个子诉求片段,第三列它又被聚类分割为了两个子片段,每个片段对应生成摘要中的一句话。

    这篇论文没有提出新颖的模型,都是选用现有的模型去实现它描述的四种对话摘要方案。这四种对话摘要方案实际上可以看作是对现有非纯抽取式摘要方法的一个归类总结:

    CONV2NOTE是纯生成式;EXT2NOTE可以看作是过滤了无意义句之后的生成式;EXT2SEC是在抽取关键句的同时,还对关键句做了分类,像一个序列标注任务,只不过标注的对象不是token,而是sentence;CLUSTER2SENT则是EXT2SEC的更精细化版本。

    可以看出,四种方案的抽取模块越来越精细,论文实验也验证了效果的逐步提升。相比生成,抽取是更简单,更可控,也更有解释性的模块。当抽取做的越好时,对生成的依赖就会越小,但这对标注的要求也会越高。

    总结

    相比于新闻文本,对话文本有着角色交互、文本超长、话题跳转、数据匮乏等特点,在不同的对话场景下,对话摘要方案的侧重点可能不一样,但都会对上述(部分)对话摘要特点去做针对性的设计,下面尝试做一个简单的总结:

    角色交互:在对话摘要任务中,让模型去感知角色信息,分辨不同角色的内容,是一个很重要也很必要的设计。

    • 一般原始对话文本中,就包含 “xx:” 这样的角色标识,如果加到模型的输入中,实则是对角色的一个软编码,不过有可能会在一定程度上影响句子的连贯性。而像上面客服场景介绍的论文,在每句话前面加上自定义角色token,和 “xx:” 这样的角色标识其实是基本相同的效果。

    • 对每个角色设计对应角色向量,如上面会议场景介绍论文一样,或在BERT中,使用 Segment Embedding 作为角色向量,都是一种硬编码方式,不影响句子连贯性,但对角色的扩展性较差,适用于确定性角色场景,如客服场景。

    文本超长:对话文本一般很长,其中也有较多无意义的话,如果把整通对话一次性输入模型,对硬件资源和模型能力都是一个考验。

    常见的解决方案包括:规则方案,两阶段方案,两层次方案,长输入模型方案

    • 规则方案可以通过正则、常见口语表述等人工规则去掉对话中的无意义话术,一般做为预处理层,无法完全解决文本超长的问题。
    • 两阶段方案一般将任务分为抽取和生成两阶段,抽取模块提取关键句,去除无意义句,然后交由生成模块,抽取模块完成的越精细,生成模块的负担就会越小。
    • 两层次方案是将长文本做层次化分解,可分为word-level, sentence-level, turn-level 和 section-level 等,让模型先做层次化理解,再做融合或直接取最上层的表征用于后续模块。
    • 长输入模型方案是采用能接受长输入的模型,如将 self attention 改造成 sliding window attention + global attention 的 Longformer,能接受长达 16K tokens 长度的输入。
    • 在来自 EMNLP2021 的文章 [4] 中,基于长文本对话摘要数据集,对上述后三个方案做了实验对比,表明两阶段方案有最好的效果。

    话题跳转:这是对话类数据一个比较显著的特点,而摘要一般需要去捕捉每一个主题的核心内容。

    • 融合主题模型,可以较好的感知主题的跳转,但对整个摘要模型的训练和复杂度会是一个不小的负担。

    • 通过两阶段的方式,让抽取模块对文本进行分类和切割,可以在一定程度上将不同主题内容分割开,但一般需要对应数据上的标注。

    数据匮乏:因为对话文本的私密性,开源的数据很少,在一定程度上限制了对话摘要技术的发展。

    • 尽量避免模型从0开始训练,充分利用预训练模型,也可以利用相似领域的数据进行 post training。

    • 跨域数据的构造,公开的新闻摘要数据集很多,改造使其匹配对话文本并用于预训练,会是一个不错的模型预热方式。

    对话摘要,是文本摘要的一个子方向,在近几年受到了越来越广泛的关注,在各大顶会中也有了不少相关的paper,本文是对对话摘要的一个简单概述,希望能给大家带来一点启发和帮助。

    其实,哈工大 SCIR 实验室已经有过对话摘要相关的概述分享 [6],它是大而全的,能让你看到对话摘要的过去、现在和未来。而本文是从技术实现的角度,在三个典型对话场景中,各选择了一篇有代表性的论文,介绍了其基于对话文本不同特点做的针对性的解决方案,并做了对应的方案总结。两篇概述分享并不重复,会是一个互补的形式,共同食用效果更佳。

    参考

    [1] EMNLP2020: A Hierarchical Network for Abstractive Meeting Summarization with Cross-Domain Pretraining

    GitHub:https://github.com/microsoft/HMNet

    arXiv:https://arxiv.org/abs/2004.02016

    [2] AAAI2021:Topic-Oriented Spoken Dialogue Summarization for Customer Service with Saliency-Aware Topic Modeling

    Github:https://github.com/RowitZou/topic-dialog-summ

    arXiv:https://arxiv.org/abs/2012.07311

    [3] ACL2021:Generating SOAP Notes from Doctor-Patient Conversations Using Modular Summarization Techniques

    GitHub:https://github.com/acmi-lab/modular-summarization

    arXiv:https://arxiv.org/abs/2005.01795

    [4] EMNLP2021: An Exploratory Study on Long Dialogue Summarization: What Works and What’s Next

    arXiv:https://arxiv.org/abs/2109.04609

    [5] 基于深度学习的主题模型研究:http://cjc.ict.ac.cn/online/onlinepaper/hjj-2020514180351.pdf

    [6] 赛尔笔记| 对话摘要简述:https://zhuanlan.zhihu.com/p/380959946

    展开全文
  • Window对象之对话

    2015-05-01 19:51:34
    1.分为警告对话框(使用alert打开)和询问回答对话框(使用confirm打开)和提示对话框(使用prompt打开)。代码如下: window.alert("打开一个警告对话框");...该对话框进行处理之前,不能对当前页面
    1.分为警告对话框(使用alert打开)和询问回答对话框(使用confirm打开)和提示对话框(使用prompt打开)。代码如下:
    window.alert("打开一个警告对话框");
    window.confirm("打开一个询问回答对话框");
    window.prompt("打开一个提示对话框");

    2.注意:警告对话框时由当前运行的页面弹出的。在该对话框进行处理之前,不能对当前页面进行操作,并且后面的代码也不会执行。只有将警告对话框进行处理后(单击确定或者关闭对话框),才可以对当前页面进行操作,后面的代码才能执行。

    3.提示对话框中有一个输入框,当用户输入内容后,点击确定按钮,则会返回用户输入的内容。当点击取消时,返回null。代码例子如下:
    Window对象之对话框

    展开全文
  • 浏览器对象模型 (BOM) 使 JavaScript 有能力与浏览器”对话”。 浏览器对象模型 (BOM) 浏览器对象模型(Browser Object Model (BOM))尚无正式标准。 由于现代浏览器已经(几乎)实现了 JavaScript 交互性方面的...
  • 打造一个window桌面应用:在线聊天对话机器人

    千次阅读 多人点赞 2021-07-21 20:51:19
    本文目标:打造一个window桌面应用:在线聊天对话机器人。 今天辰哥教大家做一个在线聊天对话机器人桌面应用,已经打包成exe可执行文件,读者可以直接拿来使用, 先上演示图 聊天客户端桌面应用 设计Ui:Pyqt5 ...
  • 一个只显示文件夹信息的C++对话框类,只是类文件,设计对话框的使用可以用的到,暂时没有调用示例。 运行环境:Windows/Visual C/C++
  • window对象,对话框

    2020-03-25 13:34:50
    JavaScript中,一个浏览器窗口就是一个window对象。 简单来说,JavaScript会把一个窗口看成一个对象,这样我们就可以用这个对象的属性和方法来操作这个窗口。实际上,当我们每次打开一个页面时,浏览器会自动为这...
  • go使用walk创建window界面,与ai对话

    千次阅读 2019-07-29 17:43:16
    前面我们学过搭建ai服务器:... 下面,我们在window系统中,使用walk创建一个window界面,与ai对话 walk github :https://github.com/lxn/walk 需要用到的第三方包有: go get github.com/gin-gonic/gin...
  • 浏览器页面初始化时,会内存创建一个全局对象,用来描述当前窗口的属性和状态,这个全局对象被称为浏览器对象模型。 (不同于DOM的标准化组织是W3C,JavaScript的语法标准化组织是ECMA,BOM没有官方标准,它最初...
  • Window对象是客户端JavaScript最高层对象之一,由于window对象是其它大部分对象的共同祖先,调用window对象的方法和属性时,可以省略window对象的引用。例如: window.document.write() 可以简写成: document....
  • WindowWindow Manager的创建加载 ViewRootImpl的创建以及视图真正加载 ViewRootImpl的事件分发 一定要主线程才可以更新UI吗?为什么? Activity的Token和Dialog的关系 Toast机制 总结 handleLaunchActivity、...
  • JavaScript Window窗口对象

    千次阅读 多人点赞 2020-01-18 11:49:05
    文章目录一、Window对象概述1、Window对象属性2、Window对象方法3、如何使用二、对话框1、警告对话框2、确认对话框3、提示对话框三、打开与关闭窗口1、打开窗口2、关闭窗口(1)关闭当前窗口(2)关闭子窗口四、控制...
  • window ELectron开发实战

    千次阅读 2019-02-13 09:57:10
    如果要卸载这个应用,可以利用Windows “程序和功能”的对话窗口来卸载,这样确保添加开始菜单和桌面的快捷方式得以移除。 更新   现在用户可以使用你的安装程序来安装文件了,有了Squirrel 会让更新...
  • 文章目录一、问题背景:`window.print()页面打印出现页面无响应`二、问题原因:可能操作了document但是并未进行销毁(可能是)三、问题解决:总结: 一、问题背景:window.print()页面打印出现页面无响应 看了网上...
  • Android 悬浮窗 System Alert Window

    千次阅读 2022-01-06 10:32:32
    视频播放,视频对话可能会采用悬浮窗功能(例如手Q,微信的视频通话)。应用留下一个视频(通话)窗口,用户可以返回安卓桌面,或者去其他app的界面操作。 前面我们探讨了悬浮activity的实现方式,并结合CameraX预览...
  • 增加提示对话框类:net.lanelife.framework.cw.Prompt,使用方法与mx.controls.Alert基本一致; 10.Window类增加windowOpened、windowClosed事件; 11.修改任务栏按钮为活动状态时的背景渐变色; 12.加入按钮外观...
  • 主要使用用户登录的时候,结合 cookie 可以让用户您的网站...生成公钥 // window电脑不支持 openssl 代码,使用 git 提供的控制台书写即可 - openssl rsa -in private.key -pubout -outform PEM -out public.key
  • Hwnd = Plugin.Window.Foreground Plugin.Window.Move Hwnd,0,0 MoveTo 179, 97 RightClick 1 Delay 300 FindPic 0,0,1024,768,"Attachment:\删除聊天.bmp",0.9,intX,intY If intX > 0 And intY > 0 Then ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,669
精华内容 9,067
关键字:

在window的对话