Perl 6およびマルコフシーケンス

テキストでのマルコフ連鎖の使用基づいた非数値シーケンスを考えてみましょう。 シーケンスの次の文字は、前の2つに基づいてランダムに決定されます。 配布は、ソーステキストに含まれるテンプレートに従います。



use v6; use List::Utils; my $model-text = $*IN.slurp.lc; $model-text .=subst(/<[_']>/, "", :global); $model-text .=subst(/<-alpha>+/, " ", :global); my %next-step; for sliding-window($model-text.comb, 3) -> $a, $b, $c { %next-step{$a ~ $b}{$c}++; } my $first = $model-text.substr(0, 1); my $second = $model-text.substr(1, 1); my @chain := $first, $second, -> $a, $b { %next-step{$a ~ $b}.roll.key } ... *; say @chain.munch(80);
      
      







初期化後、コードには3つの部分が明確に表示されます。



最初はモデルのテキストを入力し、アルファベット以外の文字を取り除きます。 4行目はslurpを使用して標準入力($ * IN)を1つの文字列変数に読み取り、lcはすべてを小文字にします。 最初のsubstは、すべての下線とアポストロフィを削除します。 2番目は、アルファベット以外の文字のすべてのシーケンスをスペースに置き換えます。



2番目の部分では、List :: UtilsとPerlマジックのスライディングウィンドウ関数を使用します。



$ model-text.combは、テキストを文字に分割します。



スライドウィンドウ、スライドウィンドウは、リスト内を移動し、リスト内の各要素から始まるN個(この場合は3個)の要素を提供します。 つまり、最初に1番目、2番目、3番目、次に2番目、3番目、4番目などを取得します。



ループでは、テーブルのテーブルを作成します。 外部キーは、3つの連続した文字の最初の2つです。 内側は3番目の文字で、その意味はこの文字が最初の2つに続く回数です。 つまり、プログラムにAqualungグループのアルバムのテキストを渡すことにより、次のフォームの%next-step {"qu"}のコンテンツを取得します。



 {"a" => 5, "e" => 2}
      
      







これは、「q」と「u」の後に「a」が5回、「e」が2回ある場合に発生します。



コードの3番目の部分では、このデータを使用してシーケンスを構築します。 最初の2文字を取得し、その後にどの文字が来るかを知っています。 次に、これら2つの文字で始まり、-> $ a、$ b {%next-step {$ a〜$ b} .roll}をジェネレーターとして使用してシーケンスを作成します。 前の2文字を3番目の周波数ハッシュとして使用します。 rollメソッドは、その重みに応じて1つのランダムハッシュキーを返します。 「qu」の例では、5つの面(「a」と2つの「e」)がある7面の立方体を投げることを想像できます。 最初の2つに続く文字がわからない場合(たとえば、これらの2つの文字はテキストに固有でした)、未定義の値が返され、シーケンスが停止します。

munchメソッドを使用して、シーケンスの最初の80文字を取得します。



Aqualungテキストでスクリプトを実行すると、次のようなシーケンスが得られます

「彼が私と一緒に歌ってくれて、パットすると、laboonfeetにピンセットが保存されます」と「t steallは、クックを鳴らして、クックを鳴らし、クックを沈黙させます」。



プログラムには、動作するハードコードされた文字セットがありません。 Perl 6がシンボルとして認識するすべてのものが処理されます。 p6evalがstdinとして使用する標準の「Land der Berge」ファイルを供給すると、「laßin ber bistbrüftenlasschörenzeitesöstfroher land deräckerzeichönelan」のような行が得られます。



All Articles