如何在Bot Framework Composer v2.1.2中实现字符串转整数
Bot Framework Composer(v2.1.2)自然语言数词转整数实现方案
问题核心原因
转换失败和内置转换功能缺失无关:
- Composer内置Convert分类下的所有功能、原生
int()方法,仅支持阿拉伯数字格式的字符串(比如"2")转整数,不支持英文拼写格式的数词(比如"Two")直接做类型转换,直接对拼写数词调用int()必然返回Null。 - LUIS预构建数字实体默认返回的
text字段是识别到的原始文本(也就是字符串格式的"Two"),但实体本身自带预解析的数值结果,不需要额外做字符串转换。
可直接落地的实现方法
- 方法1:直接读取LUIS实体的预解析结果,零额外转换代码
识别到数字实体后,不要取实体的原始文本字段,直接读取解析值字段即可拿到整数类型结果,取值表达式为:
这个字段是LUIS识别时自动生成的结构化结果,不管原始文本是阿拉伯数字@turn.recognized.entities.number[0].resolution.value"2"还是拼写数词"Two",都会返回对应的整数2,不需要额外做拆分、转换操作。注意:如果识别到的是序数词、分数等其他数字类型,resolution下也会返回对应格式的标准数值,直接取用即可。
- 方法2:自定义数词映射逻辑,适配已经拆分拿到数词文本的场景
如果你已经通过拆分数组拿到了"Two"这类数词字符串,可以通过自定义映射完成转换:- 针对业务需要的数字范围,在Composer自定义函数中添加数词到整数的映射表,参考示例:
const wordToNumMap = { "one": 1, "two": 2, "three": 3, "four": 4, "five": 5, "six": 6, "seven": 7, "eight": 8, "nine": 9, "ten": 10 // 可按需补充几十、上百等更大数值的映射 } - 调用时先把捕获到的数词字符串统一转为小写,再查映射表即可拿到整数,调用表达式示例:
wordToNumMap[toLower(capturedNumberWord)] - 如果需要支持复杂组合数词(比如twenty three、one hundred and five这类),可以直接在Composer的自定义运行时中引入
words-to-numbers开源工具包,调用内置方法即可完成全场景转换,不需要手动维护全量映射表。
- 针对业务需要的数字范围,在Composer自定义函数中添加数词到整数的映射表,参考示例:
补充说明
Composer内置的类型转换工具仅处理标准格式数据的类型强转,不具备自然语言语义解析能力,所以你在Convert分类下找不到数词转数字的选项是正常设计,这类语义解析逻辑要么依赖上游认知服务(LUIS)的预解析结果,要么通过自定义逻辑实现。
内容的提问来源于stack exchange,提问作者GoonerJon
相关产品推荐
相关产品推荐

