Skip to content

veasion/syntax-parse

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 

Repository files navigation

syntax-parse

syntax-parse 是一个轻量级语法匹配框架,支持非常复杂的语法嵌套匹配和信息提取。

具体见单元测试案例。

语法介绍

语法名称 语法规则 语法说明 举例
任意数字 [N:a-b] 表示匹配a-b位数字 示例:[N:2-3],[N:0-2] 、[N:2]
通配符 [W:a-b] 表示匹配a-b个任意字符 示例:[W:1-2],[W:0-2],[W:2-3]
通配符否定 [W:a-b^{xxx}] 表示匹配a-b个字符且字符不能包含xxx,
其中xxx支持其他任意语法嵌套
示例:[W:3-5^{不好}]、[W:1-6^{[不|否]}]
通配符包含 [W:a-b~{xxx}] 表示匹配a-b个字符且字符必须包含xxx,
其中xxx支持其他任意语法嵌套
示例:[W:1-2~{好}]、[W:2-3~{[嗯|哦]}]
通配符限定 [W:a-b>{xxx}] 表示匹配a-b个字符且字符必须在xxx中存在,
其中xxx支持其他任意语法嵌套
示例:[W:2-3>{[1|2|3|4|5|6|7|8|9|0]}]
字符串 xxx 表示必须完全匹配xxx字符串 示例:你好
模糊匹配 [~xxx] 表示匹配包含xxx字符串 示例:~好
非必选 [xxx?] 表示匹配文本中 xxx 可有可无,非必选存在,
其中xxx支持其他任意语法嵌套
示例:[你?]、[[你|他|她]?]
[A|B|C] 表示匹配A或者B、C都行,
其中语法支持其他任意语法嵌套
示例:[1|2|3|4|[N:1]]
实体 [@xxx] 表示匹配实体,xxx为实体对象,
如系统内置
@sys_location 地点,@sys_time 时间,@sys_name 姓名,@sys_num 量词
示例:[@sys_name]、[@sys_location]
变量 [#name:xxx] 表示匹配到的xxx提取出一个name变量,
其中xxx支持其他任意语法嵌套
示例:[#age:[N:1-2]]、[#地址:[@sys_location]]

示例一

String dialog = "hi,兄弟。你好,我要买两张从上海前往北京的机票,非常感谢!我要订一张从北京到上海的高铁票啊";
String template = "[W:0-5]" +
    "[[我要|帮我][订|买]]" +
    "[@sys_num]" +
    "从" +
    "[#出发地:[@sys_location]]" +
    "[出发?]" +
    "[到|去|到达|前往]" +
    "[#目的地:[@sys_location]]" +
    "的" +
    "[票|车票|火车票|高铁票|机票|飞机票]" +
    "[W:0-5]";
matchDialog(dialog, template);
匹配结果
---------------------------
模板:[W:0-5][[我要|帮我][订|买]][@sys_num]从[#出发地:[@sys_location]][出发?][到|去|到达|前往][#目的地:[@sys_location]]的[票|车票|火车票|高铁票|机票|飞机票][W:0-5]

匹配:弟。你好,我要买两张从上海前往北京的机票,非常感谢
变量:{出发地=上海, 目的地=北京}

匹配:我要订一张从北京到上海的高铁票啊
变量:{出发地=北京, 目的地=上海}

示例二

// 时间
String template = "[@sys_time]";
String dialog = "公元21年,我今天下午去喝酒,大概要晚上九点才回来,他们是在阴历八月初六举行婚礼,那天正好周六,阳历9月21号,现在北京时间2022年09月3号16点54分1秒,二零二二年九月三号";
matchDialog(dialog, template);
匹配结果
---------------------------
模板:[@sys_time]

匹配:公元21年
匹配:今天下午
匹配:晚上九点
匹配:阴历八月初六
匹配:周六
匹配:阳历9月21号
匹配:2022年09月3号16点54分1秒
匹配:二零二二年九月三号

示例三

// 地标
String template = "[@sys_location]";
String dialog = "我要到上海闵行区茸锦科技园A栋1001室,请问该如何走?" +
    "我们去杭州玩吧?不,我想去深圳或者广州,这有啥好玩的,还不如一起去新疆呢,或者西藏。" +
    "对了,上海有啥玩的,东方明珠塔,中心大厦,世纪公园啥的,都没啥玩的,本地人从来不去。" +
    "你家住哪?我家在浦东新区xxx路101号楼202房间,不对我搬家了,是在302房间。" +
    "中国城市排行榜,北上广深位列前四,广东江苏山东浙江这几个省gdp增速最高";
matchDialog(dialog, template);
匹配结果
---------------------------
模板:[@sys_location]

匹配:上海闵行区茸锦科技园A栋1001室
匹配:杭州
匹配:深圳
匹配:广州
匹配:新疆
匹配:西藏
匹配:上海
匹配:东方明珠塔
匹配:中心大厦
匹配:世纪公园
匹配:浦东新区xxx路101号楼202房间
匹配:302房间
匹配:中国城市
匹配:广东
匹配:江苏
匹配:山东
匹配:浙江

示例四

String template = "我[想|要|[W:0-1]][从|去|到|前往][#目的地:[@sys_location]][W:0-2][请问|敢问]该[怎么|如何]走[??]";
String dialog = "你好,我要到上海闵行区茸锦科技园A栋1001室,请问该如何走?" +
    "左边右转一公里就能到。" +
    "兄弟,我想前往茸锦科技园A栋,敢问该怎么走" +
    "不知道";
matchDialog(dialog, template);
匹配结果
---------------------------
模板:我[想|要|[W:0-1]][从|去|到|前往][#目的地:[@sys_location]][W:0-2][请问|敢问]该[怎么|如何]走[??]

匹配:我要到上海闵行区茸锦科技园A栋1001室,请问该如何走?
变量:{目的地=上海闵行区茸锦科技园A栋1001室}

匹配:我想前往茸锦科技园A栋,敢问该怎么走
变量:{目的地=茸锦科技园A栋}

赞助

项目的发展离不开您的支持,请作者喝杯咖啡吧~

ps:辣条也行 ☕

支付宝

About

语法解析、模板匹配、信息抽取

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages