[解決済み] マルコフ連鎖チャットボットの仕組みとは?
質問
マルコフ連鎖のようなものを使ってチャットボットを作ろうと思ったのですが、どうやったらうまくいくのか全くわかりません。私の理解では、ある単語とそれに続く単語のデータからテーブルを作成するのだと思います。ボットの学習中に、確率やカウンターのようなものを付けることは可能でしょうか?それは良いアイデアなのでしょうか?
問題の2つ目は、キーワードについてです。ユーザーの入力からキーワードはすでに特定できているとして、そのキーワードを使った文章をどうやって生成すればいいのか。必ずしもキーワードから文章を始めたいとは思わないので、マルコフ連鎖の種をどうするか?
どのように解決するのですか?
私は数年前にPythonでIRC用のマルコフ連鎖チャットボットを作ったので、その方法を紹介します。生成されたテキストは必ずしも意味をなさないが、読むと実に楽しい。ステップごとに分解してみましょう。固定入力であるテキストファイルがあると仮定して、(チャットテキストや歌詞からの入力でもいいですし、想像力を働かせましょう)
テキストをループして、キーと値のコンテナを意味するDictionaryを作成します。そして、すべての単語のペアをキーとして、その次の単語を値として置く。
例えば 例えば、quot;a b c a b 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 をランダムに取り出すことができます。この場合、"b k"となります)そして、1ステップ右に移動して、そのペアのランダム値を保存します。ループが終了したら、保存された文字列を表示します。
入力が大きければ大きいほど、キー(単語の組)の値が多くなり、より賢いボットになりますから、より多くのテキスト(おそらくチャット入力)を追加してボットを訓練することができます。本を入力にすれば、ランダムな文章を作成することができます。なお、ペアに続く単語は1つだけでなく、2つでも10つでもかまいません。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"]
......
今度はループを組みます。
ランダムにキーを選び、例えば "hi my" と言って、ランダムに値を選びます。
("hi my name" を保存する)
.
ここで、次のキーとして "my name" を取り、一歩右に移動し、ランダムな値を選びます... "is"
(SAVING "hi my name is")
.
今度は移動して "name is" ... "Al" を取ります。
(SAVING "hi my name is AL")
.
ここで "is Al" を取ります ... "and"
(セービング "hi my name is Al and")
.
...
and i"のところで、ランダムに値を選びます。例えば、"can"とすると、"i can"が作られます。
"こんにちは、私の名前はアルです、私は好きなだけそこに住むことができます。
値が多ければ、任意のキーにジャンプすることができます。値が多ければ多いほど、組み合わせが増え、ランダムで楽しいテキストになります。
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン