这是一个和语音差不多,只不过手写识别的过程是将字的图像当成了显性序列.
5.3 中文分词
“总所周知,在汉语中,词与词之间不存在分隔符(英文中,词与词之间用空格分隔,这是天然的分词标记),词本身也缺乏明显的形态标记,因此,中文信息处理的特有问题就是如何将汉语的字串分割为合理的词语序。例如,英文句子:you should go to kindergarten now 天然的空格已然将词分好,只需要去除其中的介词“to”即可;而“你现在应该去幼儿园了”这句表达同样意思的话没有明显的分隔符,中文分词的目的是,得到“你/现在/应该/去/幼儿园/了”。那么如何进行分词呢?主流的方法有三种:第1类是基于语言学知识的规则方法,如:各种形态的最大匹配、最少切分方法;第2类是基于大规模语料库的机器学习方法,这是目前应用比较广泛、效果较好的解决方案.用到的统计模型有N元语言模型、信道—噪声模型、最大期望、HMM等。第3类也是实际的分词系统中用到的,即规则与统计等多类方法的综合。”[1]使用HMM进行中文分词. 5.4 HMM实现拼音输入法
拼音输入法,是一个估测拼音字母对应想要输入的文字(隐性状态)的过程(比如, ‘pingyin’ -> 拼音)
使用HMM实现简单拼音输入法
楼上的大神都说得很好了,我来补充一个有意思HMM的用法,是用来给定钢琴谱,自动决定指法的用法。这个HMM的应用是来自于東京大学(東大真是所神奇的学校)的一个研究组在IJCAI 2007年的一篇文章,日文版的标题是《隠れマルコフモデルに基づくピアノ運指の自… 显示全部
楼上的大神都说得很好了,我来补充一个有意思HMM的用法,是用来给定钢琴谱,自动决定指法的用法。
这个HMM的应用是来自于東京大学(東大真是所神奇的学校)的一个研究组在IJCAI 2007年的一篇文章,日文版的标题是《隠れマルコフモデルに基づくピアノ運指の自動決定》,英文版的标题是《Automatic Determination of Piano Fingering based on Hidden Markov Model》,论文的网页在这里:Sagayama & Ono Lab。从网页可以知道,这篇文中的工作其实至少从2005年就开始了。
愚以为在我目前能做到的范围内最好的学习一篇论文并让其对自己有用的方法就是重现之,所以此答案也按照现在回看当时重现过程的过程的顺序写。对于这个问题,我觉得比较重要的一点是“如何将HMM模型套用到这个问题上”,什么是HMM中的“因”,什么是HMM中的“果”,这个HMM在解决与琴键指法有关的问题是如何对应到HMM的三大任务=Scoring, Matching, Training的。然后你就很容易知道问题的输入是什么、输出是什么,然后将其转化为一个用程
序员思维能解决的问题。
所以就开始俺们的钢琴运指自动决定之旅吧:
为了先有一个印象并明确问题的背景和定义,先看开门见山的介绍图:
这个图的意思是说,“你有一个HMM模型,往里面丢入琴谱,它就能给你输出指法。” 这图,首先大致说明了这个HMM里面有哪些变量:
?HMM中的“Hidden State(隐藏状态)”的是右手的五个手指编号(1=大拇指,2=食指,3=中指,4=无名指,5=小指)。
?HMM的“Emission(可见输出状态链)”是“所弹奏出来的音符”。
在这篇论文的问题描述中,“弹奏的音符”是知道的,“所用的指法”是不知道的。因为不知道,所以就需要用算法去算出来。所以这里和事实上的过程其实是反过来的:在此论文中,“指法”是原因,“音符”是结果,“事情发生”就是“指法导致了弹奏出这些音符”;这个过程在英文版论文中称为“fingering-to-performance conversion”,与事情看起来发生的顺序是相反的(一个人是先看到琴谱,然后才有指法的,这种现实中的发生顺序来说的过程在英文版论文中称为“score-to-fingering conversion”)。此论文中的概率用贝叶斯术语的名字来说就是: ?P(指法)是先验概率(Prior Probability/事前確率=じぜんかくりつ)、 ?P(音符|指法)是似然度(Likelihood/尤度関数=ゆうどかんすう)、
?P(音符,指法)是联合概率(Joint Probability/結合確率=けつごうかくりつ)、 ?P(音符)是边缘概率(Marginal Probability/周辺確率=しゅうへんかくりつ)、 ?P(指法|音符)是后验概率(Posterior Probability/事後確率=じごかくりつ)。【通过改变指法来最大化这个概率的过程,就是MAP,即Maximum A-Posteriori过程,即是Viterbi
Search法做的事情。】
然后,它说明了这个HMM的性质:
?这个HMM是一个“Mealy Machine”,因为它是在转换的过程中输出的,而不是当处于某个状态时输出的(在某个状态输出,就应是Moore Machine)。“Mealy Machine”的输出概率函数是关于边的起始结点和终止结点的函数。所以,图右方的“High probability emission”意思是,“当我先用右手无名指弹奏了#F之后,再用右手小指弹奏#F右边的G的概率比较高”;图右下角的“Low probability emission”的意思是,“当我先用右手的无名指弹奏了G之后,再用右手小指弹奏G左边的#F的概率比较低”。 ?也就是说,输出某个音符的概率可以写成
,用语言解释就是“在我现
在用第f_{i-1}个手指弹奏y_{i-1}这个音时,我接下来要用第f_i个手指奏y_i这个音的概率”。[1]
?至于状态转换概率则是不分Moore Machine和Mealy Machine的,都是
,也
就是当前用了某个手指之后,会转而使用下一个手指的概率。这个概率表可以用来对某些现象进行建模,譬如说:“中指和无名指连续交替按键很不灵活”,就可以通过使得赋给
更低的值来达成。
有了这些定义,我们就能知道如何完成HMM中的三个任务:
?Scoring:给定一个指法,通过打分看它好弹还是不好弹。输入是指法,输出是分数。 ?Matching:给定一个琴谱,给出最好的指法。输入是琴谱,输出是指法。
?Training:给定琴谱和指法组成的测试用例,通过改变HMM中的参数,来使得这个HMM能“学习”到测试用例中潜藏的规则。
与
首先是Scoring,就是这个HMM是如何计算某个指法安排出现的概率的,以上面的图为例: ?图中的红箭头经过的结点表示状态转换,也就是“5、2、3、1、4、2、1”。在处于某个状态时,所进行的状态转换只依赖于当前的状态是什么。
?红箭头经过的边表示所输出的可见状态,也就是右上角的音符:E5, B4, C5, A4, B4, #G4, E。 ?除了第一个音符以外,其它的音符都是按照上面的输出概率公式计算的。比如说用此指法弹奏第二个B4的条件概率就是
。
这就是“给定一个指法和所弹奏的音符,计算出它被弹奏出来的概率是多少”的过程。如果只给定音符,再罗列出所有可能的指法,就能从中计算出概率最大的指法。但是直接罗列速度会慢,所以可以用Viterbi Search来更快地计算出来。
那么就来到了第二点,Matching,就是给定一个谱子后,如何知道在当前的HMM中,最好的指法是什么?这是计算最大后验概率 P(指法|音符) 的问题。如前所述这其实是一个通过动态规划来达到比枚举高效很多的编程问题,其基本的样子是从给定的谱子的第一个音符开始,一直往后走,在每一步都保存“弹到当前的音符时最好的指法是什么”的信息供下一步使用,省掉计算时间的。此算法称为Viterbi Search(Viterbi algorithm),它所搜索的空间可称为Trellis Graph (Trellis (graph))。因为维基百科上的Viterbi算法的Python代码是可以直接拷贝下来运行的,为了有所不同,以下就以图中的片段来举个例子,运行一遍论文中所述的演算法(这里强制第一个音符必须用5指,所以开始概率是设成了{0.01, 0.01, 0.01, 0.01, 1.00}):
图中t表示输出状态链的“时间”,也就是音符的下标,从0开始。
当t=0的时候弹奏的概率就是开始概率。t>0时弹奏的概率就涉及输出概率与转换概率。