如何用正则实体匹配单词部分内容?Dialogflow提取门牌号遇阻
搞定Dialogflow里荷兰地址门牌号提取的两个坑
嘿,我来帮你拆解这两个头疼的问题,结合Dialogflow的实际限制给你可行的解决方案:
1. 只提取门牌号数字的正则调整
你原来的正则(?:re\Bstraat)\s\d+有两处可以优化的地方:
- 里面的
re是多余的,应该直接用\Bstraat来匹配单词内部的“straat”(比如kerkstraat末尾的那部分) - 非捕获组
(?:...)的用法是对的,但这个正则匹配的是straat + 数字整个片段,所以最终提取的是整个字符串,不是你要的数字本身
你一开始想的环视语法(?<=\Bstraat\s)(\d+)确实是精准抓数字的完美方案,但Dialogflow确实不支持环视断言。如果没有fulfillment的话,确实没法直接只提取数字——因为Dialogflow的正则实体只能返回整个匹配到的字符串,没法单独抽捕获组里的内容。这种情况下,你只能先匹配\Bstraat\s\d+,之后在fulfillment代码里把前面的straat 截掉,只留数字。
要是暂时没法做fulfillment,退而求其次的正则可以写成:
\Bstraat\s\d+
它能匹配straat 78、straat 65这类片段,之后你在业务逻辑里处理掉前缀就行。
2. Dialogflow训练短语的整词标注限制
Dialogflow手动标注实体时,确实会强制选中整词,这就导致你没法单独选Wilhelminastraat 65里的straat 65部分,一选就会把整个Wilhelminastraat也带上。
解决这个问题的思路:
- 放弃手动标注,靠正则实体自动匹配:只要你创建了基于上面正则的实体,Dialogflow会自动在训练短语里识别符合模式的片段,根本不用手动选。
- 如果非得手动标,你可以试试把地址拆成多个token,比如在训练短语里写成
Wilhelminastraat 65(加两个空格),但这有点hack,还是推荐用正则实体自动识别的方案更靠谱。
总结下:没fulfillment的话,只能先抓带straat的片段再处理数字;同时用正则实体自动识别代替手动标注,避开整词限制的坑。
内容的提问来源于stack exchange,提问作者Renate van der Bent
相关产品推荐
相关产品推荐

