# 实体和辅助词

当你在制作技能和问答时,你会发现以下几种情况:

举例

  1. 同一个事物,有不同的说法:
    • 周杰伦: 杰伦、周董、小公举、jay……
    • 空调:冷气、雪柜、空调机、冷气机……
  2. 同一句话,可以取不同的值:
    • 我想听周杰伦的歌
    • 我想听陈奕迅的歌
    • 我想听刘德华的歌
  3. 同样的意思,可以加上不同的词语进行辅助:
    • 帮我打开灯
    • 你可以打开灯吗
    • 帮我打开灯吧

为了更简便地开发技能,你可以使用在用户的常用表达中引用实体或辅助词,以避免写多句语料。

# 实体

用户的语料中,同一类型的名词将会被总结为实体。

示例

明天合肥天气怎么样

后天北京天气怎么样

{time}{city}天气怎么样

time 是时间实体 city 是中国城市实体

实体信息将会在结果 Json 中的 semantic.slots 字段中显示。其中 name 为实体名,value 为用户的表述词,normValue 为规整化以后的值。

{
  "semantic":[
    {
      "intent":"QUERY",
      "slots":[
        {
          "name":"datetime",
          "value":"今天",
          "normValue":"{"datetime":"2018-01-22","suggestDatetime":"2018-01-22"}"
        },
        {
          "name":"location.city",
          "value":"帝都",
          "normValue":"北京市"
        }
      ]
    }
  ],
  "service":"weather",
  "text":"查看帝都今天的天气",
  "answer":{
    "text":""北京今天晴","-10℃ ~ -2","西南风微风""
  },
  "save_history":true
}

# 静态实体

TIP

这里的静态指,此类实体不区分作用域,对所有使用的技能,所有使用的用户生效。静态实体可以通过网页修改。

以天气查询的 App 为例,开发者期望用户的交互方式为:

明天合肥天气怎么样

明天厦门会下雨吗

我们可以把以上两句话抽象为一个自定义技能,其中语料如下:

{time} {localtion} 天气怎么样

{time} {localtion} 会下雨吗

{time}{location}分别包含:

time 实体 location 实体
今天 北京
明天 上海
后天 合肥
周一 厦门
周二 武汉
…… ……

对于静态实体,开发者任意一款 App 添加了静态实体均可生效,生效时间为永久。

# 动态实体

动态实体相比静态实体,区别在于静态实体可作用于所有技能,所有用户;动态实体仅作用于他的生效维度。

动态实体可分为应用级,用户级和自定义。开发者指定动态实体的作用维度后,动态实体仅在对应的应用/用户进行生效,动态实体的通过HTTP接口上传和更新实体词条。

一般来说,动态实体可用于以下场景:用户通讯录,饭店菜单等。

关于动态实体的详细说明,请查看动态实体

# 通配实体

开放实体中包含一种特殊的实体,称之为通配实体,用于配置不能穷举的技能语义槽。

例如在天气中技能中,查看{chinaCity}的天气,chinaCity(中国城市)可以穷举的。

但在搜索技能中,搜索 {something},something 是不可能穷举的。因此在搜索技能时,推荐使用通配实体。

通配实体可以匹配任意的1~99个字符。

TIP

注意:因通配实体的命中率过高,使用通配实体可能会降低其它意图和技能的命中概率,从而造成语义结果与预期不符。因此,在实体可以穷举时,请勿使用通配实体。

# 举例

语料:提醒我 {time} 在 {location} 开会
例句:提醒我下午三点在A1楼1407开会
解析结果如下:

{
  "slots":[
    {
      "name":"time",
      "normValue":{
          "datetime":"T15:00:00",
          "suggestDatetime":"T15:00:00"
      },
      "value":"下午三点"
    },
    {
      "name":"location",
      "normValue":"A1楼1407",
      "value":"A1楼1407"
    }
  ]
}

# 辅助词

为了满足开发者快速编写语料的需求,同时保证语料的可维护性,技能工作室提出了辅助词的概念,不同于实体,辅助词仅用于帮助开发者编写语料,但在最终开发者拿到的结构化数据中不会展现。

在如下语料中:

  • 「帮我」「定一下」从{合肥}到{广州}的「飞机票」
  • 「我要」「买一张」从{合肥}到{广州}的「机票」
  • 「给我」「预约」从{合肥}到{广州}的「航班」

语料的主体结构没有变化,开发者实际关注的信息也只有出发地和目的地,但是用户的表达方式却千变万化,此时我们可以把这句话抽象成:

  • {helpMe}{book}从{startCity}到{endCity}的{ticket}

其中,startCity和endCity为实体,helpMe、book和ticket的为辅助词。这些辅助词包含的内容如下:

helpMe 辅助词 book 辅助词 ticket辅助词
帮我 定一下 飞机票
我要 买一张 机票
给我 预约 航班
我想 购买 客机
我想要 预订 飞机
…… ……

「例句语料」和「模版语料」均支持使用辅助词,推荐使用「例句语料」以保证语料的可读性。同时平台已经帮开发者整理了若干常用的辅助词,开发者可以直接使用。

# 表述必须

「表述必须」指的是,用户在表达这句话的过程中,该槽位必须存在才能被理解。

例如:“「帮我」「定一下」从{合肥}到{广州}的「飞机票」” 在这句话中,「定一下」、{合肥}、{广州}、「飞机票」四个槽位均为表述必须,「帮我」则不是表述必须,因为省略后,“定一下从合肥到广州的飞机票”没有歧义,但是其他四个槽位省略任意一个都会造成语句不通或表述歧义。