范德萨发而为
全部博文(392)
分类: 大数据
2014-08-04 14:05:19
这篇主要来基于查询串 “怎么做宫保鸡丁” 来介绍一下pattern_server是如何基于配置的模板文件以及上游(broker)给query的标注信对query进行意图识别的。
输入信息
美食类的模板配置文件在()中有介绍,这里不再重复,下面是broker给 pattern_server的输入接口(common_request)的信息的一部分。entity_terms给出了query中[start,end)范围内的query片段的type_str,这个type_str和用户在模板中配置的一致。
entity_terms {
text: "宫保鸡丁"
start: 6
end: 14
type: 54
type_str: "美食"
find_source: "double_array"
}
匹配算法
目前的配置分为四个层次,即 模板单元,模板,语义片段,入口,对应于模板中的四个层次。
(1)模板单元匹配
第一种为词表,用<>表征,目前的实现方法是把<>中都加载的trie树中,每个<>用个一个unit_id来表征,通过逐字扫描query,查找query在trie中的前缀匹配,对query“怎么做宫保鸡丁”,可以得到 “怎么” “做“ 命中了 下面模板中的 模板单元
<怎么|如何> 以及 <做|炒|炖|煲|烧|煎|炒|烹|炸|涮|溜|弄> 。
<怎么|如何><做|炒|炖|煲|烧|煎|炒|烹|炸|涮|溜|弄><好吃|>
第二种为实体,用()表示,目前的实现方法是从上游的获取entity_terms取得,对于query”怎么做宫保鸡丁“,可以得到 type_str 为”美食“ 的 query片段 ”宫保鸡丁“ 命中了。
第三种为*,用()表示,可以匹配任意字符片段,可以通过[min:2&max:10]来限制*语法匹配的长度,目前的实现方法是穷举 * 所有可能的匹配片段。query ”怎么做宫保鸡丁“不涉及此语法。
(2)模板匹配
模板匹配基于匹配的模板单元信息输出模板的匹配信息,模板的匹配基于穷举的思想,加上一些剪枝。还是以下面的模板为例,该模板包含三个模板单元,那么输入模板单元信息,可以表示成为{ [1](0,4) [1](4,6) [1](-1) } 其中[1|0]表示该模板单元是否亏忽略,1表示可忽略,(0,4)表示该模板单元匹配的位置为[4,6),-1表示没有配置位置,注意包含模板单元信息为 [0](-1)的组合(即 不可忽略,没有匹配)可以剪枝。
<怎么|如何><做|炒|炖|煲|烧|煎|炒|烹|炸|涮|溜|弄><好吃|>
匹配的过程主要考虑到以下几点:
(1)组成模板的有效模板单元的匹配位置需要连续 (有效的模板单元,指的是模板匹配位置中包括该模板单元)
(2)当模板单元可以忽略时,模板单元不一定需要成为有效模板单元,因此对于上面的模板,可以命中query片段 ”怎么做“ ”怎么“ ”做“
当然由于这两点在程序中表达的时候可能碰到其他的情况,比如相邻模板单元匹配位置不连续的时候,如果前面的模板单元都可以忽略,则可以从之前的某个可忽略的模板单元为开始,重新判定。
(三)语义片段匹配
语义片段的匹配主要是模版的匹配,只要语义片段中的有一个模版匹配 ,那表示该语义片段匹配成功,对于query”怎么做宫保鸡丁“ 命中了语义片段 meishi 和 intend_key,
(四)入口匹配
入口匹配需要保证每个语义片段都匹配成功,此外需要保证匹配的语义片段的区间没有重叠(可以不连续),并且需要进行覆盖率计算,由于可以语义片段可能有个多个匹配的模版,因此需要得到entrace_id和 匹配template_id列表的所有组合,而每个template_id对应的PosPair也会有多个,因此需要找到每个template_id的组合对应的所有的 PosPair的组合。这个两个步骤分别通过GenEntranceTemplateList 和 GenCombinationPospairList 两个函数来完成。对于每个入口选择覆盖率最大的组合,取覆盖率最大的入口作为最终结果。 query ”怎么做宫保鸡丁“ 命中入口 {dish}{intend_key} cmd="send" box_id="331682"