73

マルコフ連鎖のようなものを使ってチャットボットを作ろうと思っていたのですが、どうすればうまくいくのかよくわかりません。私が理解していることから、特定の単語とそれに続く単語を含むデータからテーブルを作成します。ボットのトレーニング中に何らかの確率やカウンターを取り付けることは可能ですか? それは良い考えですか?

問題の 2 番目の部分は、キーワードに関するものです。ユーザー入力からキーワードを特定できると仮定すると、そのキーワードを使用する文をどのように生成すればよいでしょうか? 常に文をキーワードで始めたいわけではないので、どのようにマルコフ連鎖をシードすればよいでしょうか?

4

3 に答える 3

140

私は数年前に 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」という単語が作成されます...停止条件に来るか、値がない場合は、構築された値を出力しますこの場合の文字列:

「こんにちは、私の名前はアルです。私が望む限りそこに住むことができます」

さらに値がある場合は、任意のキーにジャンプできます。値が多いほど組み合わせが多くなり、テキストがよりランダムで楽しいものになります。

于 2011-03-15T03:30:59.360 に答える
0

次のようにできます: 文字ではなく単語を使用して、次数 1 のマルコフ連鎖生成プログラムを作成します。誰かが何かを投稿するたびに、彼が投稿したものがボット データベースに追加されます。また、ボットは、彼がチャットに行ったときに保存し、男が最初の投稿を投稿したときに (10 秒の倍数で)、同じ男が再度投稿するのを待っていた時間を節約します (10 秒の倍数で)...この 2 番目の部分は、男がいつ投稿するかを確認するために使用されるため、彼はチャットに参加し、「チャットに参加してから 10 秒後に男が投稿した時間」の表に基づいてしばらくすると、彼は続行します。 「X秒かけて考えて書いた投稿の後に投稿された投稿を書くのにどのくらいの時間が使われたか」と考えて同じ表で投稿する

于 2014-05-02T13:31:29.807 に答える