马尔科夫算法 awk 实现

本文详细解读了使用AWK语言实现的马尔科夫算法,通过实例展示如何构建2词前缀的马尔科夫链,并进行生成实验。深入探讨了AWK语言的特点以及在文本生成领域的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前一直看不懂马尔科夫算法的awk实现。最近学习了awk,基本上能看懂了。C++版的参见这里

 #!/bin/awk -f

#markov.awk: markov chain algorithm for 2-word perfixes
BEGIN { MAXGEN = 10000; NONWORD = "\n"; w1=w2=NONWORD }
{
    for(i = 1; i <= NF; i++)
    {
        #read all words
        statetab[w1,w2,++nsuffix[w1,w2] ] = $i
        #print "IN",$i
        w1 = w2
        w2 = $i
    }
}
END{
    statetab[w1,w2,++nsuffix[w1,w2] ] = NONWORD #add tail
    w1 = w2 = NONWORD
    for( i = 0; i < MAXGEN; i++)
    {
        #generate
        r = int(rand() * nsuffix[w1,w2]) + 1 
        #print "r: ",r
        p = statetab[w1,w2,r]
        if ( p == NONWORD )
            exit
        print p,
        w1 = w2    
        w2 = p
    }
}
Awk是一个模式—操作对的语言:输入总以一次一行的方式读入,每个读入行都拿来与程序里的模式做匹配,与此同时,对各个成功匹配执行有关动作。这里存在着两个特殊的模式,BEGIN和END,它们分别能在输入的第一行之前和最后一行之后匹配成功。动作是由花括号括起的一个语句块。在上面的 Aw k版本的马尔可夫程序里, BEGIN动作块对前缀和若干其他变量做初始化。随后的一个语句块没有模式部分,这是一种默认方式,意味着这个块将对每个输入行执行一次。Awk自动把每个读入的行分割成一些域 (由空白分隔的词),它们将分别成为$1到$NF。变量NF的值是域的个数。语句:

statetab[w1,w2,++nsuffix[w1,w2]] = $i 

建立从前缀到后缀的映射。数组 nsuffix记录后缀个数,其元素 nsuffix[w1, w2]记录与前缀对应的后缀的个数。而后缀本身则被做为数组 statetab的元素,如  statetab [ w1,w2, 1],statetab[w1, w2, 2],等等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值