Chat / Topic Bot

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
Benutzeravatar
mgutt
Mitglied
Beiträge: 2999
Registriert: 31.08.2004 16:44
Wohnort: Hennef
Kontaktdaten:

Chat / Topic Bot

Beitrag 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ß
Zuletzt geändert von mgutt am 17.12.2008 22:30, insgesamt 1-mal geändert.
meine Foren: http://www.maxrev.de/communities.htm
Ich kaufe Dein Forum! Angebote bitte an marc at gutt punkt it
Malz
Mitglied
Beiträge: 195
Registriert: 30.05.2006 22:26

Beitrag von Malz »

Die Idee gefällt mir :)

Habe eben in Irgend einem Beitrag aufgeschnappt das du solch einen Bot im Einsatz hast.
Benutzeravatar
mgutt
Mitglied
Beiträge: 2999
Registriert: 31.08.2004 16:44
Wohnort: Hennef
Kontaktdaten:

Beitrag 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ß
meine Foren: http://www.maxrev.de/communities.htm
Ich kaufe Dein Forum! Angebote bitte an marc at gutt punkt it
Benutzeravatar
S2B
Ehemaliges Teammitglied
Beiträge: 3258
Registriert: 10.08.2004 22:48
Wohnort: Aachen
Kontaktdaten:

Beitrag 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.
Gruß, S2B
Keinen Support per ICQ/PM!
Hier kann man meine PHP-Skripte und meine MODs für phpBB runterladen.
Pathologe

Beitrag von Pathologe »

Wenn sowas ausgereift ist, fasse es doch alles zusammen, und mache einen MOD raus, aber bitte mit Anleitung für Noobs!!! :D
Benutzeravatar
S2B
Ehemaliges Teammitglied
Beiträge: 3258
Registriert: 10.08.2004 22:48
Wohnort: Aachen
Kontaktdaten:

Beitrag von S2B »

Gruß, S2B
Keinen Support per ICQ/PM!
Hier kann man meine PHP-Skripte und meine MODs für phpBB runterladen.
Antworten

Zurück zu „Coding & Technik“