Basierend auf vielen Artikeln, die dem Botovodam gewidmet waren ...
Kürzlich habe ich ein interessantes Projekt „schlüsselfertig“ entwickelt, das sich dem sozialen Netzwerk vk.com widmet. Die Aufgabe ist einfach: Erstellen Sie einen Bot, der der Konversation hinzugefügt werden kann und der zufällige Anführungszeichen enthält. Aber es schien zu einfach, also musste ich den großen Philosophen Friedrich Nietzsche wiederbeleben, der aus einem Bot-Overbot einen Bot machen würde ...

Ich habe nichts Kompliziertes darin gesehen, so dass ein Skript dieser Art schnell geschrieben wurde:
Autorisierung -> Lesen von Nachrichten -> Analysieren und Generieren einer Antwort -> AntwortAll dies wurde mit der
Callback API VK v.5.80 erledigt (
nichts Neues )
Der schwierigste Punkt war "Analyse und Reaktionsbildung". Dies ist in der Tat das Wichtigste.
Tatsache ist jedoch, dass ich einen „mehr oder weniger intelligenten Bot“ erstellen wollte, der einfach eine zufällige Phrase aus dem Wörterbuch ausgibt.
"Wie habe ich es gemacht und hat es funktioniert?" - bitte lesen ...
Also fangen wir an!
Grundsätzlich hat der Bot eine recht einfache Funktionalität, die jedoch nur oberflächlich ist. Wenn Sie tiefer gehen, dann ist alles viel komplizierter, weil wir in
PHP (
) schreiben werden
Ich wiederhole, dass ich nicht nur einen Zitatgenerator benötige, also habe ich beschlossen, den Bot nach einer Logik zu fragen. Ich benötige jedoch auch kein neuronales Netzwerk, da das Lernen eine entmutigende Aufgabe ist.
Ich habe das Problem mit Kreativität gelöst, als ich versuchte, den großen Philosophen des 19. Jahrhunderts - Friedrich Nietzsche - wiederzubeleben.
Ja, es ist Nietzsche, der die Rolle des Bots übernehmen wird, und daher werden auch zufällige Zitate schlauer erscheinen.
Aber ich wollte irgendwie den Gesprächspartner und den Bot vereinen, eine Verbindung zwischen ihnen herstellen ...
So wurde die Phrase des Gesprächspartners als Grundlage genommen, die durch Filter in Stichwörter umgewandelt wurde, auf deren Grundlage Sätze aus einer zuvor vorbereiteten Datenbank gefunden wurden.
So, als ob sich die Antwort auf die Frage des Fragestellers gebildet hätte.
Ich habe eine neue Nachricht vom Benutzer erhalten:
Und dann brachte er die Nachricht in einer geeigneten Form, um die Schlüsselwörter hervorzuheben und sie in eine Datenbanksuche einzuspeisen.
Erstens habe ich die Endungen "
a, and, s, am, yami, ah, oh ... " und so weiter vollständig entfernt. Ich habe Satzzeichen und andere Symbole entfernt.
Zweitens habe ich Präpositionen nicht berücksichtigt. Zuerst habe ich die Wörter auf ihre Länge begrenzt - bis zu 3 Buchstaben. Dies war jedoch falsch, da Nietzsches Philosophien von Worten wie "
Gott, Welt, Fels, Jahrhundert usw. " geprägt waren. Nach dem Filtern von Wörtern mit vier Buchstaben gab es außerdem Wörter mit drei Buchstaben, da die Endungen verworfen wurden. Dann beschränkte ich meine Suche nur auf solche Wörter wie: "
über, was, wie, wo, etc. ".
Drittens schrieb Nietzsche mehr in seine eigenen Bücher und ersetzte eingehende Wörter wie "
deine, deine, du, du kannst" durch "meine, meine, ich liebe, ich kann ".
Somit wird eine Art Dialog erhalten.
Außerdem musste eine Basis erstellt werden, ein Wörterbuch mit Phrasen / Zitaten / Aussagen aus Auszügen aus Nietzsches Büchern.
Ich habe Nietzsches Bücher im
txt- Format aus Litern heruntergeladen. Sammelte sie zusammen und dann gefiltert:
1 Zitat = 1 Satz (
verwendet das Trennzeichen als ".", "! ',"? " )
Es stellte sich heraus, dass es sich bei der Basis um diesen Typ handelt:
- , , -
, , , ,
, , : ,
,
Nun, es gibt eine Datenbank und eine gefilterte Nachricht vom Benutzer.
: ", ?"
: " "
Es bleibt das Suchsystem zu befestigen. Dies war schwierig, da unterschiedliche Einstellungen unterschiedliche Ergebnisse ergaben. Und wenn ein Code die richtige Antwort gab, dann gab die andere Anfrage nicht das, was benötigt wurde.
Es wurde beschlossen, keine regulären Ausdrücke zu verwenden, sondern sie zusammen mit integrierten Funktionen wie den folgenden zu verwenden:
substr
stripos
substr_count
und andere Textfunktionen ...
Mit Hilfe langer Vergleichsbedingungen und unendlich langer Zyklen habe ich in etwa das gewünschte Ergebnis erzielt.
Die Suchlogik sieht ungefähr so aus: Gehen Sie jeden Satz durch und suchen Sie die Wörter aus der eingehenden Nachricht, die in diesem Satz enthalten sind.
Wenn das Wort gefunden wird, wird +1 als "Gewicht der Variablen" hinzugefügt.
Je mehr Wörter im Satz gefunden werden, desto größer ist daher das „Gewicht der Variablen“.
Dies legt nahe, dass, wenn die Wörter "Moral und Leben" in einem Satz aus der Datenbank gefunden wurden, dies eine 100% ige Antwort ist, die ausgegeben wird.
Wenn die Wörter jedoch zu dem Thema gehörten und zu 100% zu den Ergebnissen führten, wurde die random () -Methode von der rand () -Methode ausgegeben.
Außerdem waren dies nicht immer kleine Sätze, so dass ich die Antwort grob um solche Stammgäste kürzen musste:
preg_match('/(?:^|\.\s+)([^\.]*?'.$wordpattern.'[^\.]*?\.+)\s+/i', $text , $matches);
Dann ist alles automatisch:
Nachricht senden
$request_params = array( 'message' => $matches[1],
Ich habe zwar nicht den gesamten Code hochgeladen, aber er ist relativ klein. Ziel war es, eine bedarfsgesteuerte Antwortmaschine zu schaffen, anstatt künstlich geschulte Intelligenz.
Sie können den Bot unter
diesem Link testen. Schreib ihm einfach eine Nachricht. Es ist wichtig zu wissen, dass Sie am Anfang des Satzes "Nietzsche" setzen müssen, als ob Sie sich darauf beziehen, nur dann wird der Bot antworten.
Dies ist eine Testversion und daher unvollständig, daher Matten, Jugendjargon, Fehler in Worten usw. - der Bot berücksichtigt dies nicht und die Basis sind nur 10.000 Phrasen.
Als Beispiele kann ich die Dialoge geben:






Fazit: Ja, der Bot hat keine bidirektionale Kommunikation mit dem Benutzer - es ist keine künstliche Intelligenz. Aber in einem Gespräch mit einer großen Anzahl von Teilnehmern wird der Bot ein guter "Gesprächspartner".