独学の目的で、Redis をできるだけ多く使用し、アプリケーション レベルのロジックをできるだけ少なくして、マルコフ連鎖ジェネレーターを実装したいと考えています。
履歴の深さ N (たとえば、2) の頻度表に基づいて、単語ジェネレーターを作成したいとしましょう。
あまり興味深い例ではありませんが、 と という 2 つの単語の辞書のbar
頻度baz
表は次のようになります ("." はターミネータ、数字は重みです)。
. . -> b×2 . b -> a x2 ba -> r x1 ba -> z x1 ar -> . x1 az -> . x1
単語を生成するときは、2 つのターミネーターの履歴から始めます. .
最初の 2 文字の可能な結果は 1 つだけb a
です。
重みが等しいため、3 番目の文字は または のいずれr
かであり、確率は同じです。z
4 番目の文字は常にターミネータです。
(辞書に長い単語があると、より興味深いものになります。)
とにかく、これを Redis でエレガントに行う方法は?
Redis セットにはSRANDMEMBER
がありますが、重みはありません。
Redis の並べ替えられたセットには重みがありますが、ランダムなメンバーの取得はありません。
Redis リストでは重みをエントリのコピーとして表すことができますが、それらとの交差を設定するにはどうすればよいですか?
アプリケーションコードは、何らかのデータ処理を行う運命にあるようです...