5分钟理解CFG上下文无关文法

CFG是基于规则的NLP(自然语言处理)的一种方法,网上关于CFG的文章比较少,尤其是解析算法几乎百度不到。我由于最近用到CFG规则来解决NLP问题,并实现了CFG的解析算法。本文是作为CFG解析算法的前置知识。读者敬请期待即将写的5分钟理解CFG上下文无关文法的解析算法

CFG是什么

  1. CFG的英文全称context free grammar,中文叫上下文无关文法
  2. CFG是一组替换规则,例如:A->B C; B->E F; E->e;…  A->B C表示变量A可以被变量B和变量C替换,E->e表示变量E可以被最终的值e替换。e不是变量,不可再被替换了。
  3. CFG主要作用是验证一个输入字符串input,是否符合某个文法G。与正则表达式比较像。但是比正则表达式功能更强大,能表达非常复杂的文法,比如C语言语法用正则表达式来表示不可能做到,但是可以用CFG的一组规则来表达。
  4. 因为用到变量,可以将一个复杂的规则分解成多个简单规则。
  5. 几个概念:非终结符(N表示它的集合),终结符(Σ表示它的集合),产生式(P表示它的集合),起始符S
  6. 非终结符(nonterminal):可被进一步替换的符号,也叫变量。通常在公式中用一个或多个大写英文字母表示的是非终结符,N表示非终结符的集合。
  7. 终结符(terminal):不可被替换的符号,在公式中用一个或多个小写英文字母表示非终结符,Σ表示终结符的集合。
  8. NUΣ:是N和Σ的并集,α∈NUΣ 表示α可以是终结符也可以非终结符,公式中的小写希腊字母是属于这种。α可以为空字符串。
  9. 产生式(production): 就是一条条的规则,如A->B C,大写字母P表示规则的集合
  10. 起始符S:特殊的非终结符,表示最高层的变量,相当于树结构的根节点。
  11. 一条规则有“->”分割成2部分,左边称为left hand side,简写LHS,右边称为right hand side,简写RHS
  12. 注意这里说的公式和规则不是一回事。公式是用来表示规则的,但不是具体的规则。公式的例子:A->αY,表示规则的RHS有两部分,一部分用小写希腊字母α表示,代表这个可以是终结符,也可以是非终结符,还可以为空;后面一部分用大写英文字母Y表示,代表这部分确定是个非终结符或变量。对应这个公式的具体规则可以是:A->B, A->BC,A->'1' C

 

一个例子:约束日期类的文法

合法的:2021年2月1日;1995年10月31日

非法的:20211年2月1日; 20212月1日; 2021年22月1日

S->Y M D  #year month day
Y->YN YT  #YN:year number;YT:year tag
YT->"年"
M->MN MT #MN:month number; MT:month tag
MN-> DOZEN  #1 到12
MT->"月"
DT->"日"
YN->DIG1_9   DIG0_9  DIG0_9  DIG0_9  # DIG1_9:digit 1 to 9
DIG0_9->ZERO | DIG1_9
DIG1_9->ONE | DIG2_9
DIG2_9->TWO | DIG3_9
DIG3_9-> THREE | DIG4_9
DIG4_9->"4" | "5" |"6" |"7" |"8" | "9"
ZERO->"0"
ONE->"1"
TWO->"2"
THREE->"3"
DOZEN ->DIG1_9 | ZERO  DIG1_9 | ONE  ZERO | ONE  ONE  | ONE TWO 
D->DN DT
DN-> DIG1_9 | ZERO  DIG1_9 | ONE DIG1_9 | TWO DIG1_9 | THREE ZERO | THREE ONE
  • 11
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值