Chat / Topic Bot
Verfasst: 06.06.2006 20:04
Ich progge mir gerade einen eigenen Chatbot. Er reagiert in einem bestimmten Beitrag meiner Wahl, wenn sein Name genannt wurde.
Hier ist die Datenbank mit den Texten:
www.maxrev.de
Und so sieht der Code aus:
Zur Erklärung:
- in der Textdatei werden Satz und Antworten in einer Zeile dargestellt.
- Wenn der Satz bis zum 2. Semikolon im Topic auftaucht, dann antwortet der Bot 100%-tig passend
- Wenn der Satz aus dem Topic nicht gefunden wird, dann sucht er an Hand der einzelnen Wörtern nach Lösungsmöglichkeiten und wählt eine per Zufall aus
- Wenn kein Satz und auch kein Wort gefunden wird, dann gibt er per Zufall einer der Antworten bei <default> aus
Was mir noch fehlt:
Der Bot greift mit seinen Antworten auch gerne mal voll daneben, weil wenn der Satz nicht vorhanden ist und er nach den einzelnen Übereinstimmungen aus einem Satz sucht, dann passt es in der Regel nicht.
Ich gebe ein Beispiel: "Maxbot ist kein besonders schlauer Bot". Da genau dieser Satz nicht in der Datenbank ist, sucht er nach den einzelnen Wörtern "ist", "kein", "besonders" usw. Dabei kommen dann mehrere Antwortmöglichkeiten in Frage (gerade bei "ist" etc.).
Dem möchte ich nun entgegenwirken. Ich möchte eine Art %-tuale Auswertung integrieren. Sagen wir mal, dass der Satz "schlauer Bot" in der Datenbank wäre, dann soll er aus dem Satz erkennen, dass immerhin zwei Wörter hintereinander aus dem Satz mit einem aus der Datenbank übereinstimmen.
Wenn jetzt bei "schlauer Bot" als Antwort "Klar bin ich ein schlauer Bot" stünde, könnte man nun auch die Sätze "ist ein schlauer Bot" oder "ist kein schlauer Bot" abdecken.
D.h. ich brauche zwei Stufen der Überprüfung:
- kommen zwei oder mehr Wörter in der gleichen Reihenfolge schon in der Datenbank vor?
- kommen zwei oder mehr Wörter aus dem Satz in der Datenbank vor, dann bevorzuge diese Antworten vor denen wo nur ein Wort übereinstimmt
- usw.
Im Endeffekt suche ich ein Suchscript, dass die wahrscheinlichste Antwort darstellt. (Wie bei Suchmaschinenscripten mit %-tualen Angaben).
Hier der Bot in Aktion, falls es einen interessiert:
http://www.maxrev.de/der-laengste-threa ... 127840.htm
Gruß
Hier ist die Datenbank mit den Texten:
www.maxrev.de
Und so sieht der Code aus:
Code: Alles auswählen
function answer($message)
{
$message = str_replace('maxbot', '', $message);
$search = array("?","!",",",".",";","\n"," ");
$message = str_replace($search, " ", $message);
$message = $message == '' ? "<empty>" : $message;
$f = file('language/lang_german/bot_answers.txt');
for ($i=0; $i <= count($f); $i++)
{
$answers = split(";", $f[$i]);
$keyword = $answers[0];
if ( $keyword == $message )
{
array_shift($answers);
array_pop($answers);
$ai = rand(0, count($answers)-1);
$answer = $answers[$ai];
return $answer;
}
}
$new_answers = array();
$message_words = explode(" ", trim($message));
for ($j=0; $j < count($message_words); $j++)
{
$message_word = $message_words[$j];
for ($i=0; $i <= count($f); $i++)
{
$answers = split(";", $f[$i]);
$keyword = $answers[0];
if ( strstr($keyword, $message_word) )
{
array_shift($answers);
array_pop($answers);
$new_answers = array_merge($new_answers, $answers);
}
}
}
$ai = rand(0, count($new_answers)-1);
$answer = $new_answers[$ai];
$answer = (empty($answer)) ? answer('<default>') : $answer;
return ('[i]' . $answer . '[/i]');
}
- in der Textdatei werden Satz und Antworten in einer Zeile dargestellt.
- Wenn der Satz bis zum 2. Semikolon im Topic auftaucht, dann antwortet der Bot 100%-tig passend
- Wenn der Satz aus dem Topic nicht gefunden wird, dann sucht er an Hand der einzelnen Wörtern nach Lösungsmöglichkeiten und wählt eine per Zufall aus
- Wenn kein Satz und auch kein Wort gefunden wird, dann gibt er per Zufall einer der Antworten bei <default> aus
Was mir noch fehlt:
Der Bot greift mit seinen Antworten auch gerne mal voll daneben, weil wenn der Satz nicht vorhanden ist und er nach den einzelnen Übereinstimmungen aus einem Satz sucht, dann passt es in der Regel nicht.
Ich gebe ein Beispiel: "Maxbot ist kein besonders schlauer Bot". Da genau dieser Satz nicht in der Datenbank ist, sucht er nach den einzelnen Wörtern "ist", "kein", "besonders" usw. Dabei kommen dann mehrere Antwortmöglichkeiten in Frage (gerade bei "ist" etc.).
Dem möchte ich nun entgegenwirken. Ich möchte eine Art %-tuale Auswertung integrieren. Sagen wir mal, dass der Satz "schlauer Bot" in der Datenbank wäre, dann soll er aus dem Satz erkennen, dass immerhin zwei Wörter hintereinander aus dem Satz mit einem aus der Datenbank übereinstimmen.
Wenn jetzt bei "schlauer Bot" als Antwort "Klar bin ich ein schlauer Bot" stünde, könnte man nun auch die Sätze "ist ein schlauer Bot" oder "ist kein schlauer Bot" abdecken.
D.h. ich brauche zwei Stufen der Überprüfung:
- kommen zwei oder mehr Wörter in der gleichen Reihenfolge schon in der Datenbank vor?
- kommen zwei oder mehr Wörter aus dem Satz in der Datenbank vor, dann bevorzuge diese Antworten vor denen wo nur ein Wort übereinstimmt
- usw.
Im Endeffekt suche ich ein Suchscript, dass die wahrscheinlichste Antwort darstellt. (Wie bei Suchmaschinenscripten mit %-tualen Angaben).
Hier der Bot in Aktion, falls es einen interessiert:
http://www.maxrev.de/der-laengste-threa ... 127840.htm
Gruß