json的主页上,提供了number类型的符号识别过程,如下:

实际上这张图片表示的是一个状态机,只是状态没有标出来。因为这个状态机上存在ε转换,所以它是一个NFA(不确定有限自动机)。ε转换也即不需要输入串就能进行的转换,例如从开始状态到0之前的状态。而我们进行识别的时候,使用DFA(确定有穷自动机)会简单方便得多。所以首先应该将这个NFA转成DFA。
首先把这个NFA规范一下,写成状态与箭头的形式:

 

NFA转DFA最常用的方法是子集法,不过由于这个状态机的字符类型比较多,使用表格方式会使得表格很大并且很稀疏。这里用简便的记法,直接从左至右进行确定化:
考虑初始状态0,ε-closure(0)={0,1},就直接简记为{0,1}状态,写出它相邻的状态,如果相邻状态包含ε,则做同样的处理:

 

 然后再选定{2,6,10},写出它的相邻状态:

 

 用同样的方式,写出1、{2,3,6,10}的相邻状态,得到状态4和{7,8},这里需要注意的是1跟{0,1}是两个不同的状态。并且{2,3,6,10}是包含{2,6,10}的,因此可以利用之前{2,6,10}的结果来简化运算,所以只需要考虑3的相邻状态,有点像动态规划思想。重复以上步骤,最终得到一个不含ε的DFA:

 得到这个DFA之后并不一定是最简的,我们可以对它进行简化。首先为了方便,对它的状态都用字母替代吧:

 

简化的主要思路就是将状态的集合不断划分成子集。划分的办法是用一个集合相关的符号去测试这个集合中的状态,如果发现某个状态测试结果与其他状态不同,则划分状态,如果无法区分,则放到同一个集合中。
比如上述的DFA,首先可以肯定的是所有状态可以划分成“非终止状态”和“终止状态”两个集合,因为非终止状态总要转换到终止状态的。由于状态机是从左至右写出的,所以通常情况下,只需要考虑相邻的状态是否等价。并且,如果把这个状态机写成状态转换表,表项是很稀疏的,所以实际上可以合并的状态很少。具体过程如下:
对于终结符{A,C,F,G}每两个都互不等价,因此划分成四个状态{A},{C},{F},{G}
对于非终结符{S,B,D,E,G},E和G不等价,原因在于E对于+/-结果为G,而G不能通过+/-,并且E,G可以通过digit转换到H,而其他都不能这样转换,所以原集合可以划分成{S,B,D},{E},{G}
{S,B}和{D}很明显是不等价的,而对于S和B,唯一的区别就是S能够通过-转换到B,而B不能通过-
任何状态都不能合并,所以上述的状态机已经不能再简化。 
用正规式把上面的状态机写出来就是(非通常的正则表达式语法):
A=0|-0
C=([1-9]|-[1-9])d*
F=(A|C).dd*
H=(A|C|F)(e|E)(d|(+|-)d)d*
 
有了以上的状态机,我们就可以实现一个number识别程序了。
程序见:
 
 

NFA转DFA - json数字识别的更多相关文章

  1. 利用子集构造法实现NFA到DFA的转换

    概述 NFA非有穷自动机,即当前状态识别某个转换条件后到达的后继状态不唯一,这种自动机不便机械实现,而DFA是确定有限状态的自动机,它的状态转换的条件是确定的,且状态数目往往少于NFA,所以DFA能够 ...

  2. TensorFlow 之 手写数字识别MNIST

    官方文档: MNIST For ML Beginners - https://www.tensorflow.org/get_started/mnist/beginners Deep MNIST for ...

  3. MINST手写数字识别(二)—— 卷积神经网络(CNN)

    今天我们的主角是keras,其简洁性和易用性简直出乎David 9我的预期.大家都知道keras是在TensorFlow上又包装了一层,向简洁易用的深度学习又迈出了坚实的一步. 所以,今天就来带大家写 ...

  4. 【转】机器学习教程 十四-利用tensorflow做手写数字识别

    模式识别领域应用机器学习的场景非常多,手写识别就是其中一种,最简单的数字识别是一个多类分类问题,我们借这个多类分类问题来介绍一下google最新开源的tensorflow框架,后面深度学习的内容都会基 ...

  5. 求子串-KPM模式匹配-NFA/DFA

    求子串 数据结构中对串的5种最小操作子集:串赋值,串比较,求串长,串连接,求子串,其他操作均可在该子集上实现 数据结构中串的模式匹配 KPM模式匹配算法 基本的模式匹配算法 //求字串subStrin ...

  6. 防止在iOS设备中的Safari将数字识别为电话号码

    在测试中发现iPad上的Safari总会把长串数字识别为电话号码,文字变成蓝色,点击还会弹出菜单添加到通讯录. 别的地方倒也罢了,如果在用户名中出现数字(手机注册新浪微博的话用户名就是“手机用户xxx ...

  7. C#中调用Matlab人工神经网络算法实现手写数字识别

    手写数字识别实现 设计技术参数:通过由数字构成的图像,自动实现几个不同数字的识别,设计识别方法,有较高的识别率 关键字:二值化  投影  矩阵  目标定位  Matlab 手写数字图像识别简介: 手写 ...

  8. 禁止苹果浏览器Safari将数字识别成电话号码的方法

    偶然发现用ipad访问我的网站时,发现网站上的一串数字变颜色了(原来是红色的),现在变成了蓝色.一开始以为网站出了什么问题,后来在PC端查看,发现颜色依旧是红色.在ipad上点击还会弹出菜单呼叫的选项 ...

  9. CNN 手写数字识别

    1. 知识点准备 在了解 CNN 网络神经之前有两个概念要理解,第一是二维图像上卷积的概念,第二是 pooling 的概念. a. 卷积 关于卷积的概念和细节可以参考这里,卷积运算有两个非常重要特性, ...

随机推荐

  1. php项目整理之no1

    1.login.php <head></head> 2.check_login.php 3.user.php 4.getData.php

  2. Mac键盘图标与对应快捷按键标志汇总

    Mac键盘图标与对应快捷按键 ⌘--Command () win键 ⌃ --Control ctrl键 ⌥--Option (alt) ⇧--Shift ⇪--Caps Lock fn--功能键就是 ...

  3. 精简的网站reset 和 css通用样式库

    参考链接:http://www.zhangxinxu.com/wordpress/2010/07/我是如何对网站css进行架构的/ reset.css body{ line-height:1.4; c ...

  4. [转]hql 语法与详细解释

    HQL查询:Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Lanaguage)查询提供了更加丰富的和灵活的查询特性,因此 Hib ...

  5. %u编码

    Escape/Unescape加密解码/编码解码,又叫%u编码,从以往经验看编码字符串出现有"u",它是unicode编码,那么Escape编码采用是那一种unicode实现形式呢 ...

  6. C++代码重构——从C global到C++ template

    在学数据结构的时候,我常有这样目标--写出能够最大程度复用的代码(算法正确,封装优秀).我常想--如何能在短时间内达成"算法正确,封装优秀"这样的目标.经过一段时间的摸索,我的结论 ...

  7. 【转】Drawable /Bitmap、String/InputStream、Bitmap/byte[]

    原文:http://wuxiaolong.me/2015/08/10/Drawable-to-Bitmap/ Drawable互转Bitmap Drawable转Bitmap 1234 Resourc ...

  8. gcc编译时头文件和库文件搜索路径

    特殊情况:用户自定义的头文件使用#include"mylib"时,gcc编译器会从当前目录查找头文件 一.头文件 gcc 在编译时寻找所需要的头文件 :    ※搜寻会从-I开始( ...

  9. mac下wifi无法连接的问题

    今天遇到了一个Wi-Fi打死连不上的问题,关闭重启电脑路由器都试了一下还是不行,最后把资源库/偏好设置/SystemConfiguration下的文件都删除,有一个是删不掉的,留着不影响,然后重启,O ...

  10. web前端学习部落22群 明白何谓Margin Collapse

    明白何谓Margin Collapse 不同于其他很多属性,盒模型中垂直方向上的Margin会在相遇时发生崩塌,也就是说当某个元素的底部Margin与另一个元素的顶部Margin相邻时,只有二者中的较 ...