随机文本生成与马尔科夫链

来源:互联网 发布:单片机初始化程序 编辑:程序博客网 时间:2024/06/05 14:56

1. 随机文本生成     

      如何生成随机文本?要解决这个问题,首先必须知道什么是随机文本。这里说的”随机文本“是一种有”意义“的”随机文本“。有“意义”是指所生成的随机文本在一定程度上是符合自然语言规则的。具体对于英语来说,作者提到的随机文本有两个层次,一个是letter-level(字母级别),一个是word-level(单词级别)。所谓letter-level就是”随机“字母拼成的字母序列,word-level就是”随机“英语单词拼成的文本。上面提到的“符合自然语言规则”可以这样理解:对于字母级别,是指由随机字母序列拼成的单词应在一定程度上符合英语的单词拼写规则;对于单词级别,是指由随机单词拼成的单词序列应在一定程度上符合英语的语法规则。

      如何生成随机文本?最笨的方法是:对于letter-level,就是随机输出字母表中的字母和空格;对于word-level,就是随机输出字典中的单词。 这样做的确非常随机和简单,但这样生成的文本很可能没有任何”意义“。实际上,对于英文单词来说,某一个字母后面会出现什么字母的概率是不相等的。例如:如果当前字母是Q,那么下一个字母是U的可能行很大,而出现字母X的概率却很小。我们可以先读取一个样本(如《编程珠玑》的内容),统计A以后每个字母出现的次数、B之后每个字母出现的概率,等等。因此,在生成随机文本过程中把每个字母设置为其前一个字母的随机函数,生成器可以得到更令人感兴趣的文本。

      我们把用当前字母的一个随机函数生成下一个字母的方式生成的随机文本,称为1阶文本。把这一思想扩展到更长的字母序列上,2阶文本就是通过把每个字母设置为其前面两个字母的函数得到的(一对字母通常称为二连字母)。例如,二连字母TH在英文中后面通常跟A、E、I、O、U、和Y,后面跟R和W的可能性小一些,跟其他字母的情况更少。3阶文本是通过把下一个字母设置为其前面三个字母(三连字母)的函数得到的。而到了4阶文本,大多数单词都是英文单词了。对于在单词级别上生成随机文本,1阶文本、2阶文本等的概念与此类似。文中指出,2阶文本模拟英文的效果通常是最理想的。

     为什么要生成随机文本?作者在文中并没有明确说明。我感觉,作者的用意主要是引出“马尔科夫链”的概念。“具有数学背景的读者可能会将这个过程(例如:3阶随机文本的生成过程)视为一个马尔科夫链。每个状态表示一个k连字母,并且从一个状态到另一个状态的概率是不变的。因此这是一个”具有固定转换概率的有限状态马尔科夫链“。”作者以生动形象的语言描述了字母级别的英文文本k阶近似:我们随机打开一本书并在该页随机挑选一个字母,输出,并记之为“当前字母”。翻到另一页(非下一页,而是随机的另一页),寻找“当前字母”出现的位置,如果“当前字母”出现多次,则随机选一个,然后向后看k个字母,把那第k个字母输出,并把新的字母记为“当前字母”,再继续翻另一页,直到书翻完了或输出的字母总数达到某预设值,程序结束[2]

      作者提供了字母级别和单词级别k阶文本生成的完整代码:letter_lever文本生成代码以及word_lever文本生成代码。上述程序都是用C语言写的,作者写得很紧凑。对于第一个程序,用的是简单的扫描法去找“当前字母”在“下一页”的新位置,每次都扫描一次“输入文本”全文,所以效率很低,仅仅作为一个算法演示而已;第二个程序用到了散列表,效率不错,我认为有相当的实用价值,另外作者实现简易散列表的方法非常娴熟非常牛逼,实乃我等低端职业程序员居家旅行必备之参考[2]

2. 马尔科夫链

      马尔科夫链,因安德烈•马尔科夫(A.A.Markov,1856-1922)得名,是数学中具有马尔科夫性质的离散时间随机过程。该过程中,在给定当前知识或信息的情况下,过去(即当期以前的历史状态)对于预测将来(即当期以后的未来状态)是无关的。更简单一点说就是健忘!只记得当天或最近的事情,而稍早一些时候或过去很久了的就不记得。

      现在,假设随机变量X_1,X_2,X_3...的一个数列具有马尔科夫性质。这些变量的范围,即它们所有可能取值的集合,被称为“状态空间”,而X_n的值则是在时间n的状态。如果X_{n+1}对于过去状态的条件概率分布仅是X_n的一个函数,则   

                                           P(X_{n+1}=x|X_1=x_1, X_2=x_2, ..., X_n=x_n) = P(X_{n+1}=x|X_n=x_n). 

这里x为过程中的某个状态。上面这个恒等式可以被看作是马尔科夫性质。

马尔科夫的性质概括为如下两点:   

(1)t+1 时刻系统状态的概率分布只与t 时刻的状态有关,与 t 时刻以前的状态无关;   

(2)从t 时刻到t+1时刻的状态转移与t的值无关。

      到目前为止,我还只稍微懂一点点有关马尔科夫链的数学知识。有关马尔科夫链的实际应用,我在网上看到一篇很浅显易懂的文章,作者是Google研究员王军,题目是《数学之美系列三  —  隐含马尔可夫模型在语言处理中的应用 》。

      随机文本生成本来是个比较麻烦的问题,但是运用马尔科夫链的知识重新进行表述后,感觉整个问题突然变得简单明了了许多。进一步了解到,马尔科夫模型作为一种统计模型,已经广泛应用在语音识别,词性自动标注,音字转换,概率文法等各个自然语言处理的应用领域。经过长期发展,尤其是在语音识别中的成功应用,使它成为一种通用的统计工具。到目前为止,它一直被认为是实现快速精确的语音识别系统的最成功的方法。复杂的语音识别问题通过隐含马尔科夫模型能非常简单地被表述、解决,让人们不由由衷地感叹数学模型之妙。


参考文献:

[1] Jon Bentley, 《编程珠玑》第十五章—字符串

[2] 随机文本生成:http://blog.csdn.net/z_york/article/details/2546764

[3] 马尔科夫链:http://baike.baidu.com/view/3053716.htm

[4] 马尔科夫模型:http://baike.baidu.com/view/2361814.htm?subLemmaId=2361814&fromenter=%C2%ED%B6%FB%BF%C6%B7%F2%C4%A3%D0%CD