什么是模式匹配?
可以自定义模式匹配,以将模式意向和实体组合在一个 PatternMatchingModel
内。 使用此分组,可以访问更高级的实体类型,有助于使意向识别更加精确。
有关支持的区域设置的信息,请参阅此处。
模式与精确的短语
模式匹配程序中提供两种字符串类型:“精确的短语”和“模式”。 了解区别很重要。
确切短语是要匹配的确切字词的字符串。 例如:
“Take me to floor seven”。
模式是包含标记的实体的短语。 实体采用“{}”进行标记,用于定义实体在模式内的位置,“{}”中的文本则引用实体 ID。 在前面的示例中,可能需要在名为“floorName”的实体中提取楼层名称。 为此,需要使用如下所示的模式:
“Take me to floor {floorName}”
PatternMatchingModel 概述
PatternMatchingModel
包含用于引用模型的 ID、PatternMatchingIntent
对象列表和 PatternMatchingEntity
对象列表。
意向匹配模式
PatternMatchingIntent
对象表示将用于评估 IntentRecognizer
中的语音或文本的短语集合。 如果短语匹配,则返回的 IntentRecognitionResult
会包含匹配的 PatternMatchingIntent
的 ID。
模式匹配实体
PatternMatchingEntity
对象表示单个实体引用及其对应属性,这些属性会告知 IntentRecognizer
如何处理它。 所有 PatternMatchingEntity
对象的 ID 都必须在短语中,否则不会匹配。
实体命名限制
包含“:”字符的实体名称会向实体分配角色。
实体类型
任何实体
“Any”实体会匹配槽中显示的任何文本,而不考虑它包含的具体文本内容。 如果使用“Take me to floor {floorName}”模式考虑前面的示例,用户可能会说:
“Take me to the floor parking 2”
在这种情况下,“floorName”实体将匹配“parking 2”。
这些实体是惰性匹配,除非匹配的字词出现在语句的开头或结尾,否则会尝试匹配尽可能少的字词。 考虑以下模式:
“Take me to the floor {floorName1} {floorName2}”
在这种情况下,语句“Take me to the floor parking 2”将匹配并返回 floorName1 =“parking”,floorName2 =“2”。
处理额外捕获的文本可能会很棘手。 可能是因为用户还在继续说话,导致捕获的语句不止包含命令。 “Take me to floor parking 2 yes Janice I heard about that let's”。 在这种情况下,floorName1 是正确的,但 floorName2 则为“2 yes Janice I heard about that let's”。 请务必了解实体的匹配方式,并适当地调整方案。 “Any”实体类型是最基本但最不精准的匹配类型。
列表实体
“List”实体由短语列表组成,该短语列表会指引引擎如何进行匹配。 “列表”实体具有两种模式。 “严格”和“模糊”。
假设提供电梯的楼层列表。 由于我们处理的是语音,因此也会添加使用词汇格式的条目。
"1", "2", "3", "lobby", "ground floor", "one", "two", "three"
在“严格”模式下使用类型 ID 为“List”的实体时,只有当槽中的文本出现在列表中时,引擎才会匹配。
“take me to floor one”将匹配。
“take me to floor 5”将不匹配。
请务必注意,整个意向都不会匹配,而不仅仅是实体。
在“模糊”模式下使用类型 ID 为“List”的实体时,引擎仍会匹配意向,并会返回语句中出现在槽中的文本,即使该文本不在列表中。 此匹配对后台十分有用,有助于增强语音识别效果。
警告
模糊列表实体已实现,但未集成到语音识别部件中。 因此,它们将匹配实体,但不能改进语音识别。
预生成整数实体
如果希望获取该槽中的整数,则使用“PrebuiltInteger”实体。 如果找不到整数,则不会匹配意向。 返回值是数字的字符串表示形式。
有效匹配和返回值的示例
“Two thousand one hundred and fifty-five”->“2155”
“first”->“1”
“a”->“1”
“four oh seven one”->“4071”
如果存在无法识别为数字的文本,则实体和意向将不会匹配。
无效匹配的示例
“the third”
“first floor I think”
“second plus three”
“thirty-three and anyways”
考虑电梯示例。
“Take me to floor {floorName}”
如果“floorName”是预生成整数实体,则槽内的任何文本都应表示整数。 此处楼层号会完全匹配,但具有“lobby”等名称的楼层就不会匹配。
对必需项和可选项进行分组
在模式中,允许包含“可能”在语句中存在的字词或实体。 这对于限定词(如“the”、“a”或“an”)特别有用。 这与硬编码许多组合没有功能上的区别,但可以帮助减少所需的模式数。 使用“[”和“]”指示可选项。 使用“(”和“)”指示必需项。 可以在同一组中包含多个项,方法是使用“|”字符将它们分隔。
若要了解这如何减少所需的模式数,请考虑以下集:
"Take me to {floorName}"
"Take me the {floorName}"
“Take me {floorName}”
“Take me to {floorName} please”
“Take me the {floorName} please”
“Take me {floorName} please”
“Bring me {floorName} please”
“Bring me to {floorName} please”
所有这些都可以缩减为具有分组和可选项的单个模式。 首先,可以将“to”和“the”组合为可选词(如“[to | the]”),其次,也可以使“please”变得可选。 最后,我们可以根据需要对“bring”和“take”进行分组。
“(Bring | Take) me [to | the] {floorName} [please]”
还可以包含可选实体。 假设有多个停车层,并且你要匹配 {floorName} 之前的字词。 可以使用如下所示的模式实现此目标:
"Take me to [{floorType}] {floorName}"
如果可能使用关键字识别和“按下即可发言”功能,则可选项也很有用。 这表示关键字有时存在,有时不存在。 假设关键字是“computer”,则模式将如下所示。
“[Computer] Take me to {floorName}”
注意
虽然使用可选项会很有帮助,但这会增加模式冲突的可能性。 这便是两种模式可能匹配相同口述短语的情况。 如果发生这种情况,有时可以通过将可选项分隔到单独模式中来解决此问题。
实体角色
在模式内,可能在某个方案下要多次使用同一个实体。 请考虑预订从一个城市到另一个城市的航班的场景。 在这种情况下,城市列表是相同的,但需要了解用户的出发城市和目的地城市。 若要实现这一点,可以使用通过“:”分配给实体的角色。
"Book a flight from {city:from} to {city:destination}"
给定类似于这样的模式后,结果中会有两个标记为“city:from”和“city:destination”的实体,但它们都会引用“city”实体以进行匹配。
意向匹配优先级
有时,多个模式可能匹配同一语句。 在这种情况下,引擎会确定模式的优先级,如下所示。
- 精确的短语。
- 更多实体模式。
- 整数实体模式。
- 列表实体模式。
- 任何实体模式。
- 具有更多匹配字节的模式。
- 示例:模式“选择左侧的 {something}”的优先级将高于“选择 {something}”。