以下是视频内容文字版:
大家好,今天这节课要给大家介绍的是 weight 和匹配结果的关系。我会从以下这三个部分来讲解:
一、weight 的概念
二、weight 的计算规则
三、单个模块匹配结果的优先级规则
一、weight 的概念
在匹配一条语料时,系统会衡量 grammar 的 weight,也就是所谓的权重,然后输出 weight 值最高的 grammar 匹配结果。
二、weight 的计算规则
Weight 的计算规则是:每一条 grammar 匹配上语料的一个字符就记5分,中英文都一样,如果这个字符是被 ext 类型的 slot(它是指 slot 的内容是无限的)、any 规则(可以匹配任意字符串)或者 skipper 规则(可以忽略语料里的一些特殊符号,一般是标点符号)匹配上的,那么不记分。
在日常使用里 any 规则和 skipper 规则使用比较少,重点了解 ext 类型的 slot。
来看个例子:
语料:我要看周星驰的电影 <grammar1>:我要看<actor>的电影 <actor.ext(1|1024)> |
在这条 grammar 里 actor 是一个 ext 类型的 slot,按照规则,它所对应的字符“周星驰”这三个字就不计分,那么最后这一条 grammar 能够匹配上的字符有六个, weight 就是30。
三、单个模块中匹配结果的优先级规则
接下来介绍在同一个模块里,根据 weight 怎么来判断 grammar 的匹配结果。
它的规则是:同一模块中,会输出 weight 最高的 grammar 匹配结果。
通过例子来说明:
<grammar1>:<open><device><{@=启动}>
<grammar2>:<open><object> |
Rule:<open>:打开|开启|开|开下 <device>:电视|冰箱|灯 Slot: <设备.ext(1|1024)> |
在这里,grammar1 里的 modifier 只是为了方便我们之后查看,对于权重并没有影响,所以不用太在意。经过观察,可以发现它们都能匹配上语料:“打开电视”,按照上面介绍的规则,来计算它们各自的 weight 。
<grammar1>:<open><device> //打开电视 10+10=20 <grammar2>:<open><object> //打开电视 10+0=10 |
那么,根据权重最高的输出原则,可以知道匹配上语料的是 grammar1 。
小结一下:
在写语法的大部分情况下并不需要特别去关心权重是多少,只需要了解当语料匹配几个 grammar 时优先级是怎么判断和计算的就可以了。
不过还要注意一点,如果一条语料同时匹配上了几条 grammar,系统还会根据一定的原则来选择最佳的输出结果。所以为了方便操作,最好按照一条语料只匹配一条 grammar 的原则来设计 grammar 。
以上这些就是这节课的全部内容,如有疑问,欧拉蜜开放平台的在线文档也提供了相应的文字说明可以供阅读浏览。这节课就到这里,我们下节课再见。