zoukankan      html  css  js  c++  java
  • 马尔科夫算法 awk 实现

    之前一直看不懂马尔科夫算法的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],等等。

  • 相关阅读:
    Linux下解压分包文件zip(zip/z01/z02)
    Ubuntu 16.04安装Notepadqq编辑器替代Notepad++
    Ubuntu 16.04安装NASM汇编IDE-SASM
    java命令--jstack 工具
    详述 hosts 文件的作用及修改 hosts 文件的方法
    译:Java 中的正则表达式性能概述
    译:25个面试中最常问的问题和答案
    Android中使用GoogleMap的地理位置服务
    Android 从imageview中获得bitmap的方法
    Android通过百度地图API用Service和Alarm在后台定时获取地理位置信息
  • 原文地址:https://www.cnblogs.com/zhuyp1015/p/2594454.html
Copyright © 2011-2022 走看看