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. C/C++ 笔试题

    /////转自http://blog.csdn.net/suxinpingtao51/article/details/8015147#userconsent# 微软亚洲技术中心的面试题!!! 1.进程 ...

  2. install alilang

    $sudo dpkg -i alilang.deb $ sudo alilang

  3. [BZOJ1112][POI2008]砖块Klo

    [BZOJ1112][POI2008]砖块Klo 试题描述 N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另 ...

  4. Oracle分析函数(一)

    一.总体介绍 分析函数如何工作 语法 FUNCTION_NAME(<参数>,…) OVER (<PARTITION BY 表达式,…> <ORDER BY 表达式 < ...

  5. MysqlWorkbench连接远程数据

  6. Android程序进行混淆,在导出签名apk包时出错!

    今天终于完成了近一个月的App开发工作,对程序进行混淆导出签名apk包时,却出现了如下的错误: Proguard returned with error code 1. See console Not ...

  7. PullToRefreshListView相关

    PullToRefresh使用详解(四)--利用回调函数实现到底加载   链接

  8. ibatis.net MVC 单元测试 错误解决方法

    Q1:Unable to load file via resource "SqlMap.config" as resource.Cause : 未能找到文件:"...Te ...

  9. Devexpress使用经验1

    1. 使用RibbonForm时,修改左上角图标:添加ApplicationMenu1,在属性中找Ribbon->ApplicationIcon,设置图标 2. 隐藏DevExpress Xtr ...

  10. DDD~概念中的DDD(转)

    概念中的DDD DDD: 领域驱动设计,它是对面向对象的的分析和设计(OOAD,Object Orient Analysis Design)的一个补充,对技术框架进行了分层规划,同时对每个类进行了策略 ...