簡単なチャットボット AI をプログラムするにはどうすればよいですか?
-
09-06-2019 - |
質問
誰かにいくつかの簡単な質問をし、その答えに基づいて分岐するボットを構築したいと考えています。人間の応答から意味を解析するのは難しいとは思いますが、会話の「状態」を処理するプログラムをどのように設定しますか?
人間とボットの間の 1 対 1 の会話になります。
解決
おそらく調べたいと思うでしょう マルコフ連鎖 ボットAIの基本として。私はずっと前に何かを書きました (このコードはまったく誇りに思っていませんが、Python > 1.5 で実行するにはいくつかの MOD が必要です)。これはあなたにとって役立つ出発点になるかもしれません。 http://sourceforge.net/projects/benzo/
編集:これは、stdin から入力を受け入れ、入力内で次々に続く単語の確率に基づいてテキストを出力するマルコフ連鎖の Python での最小限の例です。IRC スタイルのチャット ログ用に最適化されていますが、適切なサイズのテキストを実行すると、次の概念が実証されるはずです。
import random, sys
NONWORD = "\n"
STARTKEY = NONWORD, NONWORD
MAXGEN=1000
class MarkovChainer(object):
def __init__(self):
self.state = dict()
def input(self, input):
word1, word2 = STARTKEY
for word3 in input.split():
self.state.setdefault((word1, word2), list()).append(word3)
word1, word2 = word2, word3
self.state.setdefault((word1, word2), list()).append(NONWORD)
def output(self):
output = list()
word1, word2 = STARTKEY
for i in range(MAXGEN):
word3 = random.choice(self.state[(word1,word2)])
if word3 == NONWORD: break
output.append(word3)
word1, word2 = word2, word3
return " ".join(output)
if __name__ == "__main__":
c = MarkovChainer()
c.input(sys.stdin.read())
print c.output()
ここから永続性と IRC ライブラリをプラグインして、あなたが話している種類のボットの基礎を得るのは非常に簡単です。
他のヒント
ステートフル性は一般的なチャットボットの大きなコンポーネントではないことはすでに述べられています。
純粋なマルコフ実装は、辞書やテーブルをリアルタイムで拡大している場合、非常に緩やかな種類の状態を表現する可能性があります。人間の対話者による以前の発話が、会話の後半で偶然吐き戻される可能性があります。しかし、マルコフ モデルには固有の状態が何もありません。そのような応答を選択または生成するためのメカニズム。
解析ベースのボット (例:ELIZA) は通常、以前のやり取りをあまり考慮せずに、ユーザーからの最新の入力の意味論的な内容 (の一部) に応答しようとします。
そうは言っても、あなたは確かに できる 使用している入力解析モデルとステートメント合成モデルに関係なく、チャットボットにある程度の状態を追加します。それを行う方法は、ステートフル性で何を達成したいかによって大きく異なりますが、それはあなたの質問からはあまり明らかではありません。ただし、一般的なアイデアがいくつかあります。
キーワードスタックを作成します。人間が入力を提供すると、発言や質問からキーワードを解析し、それらのキーワードを何らかのスタックにスローします。チャットボットが最新の入力で応答する説得力のある何かを思いつかなかった場合、またはおそらくランダムに物事を混ぜ合わせた場合は、スタックに戻り、前のキーワードを取得し、それを次のキーワードのシードに使用します。合成。ボーナス ポイントの場合は、ボットが前の主題に戻ることを明示的に認識させます。「待ってください、人間、先ほどフーのことを言いましたね。[foo によってシードされた文]」。
RPG のような対話ロジックをボットに構築します。人間の入力を解析するときに、ユーザーからの特定の会話プロンプトやコンテンツのフラグを切り替え、チャットボットが話す内容や通信方法を条件に応じて変更します。たとえば、チャットボットが汚い言葉に怒ったり(叱ったり、笑ったり)するのはかなり一般的です。条件付きで激怒するチャットボット 謝られるまでそのままでいてください, 、これに対する興味深いステートフルなバリエーションとなるでしょう。出力をすべて大文字に切り替え、対立的なレトリックや要求、すすり泣きなどを入れます。
あなたが達成するために国に支援してもらいたいことを少し明確にしていただけますか?
各ノードまたはニューロンに解析機能を備えたニューラル ネットワークを想像してください。ルールと解析結果に応じて、ニューロンが発火します。特定のニューロンが活性化すると、質問のトピックと意味についての良いアイデアが得られるため、適切な答えが得られます。
記憶は、セッションで話されたトピックを保持し、次の質問への意欲を高め、最終的に考えられる答えの選択プロセスをガイドすることによって行われます。
ルールとパターンをナレッジ ベースに保持しますが、開始時にルールごとにニューロンを使用してメモリにコンパイルします。リスナーやイベント関数などを使用してシナプスを設計できます。
このプロジェクトを始めるには、質問を含むデータベース (ツリーとして編成されたもの) があればよいと思います。すべてのノードに 1 つ以上の質問があります)。これらの質問には、「はい」または「いいえ」で答えられるはずです。
ボットが質問を開始する場合、開始質問としてマークされた質問のデータベースからの任意の質問から開始できます。答えは、ツリー内の次のノードへの道です。
編集:以下に Ruby で書かれたサンプルを示します。 ルビーボット
素朴なチャットボット プログラム。解析や賢さはなく、トレーニング ファイルと出力だけです。
まずテキストで自身をトレーニングし、その後そのトレーニングからのデータを使用して対話者の入力に対する応答を生成します。トレーニング プロセスでは、各キーが単語であり、値がトレーニング テキスト内の任意の場所でその単語に連続して続くすべての単語のリストである辞書が作成されます。ある単語がこのリストに複数回登場する場合、それが反映され、ボットによって選択される可能性が高くなります。確率的なものは必要なく、リストを使用して実行するだけです。
ボットは入力からランダムな単語を選択し、保持されている単語の後継と思われる別のランダムな単語を選択して応答を生成します。次に、その単語の後継者を順番に見つけてプロセスを繰り返し、十分に言われたと判断するまで繰り返し実行します。トレーニング テキスト内の句読点の前にある単語で停止することで、その結論に達します。その後、再び入力モードに戻り、応答できるようになります。
あまり現実的ではありませんが、71 行のコードでより良い結果を出せるよう、誰にでも挑戦します。これは、新進気鋭の Pythonist にとって大きな挑戦です。このブログの少数の訪問者よりも幅広い読者にこの挑戦を公開できればと願っています。文法的であることが常に保証されているボットをコード化するには、確実に数百行近くになるはずです。私は、コンピューターに何か言いたいことを伝えるための最も単純なルールを考えるだけで大幅に簡略化しました。
控えめに言っても、その反応はかなり印象派的です。また、発言内容を一重引用符で囲む必要があります。
「コーパス」には「戦争と平和」を使用しましたが、トレーニングの実行には数時間かかりました。せっかちな場合は、より短いファイルを使用してください…
こちらがトレーナーです
#lukebot-trainer.py
import pickle
b=open('war&peace.txt')
text=[]
for line in b:
for word in line.split():
text.append (word)
b.close()
textset=list(set(text))
follow={}
for l in range(len(textset)):
working=[]
check=textset[l]
for w in range(len(text)-1):
if check==text[w] and text[w][-1] not in '(),.?!':
working.append(str(text[w+1]))
follow[check]=working
a=open('lexicon-luke','wb')
pickle.dump(follow,a,2)
a.close()
ここがボットです
#lukebot.py
import pickle,random
a=open('lexicon-luke','rb')
successorlist=pickle.load(a)
a.close()
def nextword(a):
if a in successorlist:
return random.choice(successorlist[a])
else:
return 'the'
speech=''
while speech!='quit':
speech=raw_input('>')
s=random.choice(speech.split())
response=''
while True:
neword=nextword(s)
response+=' '+neword
s=neword
if neword[-1] in ',?!.':
break
print response
部分的には理にかなっているように見えることが言われると、不気味な感覚を覚える傾向があります。
ベイズ確率を検討することをお勧めします。次に、一定期間チャット ルームを監視して、確率ツリーを作成します。
これがあなたが探しているものであるかどうかはわかりませんが、という古いプログラムがあります。 イライザ これは、あなたの言ったことを受け取り、いくつかの簡単なテキスト変換を実行した後、それをあなたに吐き戻すことで会話を続けることができます。
私の記憶が正しければ、多くの人が実際の人間と「話している」と思い込んで、長い間手の込んだ会話をしていました。
あなたがただ手を出しているだけなら、私は信じます ピジン チャット スタイルの動作をスクリプト化できます。フレームワークの一部には、誰がいつメッセージを送信したかという状態が記録される可能性があり、最後の N 個のメッセージごとにボットの内部状態のログを保持する必要があるでしょう。将来の状態の決定は、以前の状態の検査と最新のいくつかのメッセージの内容に基づいてハードコード化できます。あるいは、議論したマルコフ連鎖のようなことを実行し、それを解析と生成の両方に使用することもできます。
学習ボットが必要ない場合は、AIML (http://www.aiml.net/) 少なくともボットの入力解析とそれに基づく応答に関しては、おそらく希望する結果が得られます。
XML (AIML 形式) で作られた「頭脳」を再利用または作成し、プログラム (パーサー) で解析/実行します。いくつかの異なる言語で作成されたパーサーがあり、選択できます。私の知る限り、コードはほとんどの場合オープンソースであるようです。
「ChatterBot」を使用し、「flask-chatterbot-master」を使用してローカルでホストできます。
リンク:
- 【ChatterBotのインストール】https://chatterbot.readthedocs.io/en/stable/setup.html
- [ローカルでホスト - flask-chatterbot-master を使用]: https://github.com/chamkank/flask-chatterbot
乾杯、
ラトナカール