Seite 1 von 1

Chat / Topic Bot

Verfasst: 06.06.2006 20:04
von mgutt
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:

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]');
}
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ß

Verfasst: 06.06.2006 21:55
von Malz
Die Idee gefällt mir :)

Habe eben in Irgend einem Beitrag aufgeschnappt das du solch einen Bot im Einsatz hast.

Verfasst: 07.06.2006 13:28
von mgutt
Mir würde schon helfen, wenn jemand ein Script irgendwo findet, was für z.B. die Suche auf der eigenen Seite Ergebnisse ausgibt. Nur sortiert nach "Relevanz".

Habe ihr bestimmt schonmal gesehen. Da wir dann angezeigt "das Ergebnis passt zu 80% zu der Eingabe, das zu 45% usw.

Gruß

Verfasst: 07.06.2006 14:05
von S2B
Nimm doch die Anzahl der Wörter, die passen, im Verhältnis zur Gesamtwortzahl. Außerdem könntest du nach der "Komplexität" der Eingaben vorsortieren, sprich wie viele Wörter es sind:

Code: Alles auswählen

$my_input = 'Die Eingabe';
$my_input_words = explode(' ', $my_input);

$ordered_inputs = array();
foreach ($inputs as $input)
{
	$words = explode(' ', $input);
	$words_count = count($words);

	$match_status = 0;
	foreach($my_input_words as $my_input_word)
	{
		if (in_array($my_input_word, $words))
		{
			$match_status++;
		}
	}
	$match_status = round(100 * ($match_status / $words_count), 0);

	if (!isset($ordered_inputs[$match_status]))
	{
		$ordered_inputs[$match_status] = array();
		if (!isset($ordered_inputs[$match_status][$words_count]))
		{
			$ordered_inputs[$match_status][$words_count] = array();
		}
	}
	$ordered_inputs[$match_status][$words_count][] = $input;
}
Ich hoffe mal, dass der Code läuft. :D

Edit: *brrr* ein paar Fehler korrigiert.

Verfasst: 07.06.2006 14:21
von Pathologe
Wenn sowas ausgereift ist, fasse es doch alles zusammen, und mache einen MOD raus, aber bitte mit Anleitung für Noobs!!! :D

Verfasst: 07.06.2006 16:09
von S2B