Chatbot "gehversuche"

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Boby666666
User
Beiträge: 57
Registriert: Montag 8. Januar 2007, 10:53
Kontaktdaten:

Hallo!
Ich wollte gerne zum üben und um ihn sicher später auch mal einzusetzen, einen Chatbot schreiben. Das geht auch bislang noch ganz gut, aber nun stehe ich vor einem kleinen Problem. Unzwar soll der Chatbot unterscheidenkönnen ob jemand böse oder gut mit ihm redet. Dazu habe ich das 'Objekt "nett"' hinzugefügt. jedoch möchte das irgendwie nicht so wie ich!
Hat da vieleicht mal jemand ne Hilfestellung?

Code: Alles auswählen

# -*- coding: cp1252 -*-
# Beratung
# Chatbot Verison 0.1
# Änderungen erwünscht

from Tkinter import *
from random import randint
from re import *
# Ordner zum speichern anlegen
try:
    makedirs('/' + 'tgdaten')
    print 'Verzeichniss wurde angelegt.'
except:
    print 'TG_Bot Version 0.01'
# Antwortensammlung
class Beratung (object):
    x1='Bitte lassen Sie die Familie aus dem Spiel.'
    x2='Da sind Sie hier richtig. Vormulieren sie die Frage ohne die Wörter: "Problem" & "Hilfe".'
    x3='Der Administrator von Timeghost.de heißt Bob. Weitere Daten entnehmen Sie dem Impressum.'
    a1a='Am besten, Sie versuchen es mal selbständig mit der FAQ.'
    a1b='Könnten Sie die Eingabe bitte anders formulieren?'
    a1c='Überprüfen Sie bitte Ihre Eingabe!'
    t1='Testest du mich oder soll ich dich testen?'
    t2='Ich mag keine Tests!'
    a2a='Ich denke mein Meister würde etwas dagegen haben.'
    a2b='Bitte nicht in diesem Ton.'
    a2c='Wenn Sie so weiter machen bekommen sie noch ein Preis fürs fluchen.'
    a2d='Das habe ich jetzt einfach mal überlesen.'
    a3='Das Anmelden bei uns ist absolut Kostenlos & birgt viele Vorteile für Sie.'
    a4='Die Verwendung von Cookies auf diesem Forum ist optional, könnte die Benutzung des Forums aber einfacher und komfortabler machen.'
    a5='Alle Einstellungen können hier: "http://www.timeghost.de/forum/usercp.php" problemlos vorgenommen werden.'
    a6a='Gut, danke der Nachfrage.'
    a6b='Eine komische Frage an einen Bot.'
    a6c='Gut und selbst?'
    test=[t1, t2]
    a1=[a1a, a1b, a1c]
    a2=[a2a, a2b, a2c, a2d]
    a6=[a6a, a6b, a6c]
# Programmablauf
    def waehle (self, liste):
        return liste[randint(0, len(liste)-1)]

# Fragenstichwortverzeichniss
    def beantworte(self, eingabe):
        eingabe=eingabe.lower()
        antwort=''
        if eingabe.count('bob')+eingabe.count('admin') > 0:
            self.nett += 1
            antwort += self.x3
            
        elif eingabe.count('problem')+eingabe.count('hilfe') > 0:
            self.nett += 1
            antwort += self.x2
            
        elif eingabe.count('gehts')+eingabe.count('bot') > 0:
            antwort += self.waehle(self.a6)
            self.nett +=1
        elif eingabe.count('cooki')+eingabe.count('cuki') > 0:
            self.nett += 1
            antwort += self.a4
            
        elif eingabe.count('profil')+eingabe.count('einstellungen') > 0:
            self.nett += 1
            antwort += self.a5
            
        elif eingabe.count('regist')+eingabe.count('anmeld') > 0:
            self.nett += 1
            antwort += self.a3
            
        elif eingabe.count('test')+eingabe.count('try') > 0:
            antwort += self.waehle(self.test)
            
        elif eingabe.count('vater')+eingabe.count('mutter') \
                    +eingabe.count('tochter') > 0:
            antwort += self.x1
            
        elif eingabe.count('fuck')+eingabe.count('fick') +eingabe.count('sex') +eingabe.count('leck') +eingabe.count('bitch') +eingabe.count('schlampe') \
                    +eingabe.count('arsch') +eingabe.count('scheiß') +eingabe.count('scheis') +eingabe.count('dreck') +eingabe.count('wix') > 0:
            self.nett -= 1
            antwort += self.waehle(self.a2)
            
            
        else: antwort += self.waehle(self.a1)
        return antwort
        
# Begrüssung
    def __begruessen(self):
        print 'Herzlich willkommen beim ersten HilfeBot von Timeghost.de!'
        print 'Bitte geben Sie ihren Vor- und Nachnamen ein.'
        name=raw_input('Name: ') or 'Mister Unbekannt'
        nachname = name.split()[-1]
        print 'Wie möchten sie gerne angesprochen werden?'
        print ''
        print 'Herr %s oder Frau %s?'%(nachname, nachname)
        anrede = raw_input('Anrede: ') or 'Mister'.split()[0]
        self.d={'anrede':anrede+' '+nachname}
# "Einstellungen"        
    def chat(self):
        zufrieden=0
        self.nett = 100
        self.__begruessen()
        print 'Wie kann ich Ihnen helfen, %(anrede)s?'%self.d
        print ''
        while not zufrieden:
            eingabe=raw_input(': ').lower() or 'keineeingabe'
            if eingabe.count('wiedersehen')+eingabe.count('danke') >0:
                zufrieden = 1
            elif eingabe.count('keineeingabe') >0:
                print 'Zum beenden einfach "Danke" schreiben'
                print ''
            else:
                print self.beantworte(eingabe)
                print 'Was kann ich sonst noch für Sie tun, %(anrede)s, '%self.d
                print ''
        print 'Auf Wiedersehen, %(anrede)s, '%self.d
# Testausgabe um "nett" zu überprüfen
        print 'Danke', self.nett
        
chat=Beratung()
chat.chat()
 
Würde mich sehr freuen wenn ihr mir helfen könntet.

Ps. Kommt BITTE nicht mit dem Vorschlag einen bereits exestierenden Chatbot zu benutzen, da ich das hier alles in erster Linie zum Üben mache!

DANKE!
Zuletzt geändert von Boby666666 am Dienstag 8. Mai 2007, 15:27, insgesamt 2-mal geändert.
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

Boby666666 hat geschrieben:... jedoch möchte das irgendwie nicht so wie ich!
Du musst erstmal um 'nett' in 'chat()' testen zu können vor jedes 'nett' ein self. schreiben, sonst kennt er es in der Funktion nicht.

So weit ich das sehe, setzt er jedesmal wenn du in 'beantworte()' gehst das 'nett' wieder auf 100. So kann es nie höher als auf 101 kommen. Schreib das

Code: Alles auswählen

self.nett = 100
in 'chat()' und werf es aus 'bearbeite()' raus, dann zählt er auch höher.
Ich hoffe mal, dass du den Fehler gemeint hast!

Aber mal ganz abgesehen davon, kann man so überhaupt ein chatbot schreiben, mit dem jeder x beliebige Nutzer was anfangen kann? Wenn man den Quellcode sieht und weiß worauf er anspricht ok, aber sonst?
BlackJack

In dem Quelltext ist zuviel statisch im Programm festgelegt und es steckt viel zuviel Tipparbeit drin.

Alles was in `beantworte()` an Code steht, könnte man in eine Datenstruktur stecken, die von `beantworte()` ausgwertet wird. Die benötigten Daten pro ``elif``-Zweig sind eine Sequenz von Worten, eine Zahl die `self.nett` verändert (kann auch 0 sein) und eine oder mehrere Antworten. Diese Datenstruktur könnte man der Klasse in der `__init__()` übergeben, die übrigens fehlt bzw. `chat()` heisst, und man hätte damit schon einen viel flexibleren Bot. In die `__init__()` gehören alle Initialisierungen, unter anderem auch der Startwert für `nett`.

Du benutzt *-Importe, das ist nicht gut. Man holt sich viele Namen in das Modul die man nicht braucht und kann nicht mehr einfach nachvollziehen wo welcher Name herkommt.

Wenn man `waehle()` durch `auswahl()` ersetzt und das auf englisch übersetzt, hat man übrigends den Namen einer Funktion im `random`-Modul die genau das macht, was Du nachimplementiert hast: `random.choice()`.

Nochmal als Erinnerung: Das Board hat Probleme mit langen Quelltexten. Wenn man von dem Bot noch zwei oder drei veränderte Versionen hier reinstellt, gibt's Probleme. Bitte einen Paste-Dienst wie http://paste.pocoo.org/ für längere Quelltexte benutzen.
Boby666666
User
Beiträge: 57
Registriert: Montag 8. Januar 2007, 10:53
Kontaktdaten:

OK! Danke euch beiden erstmal.

Ich versuche das mal zu ändern...

Und @ BlackJack
Das mit den importieren muss ich erstmal noch genau lernen. Da ich keine ahnung habe was ich daraus brauche nehme ich immer alles. Wenn ich irgend wann mal ein "Profi" bin, dann schaffe ich das vieleicht auch ohne import *...

Und der nächste Code landet auf http://paste.pocoo.org/

!!! Leider lädt er bei mir die Seite endlos ohne sie aufzubauen oder eine Fehlermeldung aus zu geben!!!
Boby666666
User
Beiträge: 57
Registriert: Montag 8. Januar 2007, 10:53
Kontaktdaten:

Habe jetzt mal den Code oben so aktuallisiert wie ich ihn jetzt habe. (Da die Seite http://paste.pocoo.org/ bei mir leider noch nicht funzt)

Leider gibt er mir immernoch einen Fehler aus.

Fehler:

Traceback (most recent call last):
File "C:\Dokumente und Einstellungen\Bob\Desktop\PythonScripts\SprachBot2_mitOrdnererstellung.py", line 120, in <module>
chat.chat()
File "C:\Dokumente und Einstellungen\Bob\Desktop\PythonScripts\SprachBot2_mitOrdnererstellung.py", line 112, in chat
print self.beantworte(eingabe)
File "C:\Dokumente und Einstellungen\Bob\Desktop\PythonScripts\SprachBot2_mitOrdnererstellung.py", line 67, in beantworte
nett += 1
UnboundLocalError: local variable 'nett' referenced before assignment


Was kann ich noch versuchen oder habe ich falsch gemacht?

Ps. Ist es auch möglich das jede Eingabe vom User, in der vorherbestimmten Datei gespeichert wird? So kann ich iden Bot besser vervollständigen.


EDIT:

Habe es hin bekommen...
Jetzt bleibt nur noch meine Ps. Frage ;)
Boby666666
User
Beiträge: 57
Registriert: Montag 8. Januar 2007, 10:53
Kontaktdaten:

Ist es auch möglich das jede Eingabe vom User, in einer vorherbestimmten Datei gespeichert wird?
Wenn ja, kann mir dann mal bitte einer sagen wie ich das bei mir rein gebaut bekomme?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Boby666666 hat geschrieben:Wenn ja, kann mir dann mal bitte einer sagen wie ich das bei mir rein gebaut bekomme?

Code: Alles auswählen

handle = file('dateiname.appendfile', 'a')
handle.write(user_eingabe)
handle.close()
Wie du das einbaust wirst du wohl selber wissen, oder? Wenn nicht, dann solltest du überlegen, das Python-Tutorial durchzuarbeiten.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Boby666666
User
Beiträge: 57
Registriert: Montag 8. Januar 2007, 10:53
Kontaktdaten:

Leonidas hat geschrieben:
Boby666666 hat geschrieben:Wenn ja, kann mir dann mal bitte einer sagen wie ich das bei mir rein gebaut bekomme?

Code: Alles auswählen

handle = file('dateiname.appendfile', 'a')
handle.write(user_eingabe)
handle.close()
Wie du das einbaust wirst du wohl selber wissen, oder? Wenn nicht, dann solltest du überlegen, das Python-Tutorial durchzuarbeiten.
Das ist mal eine sehr gute Idee!!!

Danke!

Ps. Entweder er sagt: User_eingabe ist nicht definiert ODER wenn ich "eingabe" statt "usereingabe" nehme dann schreibt er nichts in die Datei...

Ne Ahnung woran das liegen kann?
Boby666666
User
Beiträge: 57
Registriert: Montag 8. Januar 2007, 10:53
Kontaktdaten:

Entweder er sagt: User_eingabe ist nicht definiert ODER wenn ich "eingabe" statt "user_eingabe" nehme dann schreibt er nichts in die Datei...

Ne Ahnung woran das liegen kann?

Hier nochmal der gesammte NEUE Code! http://paste.pocoo.org/show/1483/
Zuletzt geändert von Boby666666 am Mittwoch 9. Mai 2007, 17:02, insgesamt 1-mal geändert.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Boby666666 hat geschrieben:Das ist mal eine sehr gute Idee!!!

Danke!
Gerne geschehen. Sowas ist nämlich keinesfalls etwas exotisches und kommt in den meisten Tutorials vor.
Boby666666 hat geschrieben:Ps. Entweder er sagt: User_eingabe ist nicht definiert ODER wenn ich "eingabe" statt "usereingabe" nehme dann schreibt er nichts in die Datei...

Ne Ahnung woran das liegen kann?
Wenn das Objekt an das der Name ``eingabe`` gebunden ist ein leerer String ist, dann wird in die Datei nichts geschrieben.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Boby666666
User
Beiträge: 57
Registriert: Montag 8. Januar 2007, 10:53
Kontaktdaten:

Leonidas hat geschrieben: Wenn das Objekt an das der Name ``eingabe`` gebunden ist ein leerer String ist, dann wird in die Datei nichts geschrieben.
Und was heißt das jetzt für mich?
Was sollte ich da auf jeden Fall ändern?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Boby666666 hat geschrieben:Hier nochmal der gesammte NEUE Code! http://paste.pocoo.org/show/1483/
Sieht so aus, als würdest du die Datei auf Modulebene öffnen, sie dann in ``beantworte()`` schließen. In geschlossene Dateien kann man nicht schreiben.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Boby666666
User
Beiträge: 57
Registriert: Montag 8. Januar 2007, 10:53
Kontaktdaten:

Leonidas hat geschrieben: Sieht so aus, als würdest du die Datei auf Modulebene öffnen, sie dann in ``beantworte()`` schließen. In geschlossene Dateien kann man nicht schreiben.
Das verstehe ich jetzt irgendwie überhaupt nicht... :?: :!: :?:
Wo habe ich denn die Datei geschlossen?
bzw. Was kann ich denn dagegen tun?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Boby666666 hat geschrieben:Wo habe ich denn die Datei geschlossen?
Zeile 87. Ich würde dir empfehlen den Code der hier gepostet wird vorher zu lesen und nicht einfach gedankenlos irgendwo reinkopieren.
Boby666666 hat geschrieben:bzw. Was kann ich denn dagegen tun?
Die Datei öffnen, schreiben, schließen. Wenn du wieder etwas schreiben willst, dann musst du die Datei auch wieder neu öffnen, nachdem sie geschlossen wurde.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

Boby666666 hat geschrieben: Wo habe ich denn die Datei geschlossen?
bzw. Was kann ich denn dagegen tun?
Du schließt die Datei in der letzten Zeile von 'beantworte()' mit dem "handle.close()".
Ich würde diese Zeile ans Ende von 'chat()' schreiben, damit sollte die Datei erst ganz am Ende geschlossen werden.
Boby666666
User
Beiträge: 57
Registriert: Montag 8. Januar 2007, 10:53
Kontaktdaten:

Leonidas hat geschrieben: Zeile 87. Ich würde dir empfehlen den Code der hier gepostet wird vorher zu lesen und nicht einfach gedankenlos irgendwo reinkopieren.
Diese Aussage verstehe ich jetzt irgendwie nicht.
Du schließt die Datei in der letzten Zeile von 'beantworte()' mit dem "handle.close()".
Ich würde diese Zeile ans Ende von 'chat()' schreiben, damit sollte die Datei erst ganz am Ende geschlossen werden.
Das funzt leider auch nicht.

Sonst noch ne Idee?
Ich verzweifel an so ner dummen kleinigkeit.
selbst wenn ich "handle.close()" weg lasse speichert er die Daten nicht.
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

Boby666666 hat geschrieben: ...selbst wenn ich "handle.close()" weg lasse speichert er die Daten nicht.
Dann hast du wohl noch ein anderes Problem.
Wo sagst du denn deinem Programm, in welche Datei er die Daten schreiben soll?
Boby666666
User
Beiträge: 57
Registriert: Montag 8. Januar 2007, 10:53
Kontaktdaten:

Hier nochmal der Code in stark verkürzter Form. http://paste.pocoo.org/show/1484/
Und? Ist der Fehler erkennbar?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Boby666666 hat geschrieben:Und? Ist der Fehler erkennbar?
Ja. Das ``write()`` steht in der Funktion nach dem ``return`` aufgerufen wurde, d.h. wird nie ausgeführt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Boby666666
User
Beiträge: 57
Registriert: Montag 8. Januar 2007, 10:53
Kontaktdaten:

Juhuuuu!
Es funzt!
Wie geil! Die antwort war so einleuchtend und nah.
Ich bin aber auch ein Trottel sonder gleichen.
Aber einen hab ich noch ;)
Das Logfile schreibt nun ohne punkt und komma hintereinander weg. Das macht die Sache nicht gerade einfacher.
Kann man nach jedem Logeintrag, also jedem was er Speichert auch noch ein ENTER oder was machen?
Dann steht jeder Eintrag untereinander!

Also wenn das nicht zuviel des Guten ist dann würde ich mich über den Tip noch freuen :oops:
Antworten