非英文故事类聊天机器人NLU无法识别手机号的问题求助
嘿,碰到手机号正则识别失效的问题确实挺挠头的——毕竟其他字段都正常,唯独这个掉链子,肯定很困惑。我来帮你梳理几个大概率的排查方向,都是实际项目里踩过的坑:
1. 先排查正则表达式的YAML转义问题
这是最常见的坑!Rasa的NLU配置用YAML格式,而YAML会把单个反斜杠\当成转义符,所以你的正则里的\d、\w这类元字符必须写成双反斜杠\\d才会被正确解析。
比如你原来的手机号正则如果是1[3-9]\d{9},在YAML里会被错误解析,改成1[3-9]\\d{9}才对。其他字段的正则可能比较简单(比如账号用\d+),碰巧没暴露转义问题,但手机号的正则更复杂,转义错误直接导致匹配失效。
2. 检查正则是否覆盖用户可能的输入格式
用户输入手机号的格式不一定是纯数字,可能带空格(138 1234 5678)、横杠(138-1234-5678)甚至括号((138)12345678)。如果你的正则只匹配纯数字,那这些带分隔符的手机号自然识别不出来。
建议把正则扩展成支持常见格式,比如:
1[3-9]\\d{9}|1[3-9]-\\d{4}-\\d{4}|1[3-9] \\d{4} \\d{4}
3. 确认NLU训练数据的实体标注是否到位
Rasa的实体识别是正则+机器学习结合的,光有正则不够,还需要足够的标注示例。比如在训练数据里要明确标注手机号实体:
nlu: - intent: provide_info examples: | - 我的手机号是[13812345678](mobile_number) - 联系电话是[139-8765-4321](mobile_number) - 手机号:[150 1234 5678](mobile_number)
如果训练数据里没有这类标注,Rasa可能不会把正则匹配到的内容关联到对应的实体上。
4. 检查实体和槽的配置是否一致
- 首先确保Domain的
entities列表里有你定义的手机号实体(比如mobile_number),没加的话Rasa不会识别这个实体。 - 然后看槽的定义:如果你的手机号槽类型设成了
float或int,那手机号作为带前导1的字符串会无法填充,改成text类型就好:
slots: mobile_number: type: text influence_conversation: false
5. 用Rasa工具直接测试NLU识别
打开终端运行rasa shell nlu,输入包含手机号的句子(比如“我的手机号是13812345678”),看看返回的实体结果里有没有mobile_number。
- 如果这里识别不到:问题在NLU的正则或训练数据,按上面几点调整。
- 如果这里能识别到,但对话里返回None:那要检查你的Custom Action是不是正确获取槽值,比如有没有写错实体名(比如实体是
phone,Action里却取mobile_number),或者Action执行时槽还没被填充。
6. 排查实体冲突问题
有没有其他实体的正则和手机号重叠?比如如果有一个number实体的正则是\\d+,它可能会先匹配走手机号的部分数字,导致完整手机号识别失败。这种情况要给手机号实体设置更高的优先级,或者修改其他实体的正则避免冲突。
按照这些步骤排查,应该能解决你的问题~
内容的提问来源于stack exchange,提问作者ahrooran

