私は数年前に Python で IRC 用のマルコフ チェーン チャットボットを作成しました。生成されたテキストは必ずしも意味のあるものではありませんが、読むのはとても楽しいものです。段階的に分解してみましょう。固定入力、テキスト ファイルがあると仮定します (チャット テキストまたは歌詞からの入力を使用するか、単に想像力を働かせることができます)。
テキストをループして辞書を作成します。これは、キーと値のコンテナーを意味します。そして、単語のすべてのペアをキーとして、次の単語を値として置きます。例: テキスト "abcab k" がある場合、"a b" をキーとして、"c" を値として開始し、"b c" と "a" を値として... 値は、保持しているリストまたは任意のコレクションにする必要があります。 0..多くの「アイテム」は、特定の単語のペアに対して複数の値を持つことができるためです。上記の例では、「a b」が 2 回続き、最初に「c」が続き、最後に「k」が続きます。したがって、最終的には、次のような辞書/ハッシュが作成されます。{'a b': ['c','k'], 'b c': ['a'], 'c a': ['b']}
これで、ファンキーなテキストを作成するために必要な構造ができました。ランダムなキーまたは固定された場所から開始することを選択できます! したがって、構造を考えると、「a b」を保存してから、値 c または k から次の単語をランダムに取得することから始めることができます。したがって、ループの最初の保存は「ab k」です (「k」がランダムな値として選択された場合)。 ) 次に、右に 1 ステップ移動します。これは、この場合は "b k" であり、ある場合はそのペアのランダムな値を保存します。やり直すように)。ループが完了したら、保存したテキスト文字列を印刷します。
入力が大きいほど、キー (単語のペア) の値が多くなり、"よりスマートなボット" になるため、テキスト (おそらくチャット入力?) を追加してボットを "トレーニング" できます。入力として本がある場合、いくつかの素敵なランダムな文を作成できます。値としてペアに続く単語を 1 つだけ取る必要はありません。2 または 10 を使用できます。違いは、「より長い」ビルディング ブロックを使用すると、テキストがより正確に表示されることです。ペアをキーとして、次の単語を値として開始します。
したがって、基本的に 2 つのステップがあることがわかります。最初にランダムにキーを選択して開始する構造を作成し、次にそのキーを取得してそのキーのランダムな値を出力し、値またはその他の条件がなくなるまで続行します。必要に応じて、キー値構造からのチャット入力から単語のペアを「シード」して開始することができます。チェーンを開始する方法はあなたの想像力次第です。
実際の言葉での例:
"hi my name is Al and i live in a box that i like very much and i can live in there as long as i want"
"hi my" -> ["name"]
"my name" -> ["is"]
"name is" -> ["Al"]
"is Al" -> ["and"]
........
"and i" -> ["live", "can"]
........
"i can" -> ["live"]
......
次にループを作成します。
ランダムなキーを選び、「こんにちは」と言って、値をランダムに選択します。ここでは 1 つだけなので、その「名前」
(SAVING "hi my name") .
次のキーとして "my name" を取って右に 1 ステップ移動し、ランダムな値を選択します... "is"
(SAVING "hi my name is") .
次に移動して、「名前は」...「アル」
(「こんにちは、私の名前はアルです」を保存)を取ります。
ここで、"is Al" ... "and"
(SAVING "hi my name is Al and")を取ります。
...
「and i」に来ると、値をランダムに選択します。「can」としましょう。次に、「i can」という単語が作成されます...停止条件に来るか、値がない場合は、構築された値を出力しますこの場合の文字列:
「こんにちは、私の名前はアルです。私が望む限りそこに住むことができます」
さらに値がある場合は、任意のキーにジャンプできます。値が多いほど組み合わせが多くなり、テキストがよりランダムで楽しいものになります。