1. 为什么谈有限自动机时要谈正则表达式?原因是:正则表达式所匹配的所有字符串所构成的语言可以用有限自动机识别。根本原因是:正则集(正则表达式所匹配的所有字符串集合)是由右线性文法(3型文法)所产生的语言,两者是等同的。
2. 单词拼写检查
有限自动机除了可以匹配正则表达式描述的字符集(语言),也可以用来做单词拼写检查。当然还是要基于字符变化距离度量来提供候选串的。具体操作就是:
设T为字母表,可构造一个识别字母表T上的字母构成的所有合法单词的有限自动机。该自动机对应的状态转换图可看作是一个边上有字母标记的有向图。那么,字母表T上的字母构成的所有合法单词都对应着有限自动机中的一条从初始状态到终止状态的路径。字符串识别的过程就是对有向图从初始状态到终止状态遍历的过程,一条路径从初始状态到终止状态经过的所有弧上的字母连接起来构成一个字符串。给定一个字符串,对其进行拼写检查的过程实际上是在给定阈值t(t>0)的范围内,寻找那些与输入串的编辑距离小于t的路径,这些路径从初始状态到终止状态经过的所有弧上的字母连接起来构成的字符串,就是要找的与输入串最相似的单词。
自动机的实现,按照何晗的文章
https://www.hankcs.com/nlp/%E7%AC%AC3%E7%AB%A0-%E5%BD%A2%E5%BC%8F%E8%AF%AD%E8%A8%80%E4%B8%8E%E8%87%AA%E5%8A%A8%E6%9C%BA.htmlwww.hankcs.com所述,关于有限自动机找出正确字串,修改图的深度优先搜索算法即可,弄个stack,注意剪枝就行。
编辑距离指的是Damerau所定义的编辑距离,即两个字符串之间的编辑距离等于使一个字符串变成另一个字符串而进行的插入、删除、替换或相邻字符交换位置而进行操作的最少次数。编辑距离可以参考何晗搜集整理的
https://www.hankcs.com/program/java/several-string-edit-distance-achieved.htmlwww.hankcs.com我之前找到过一个Python版本的,但是那时候没有写知乎,又不知道哪去了。什么语言不重要,知道实现过程比较重要,怎么优化不重要,因为没见过会优化的。
基于有限自动机的单词拼写检查完整实现,没有找到合适的代码,有关拼写检查的仓库有:
- https://github.com/hunspell/hunspell star最多的一个拼写检查
- https://github.com/jmoy/norvig-spell norvig拼写检查的各种编程语言实现
- https://github.com/barrust/pyspellchecker norvig拼写检查的纯Python实现
- https://github.com/bakwc/JamSpell
有关于拼写检查这个事,有时间再写其他文章说。写形式语言自动机主要就是为了补上2型上下文无关文法以及对应的下推自动机。
3.grep命令
虽然说操作机器是最没脑子的技术,但是还是把它弄熟,然后再狠狠地鄙视,跟导数据一样,一个月开200块钱都多,就是个女工接线头。
$ cat kkk
akkk
test file
oooo
ppppp
# 在文件kkk中搜索匹配字符串"test file"
$ grep "test file" kkk
test file
# 在文件kkk中搜索匹配字符串"es",并且加上行号输出
$ grep -n es kkk
2:test file
# 显示所有以d开头的文件中包含"test"的行数据内容
$ cat d1
1
test1
$ cat d2
2
test2
$ grep 'test' d*
d1:test1
d2:test2
# 在文件aa中显示所有包含至少有5个连续小写字符的行数据内容
$ cat aa
aaaaa
bbb
AAAAA
BBB
aaaaaa
$ grep -E "[a-z]{5}" aa
aaaaa
aaaaaa
# 查找sshd进行信息
# ps -ef|grep sshd
root 3390 3376 0 09:09 pts/2 00:00:00 grep --color=auto sshd
# 在aa文件中找出以b开头的行内容
$ grep "^b" aa
bbb
# 在kkk文件中输出以le结尾的行内容
$ grep -E "le$" kkk
test file
# 在kkk文件中输出包含es或 kk的行内容
$ grep -E "(es)|(kk)" kkk
akkk
test file