誰かにいくつかの簡単な質問をし、答えに基づいて分岐するボットを構築したいと考えています。人間の応答から意味を解析するのは難しいと思いますが、会話の「状態」を処理するためにプログラムをどのようにセットアップしますか?
これは、人間とボットの間の 1 対 1 の会話になります。
誰かにいくつかの簡単な質問をし、答えに基づいて分岐するボットを構築したいと考えています。人間の応答から意味を解析するのは難しいと思いますが、会話の「状態」を処理するためにプログラムをどのようにセットアップしますか?
これは、人間とボットの間の 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 について言及しました。[foo によってシードされた文]」などです。
RPG のような対話ロジックをボットに組み込みます。人間による入力の解析として、ユーザーからの特定の会話プロンプトまたはコンテンツのフラグを切り替え、条件付きでチャットボットが話せる内容やコミュニケーション方法を変更します。たとえば、汚い言葉で毛むくじゃらの (または叱る、または笑う) チャットボットはかなり一般的です。熱くなり、謝罪するまで条件付きでそのままでいるチャットボットは、これに関する興味深いステートフルなバリエーションになります。出力をすべて大文字に切り替え、対立的なレトリックや要求、すすり泣きなどを挿入します。
州に何を達成してもらいたいのか、少し明確にしていただけますか?
各ノードまたはニューロンに解析機能を備えたニューラルネットワークを想像してみてください。ルールと解析結果に応じて、ニューロンが発火します。特定のニューロンが発火した場合、質問のトピックとセマンティクスについて良いアイデアが得られるため、良い答えを出すことができます。
記憶は、セッションで話題になっているトピックを維持し、次の質問の発砲に追加して、最後に可能な回答の選択プロセスをガイドすることによって行われます。
ルールとパターンをナレッジベースに保持しますが、ルールごとにニューロンを使用して、開始時にそれらをメモリにコンパイルします。リスナーやイベント関数などを使用してシナプスを設計できます。
このプロジェクトを開始するには、質問のあるデータベース(ツリーとして編成されています。すべてのノードに1つ以上の質問があります)があるとよいと思います。これらの質問には、「はい」または「いいえ」で答える必要があります。
ボットが質問を開始した場合、開始質問としてマークされた質問のyuorデータベースからの任意の質問から開始できます。答えは、ツリー内の次のノードへの道です。
編集:これはあなたが始めることができるルビーで書かれたいくつかのものです:rubyBOT
素朴なチャットボット プログラム。解析なし、巧妙さなし、トレーニング ファイルと出力のみ。
最初にテキストで自分自身をトレーニングし、次にそのトレーニングからのデータを使用して、対話者の入力に対する応答を生成します。トレーニング プロセスでは、各キーが単語であり、値がトレーニング テキストの任意の場所でその単語に連続して続くすべての単語のリストである辞書を作成します。単語がこのリストに複数回含まれている場合、それが反映され、ボットによって選択される可能性が高くなります。確率的なものは必要ありません。リストでそれを行うだけです。
ボットは入力からランダムな単語を選択し、保持されている単語の後継と見なされている別のランダムな単語を選択して応答を生成します。次に、その単語の後続の単語を順番に見つけて、それが十分に語られていると判断するまで、このプロセスを繰り返します。トレーニング テキストの句読点の前にある単語で停止することにより、その結論に達します。その後、再び入力モードに戻り、応答できるようになります。
あまり現実的ではありませんが、71 行のコードでより良い結果を出すように誰かに挑戦します !! これは、新進の Pythonist にとって大きな挑戦であり、このブログにアクセスする少数の訪問者よりも、より多くの読者に挑戦できることを願っています。常に文法的であることが保証されているボットをコーディングするには、間違いなく数百行に近い必要があります。私は、コンピューターに何かを言うための単なる刺し傷を与えるための最も単純なルールを考えようとすることで、大幅に単純化しました。
その反応は控えめに言ってもかなり印象的です!また、言うことを一重引用符で囲む必要があります。
トレーニングの実行に数時間かかった「コーパス」には、戦争と平和を使用しました。せっかちな場合は、短いファイルを使用してください…</p>
ここにトレーナーがいます
#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
部分的に理にかなっているように見えることを言うと、不思議な気持ちになる傾向があります.
これがあなたが探しているものかどうかはわかりませんが、ELIZAと呼ばれる古いプログラムがあります。このプログラムは、簡単なテキスト変換を実行した後、あなたが言ったことを受け取り、それを吐き返すことで会話を行うことができます。
私の記憶が正しければ、多くの人が実在の人物と「話している」と確信し、長い間精巧な会話をしていました。
ベイズ確率を調べることをお勧めします。次に、チャットルームを一定期間監視して、確率ツリーを作成します。
ちょっと手を出しているだけなら、Pidginを使用すると、チャット スタイルの動作をスクリプト化できると思います。フレームワークの一部はおそらく、誰がいつメッセージを送信したかの状態を追跡するため、最後の N メッセージごとにボットの内部状態のログを保持する必要があります。将来の状態の決定は、以前の状態の調査と最新のいくつかのメッセージの内容に基づいてハードコーディングできます。または、説明したマルコフ連鎖のようなことを行い、それを解析と生成の両方に使用することもできます。
学習ボットが必要ない場合は、AIML ( http://www.aiml.net/ ) を使用すると、少なくともボットが入力を解析し、それに基づいて応答するという点で、希望する結果が得られる可能性が高くなります。
XML(AIML形式)で作られた「頭脳」を再利用または作成し、プログラム(パーサー)で解析/実行します。選択できるいくつかの異なる言語で作成されたパーサーがあり、私が知る限り、コードはほとんどの場合オープン ソースのようです。