如何从Google DialogFlow ES API获取实体检测位置信息
DialogFlow ES 获取实体在输入文本中位置的实现方法
DialogFlow ES 正式版v2的Detect Intent API默认不会在响应里直接返回识别到的实体在原始输入中的起止偏移,针对做数独解题机器人需要判断实体语义顺序的需求,有两个可直接落地的方案:
方案1:通过v2beta1版本API的调试字段获取偏移
调用v2beta1版本的detectIntent接口时,无需额外传特殊配置参数,返回结果里queryResult.diagnosticInfo字段会带完整的分词、实体匹配明细,每个匹配到的实体都对应startIndex和endIndex偏移值。要注意这个偏移是按UTF-16编码计算的,处理中文输入时要做好编码转换,不然会出现索引错位。这个字段虽然没写在正式公开文档里,但已经稳定运行多年,很多生产环境的项目都在拿这个字段做位置相关的逻辑,不会随便改结构。方案2:基于提取结果做约束性位置匹配(更适配数独查询场景)
数独查询场景下单轮用户输入最多只会提取三类不会重复的实体:行标识(包括“第一行”“倒数第二行”“第5行”这类序数、倒数表述)、列标识、待校验的数值。完全可以正常用DialogFlow做完实体提取后,直接在原始输入文本里检索每个实体对应原始文本片段的位置,按索引先后排序就能判断语序:- 行、列实体哪个索引更靠前,就是哪种优先的表述逻辑
- 数值实体的索引在最前就是句首带数值的问法,在最后就是句尾带数值的问法
这个方案完全不依赖API的非公开字段,对这类固定实体类型的场景来说准确率100%,实现成本也最低。
别为了拿位置丢了DialogFlow的实体识别能力自己写正则硬解析输入,那样对灵活语序、口语化表述的识别率会掉很多,完全没必要。
内容的提问来源于stack exchange,提问作者KineticSquid
相关产品推荐
相关产品推荐

