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. Multiload-ng

    导读 Multiload-ng是一个 GTK2 图形化系统监视器应用,可集成到 Xfce.LXDE 及 MATE 的桌面面板中, 它 fork 自原来的 GNOME Multiload 应用.它也可以 ...

  2. Nginx概念及基础安装--详细讲解

    1.主要内容: Nginx的基础           特性           配置部署           优化(了解) 2.Nginx 是什么? Nginx是一个开源的,支持高性能,高并发的www ...

  3. 学习OpenStack之(6):Neutron 深入学习之 OVS + GRE 之 Compute node 篇

    0.环境 硬件环境见上一篇博客:学习OpenStack之(5):在Mac上部署Juno版本OpenStack 四节点环境 OpenStack网络配置:一个tenant, 2个虚机 Type drive ...

  4. spring集成常用技术的配置

    使用spring集成其他技术,最基本的配置都是模板化的,比如配置视图模板引擎.数据库连接池.orm框架.缓存服务.邮件服务.rpc调用等,以spring的xml配置为例,我将这些配置过程整理出来,并不 ...

  5. Linux运维(3年以内)

    1.精通shell编程,熟练应用awk,sed,grep,strace,tcpdump等常用命令; 2.精通windows server,linux,mssql,mysql,熟悉网络,cisco,ju ...

  6. [Android Pro] ScrollView嵌套RecyclerView时滑动出现的卡顿

    reference to : http://zhanglu0574.blog.163.com/blog/static/113651073201641853532259/ ScrollView嵌套Rec ...

  7. Oracle 11g 新特性之Highly Available IP(HAIP)

    Redundant Interconnect with Highly Available IP (HAIP) 简介   从11.2.0.2开始,Oracle 的集群软件Grid Infrastruct ...

  8. linux学习笔记-前篇

    大学毕业已经快三年了,从事嵌入式开发的工作也快三年了. 不过,老干些裸机开发,感觉很是枯燥,一咬牙一跺脚,决定从今天开始学习Linux操作系统,顺便记录下学习过程中所遇到的问题与心得. 自己从前完全没 ...

  9. 借鉴dubbo实现自定义缓存

    自定义缓存一般基于ConcurrentMap实现,实现缓存需要注意的点是缓存容器对象 本身依赖于 static final去存储对象,样例: ConcurrentMap<String, Gene ...

  10. Android测试之 APK重签名方法

    方法一:命令行重签名 D:\>keytool -helpkeytool 用法: -certreq [-v] [-protected] [-alias <别名>] [-sigalg & ...