マルコフ連鎖の実装

形態素解析をしてそれを辞書に登録し、辞書を元に作文を行います。

 3) array_shift($tmp);
            set_word($dic, $tmp);
            if ($w == "。 "){
                $tmp = ["@"]; continue;
            }
        }
        return $dic;
    }

// 辞書に単語を登録
    function set_word(&$dic, $tmp){
        $w1 = $tmp[0];
        $w2 = $tmp[1];
        $w3 = $tmp[2];
        if (empty($dic[$w1])) $dic[$w1] = [];
        if (empty($dic[$w1][$w2])) $dic[$w1][$w2] = [];
        if (empty($dic[$w1][$w2][$w3])) $dic[$w1][$w2][$w3] = 0;
        $dic[$w1][$w2][$w3]++;
    }

// 辞書から作文する
    function make_sentence($dic, $count){
        $ret = [];
        for ($i = 0; $i < $count; $i++){
            $top = $dic["@"];
            if (!$top) break;
            $w1 = choice_word($top);
            $w2 = choice_word($top[$w1]);
            $ret[] = $w1;
            $ret[] = $w2;
            for (;;) {
                $w3 = choice_word($dic[$w1][$w2]);
                $ret[] = $w3;
                if ($w3 == "。")break;
                $w1 = $w2;
                $w2 = $w3;
            }
        }
        return implode("", $ret);
    }

    function choice_word($o){
    if (!is_array($o)) return "。 ";
        $ks = array_keys($o);
        return $ks[mt_rand(0, count($ks)-1)];
    }