以下是视频内容文字版:
大家好,欢迎观看欧拉蜜人工智能开放平台系列教程。今天我们将为大家讲解slot的类型。
一、 slot 简介
1、 OSL 语法描述语言中的slot可理解为语义中的变量,用于传递、提取信息。
例:
语料:我想听周杰伦的歌。 Grammar:我想听<singer>的歌 |
在这条 grammar 中,<singer>是我们定义的一个 slot ,它可以匹配上以上语料,并提取歌手名“周杰伦”。
同样的,这条 grammar 还能够匹配以下语料:
我想听张学友的歌。 我想听王菲的歌。 …… |
这条 slot <singer> 能够提取语料当中歌手名的值,提取了这个重要信息,我们就知道接下来该为用户做些什么,比如播放周杰伦的歌,或播放张学友的歌。
2、 slot 的特性
(1) slot 具有 internal 、number 、float 、datetime 、ext 这5种类型。
(2) 可选择限制 slot 字符长度,即可被接受的最短字符数和最长字符数。
二、 slot 的命名规则
-
slot 名称必须以英文字母、数字、中文字符或下划线 _ 组成,但第一个字符不能是数字。
-
英文字母不区分大小写,但由于语义输出格式为小写,因此建议避免使用大写字母来替 slot 命名。
三、 slot 的类型
1、 internal
internal 类型的 slot 为自定义的字符串集合,通常用于描述可穷举的内容。例如:唐宋八大家,家用电器等。
使用方式:定义一个和 slot 同名的 rule,其所匹配到的词汇会直接赋值给这个 slot 。
例:
Slot: <musictype>,类型internal
Rule: <musictype>:摇滚|民族|流行|嘻哈
Grammar: <grammar>:我喜欢<musictype>音乐
输入语料:我喜欢摇滚音乐 |
在这种情况下,<musictype> 这条 slot 就能够提取到“摇滚”这个音乐类型的值了。
2、 number
number 类型的 slot 能匹配各种整数的说法。
如“负三十五”、“贰佰”、“12345”、“一八五七” 分别提取“-35”、“200”、“12345”、“1857” 。
例:
Slot: <股票代码>,类型number
Grammar: <查股票代码>:<股票代码>是哪只股票的代码
输入语料:八三三零七三是哪只股票的代码 |
这时候,我们的 slot <股票代码>提取到的值即为“833073”。
3、 float
float 类型的 slot 能匹配各种浮点数和分数的说法,也可以匹配上整数。
如“五点八三”、“百分之85”、“20%” 等,分别提取“5.83”,“0.85”,“0.2”。
例:
Slot: <风力大小>,类型float
Grammar: <调节风力>:帮我把风力调到<风力大小>
输入语料:帮我把风力调到百分之十 |
那么,slot <风力大小>提取到的值即为“0.1”。
4、 datetime
datetime 类型的 slot 能匹配各种时间和日期的说法。
具有以下几种子类型:
• timepoint:匹配确切的时间点。 如“三点半”、“昨天下午”、“7月7日” 等。
• duration:匹配时间长度的说法。 如“25分钟”,“3天”,“1年”
• any:匹配任意时间说法。包括timepoint 和 duration 的集合,建议在使用无法确定需要使用的时间类型时使用。 如“每年春节”、“每天8点”等。
(1) timepoint →推荐值(time_recommend)
例:
语料:早上8点提醒我 <提醒我>:<time>[的时候]提醒我 |
在这个例子中,slot <time>提取到的值为“早上8点”,但是“早上”这个概念并不确定。如,用户在7月7日所说的“早上8点”实际指的时间是7月7日早上8点,而7月8日所说的“早上8点”是指7月8日早上8点。)虽然我们提取的信息完全相同(都是“早上8点”),但指代的时间却完全不同,该怎么解决这个问题呢?
欧拉蜜的解决方法是,除了提取描述时间的字符,我们还把这个时间用Json做了更标准化的描述。
对于具体时间点的 slot ,也就是 timepoint 类型的slot,欧拉蜜会给出一个推荐值(time_recommend)。比如说“早上8点”这个值,欧拉蜜会自动将时间补全,默认为当天的早上8点;“中秋节”默认为今年中秋节;“8号”默认为今年当月8号。我们将在Json数组里看到时间对应的具体时间起始点。
“早上8点”的 Json 描述如下:
"slot" : [{ "datetime" : { "data" : { "endtime" : 1490922000000.0, "starttime" : 1490918400000.0 }, "type" : "time_recommend" }, “name” : " time", “ value ” : "今天8点" } ] |
如果今天是2017年7月8日,那么我们无论是输入“早上8点”,“7月8日早上8点”,还是“2017年7月8日早上8点”,我们在 Json 里看到的“endtime”及“starttime”都是一样的。
(2) duration,repeat → 给出语义的描述(time_semantic)
对于表示时间段,如“1小时”、“3天”这类 duration 时间,以及表示重复时间,如“每十天”、“每天6点”这类 repeat 时间,我们没有办法给出具体的时间点,那么 Json 会对这类时间做出一个语义描述。
例1:“三天”。我们将在 Json 中看到“day”:3 。
{ "datetime" : { "data" : { "sub_type" : "duration", "time_struct" : { "Day" : 3 } }, "type" : "time_semantic“ }, "name" : "testtime", "value" : "三天“ } |
例2:“每十天”。我们将在Json中看到具体时间结构(time_struct)。
"slot" : [{ "datetime" : { "data" : { "sub_type" : "repeat", "time_struct" : { "extend_info" : {}, "repeat_rule" : { "IntervalUnit" : "Day", "IntervalValue" : 10 } } }, "type" : "time_semantic" }, "name" : "testtime", "value" : "每十天" } ] |
5、ext
ext 类型的 slot 属于外部类型,其取值范围不是一个有限集合,无法预先定义其可能的内容,或者需要后续应用程序通过特殊方法验证其有效性,也就是一种无法穷举的任意组合。
例:
slot: <name>,类型ext,minlenght:1, maxlength:4
grammar: <call>:打电话给<name>
能够匹配上的语料: 打电话给小明 打电话给亲爱的 打电话给西门吹雪 ……
不会匹配上的语料: “打电话给移动查话费” “打电话给女生聊什么” “打电话给客户的开场白” …… |
由于 ext slot 的内容没有限定,所以能够匹配上的范围很广,为了有效匹配语料,我们一般会对 ext slot 的字符进行限定。上面的例子中,<name>这个 slot 主要用于提取人名,一个中文字为1个字符,那我们设定最小字符为1,最大字符为4,这样就不会匹配上无关语料了。
当然,除了定义字符的长短以外,开发者们还可以根据程序的需要来对提取的语料进行验证。
最后要提到的是,internal 和 external 这两种类型的 slot 可以设置“主类别”和“子类别”,通过这两个类别的设定可以实现上下文的引用功能。具体的上下文引用功能,我们会在后面的课程中专门为大家讲解。
关于 slot 的介绍就到这里了,以上是这节课的全部内容,感谢您的观看。