Gutes Eliza/Chatbot Tutorial?

Nizomi

Mitglied
Hi,

ich suche ein gutes Tutorial, das erklärt wie man einen Chatbot (oder eben ELIZA) umsetzen kann. Der Bot sollte möglichst mit deutscher Sprache arbeiten
 

Nizomi

Mitglied
Naja, das Problem ist halt das sich die deutsche und englische Sprache ja in einigen Punkten recht stark unterscheiden. Aber ich versuchs mal damit ^^
 
Zuletzt bearbeitet:

NomadSoul

Erfahrenes Mitglied
Probiere es doch erst einmal auf Englisch. Wenn Du das Konzept verstanden hast, wird es dir wesentlich leichter fallen das für die deutsche Sprache zu implementieren.
 

Nizomi

Mitglied
Das Konzept versteh ich im Grunde ja aber englisch ist sehr viel leichter
->
Can I have some food?
-> Why would you want to have some food?
-> Why you like to be able to have some food?

einfach anfang + Anhängsel vom Input

Kann ich etwas zu essen haben?
-> Warum willst du etwas zu essen haben?
-> Warum würdest du gerne etwas zu essen haben?

so, da ist das Problem eben das das was er haben will vor dem "haben" steht, wie macht man nun aber genau fest was man ausschneiden muss? Es könnte ja auch aus 2-3 Wörtern oder so bestehen...
 
A

Amun-Re

Hier mal ein paar Zeilen Code in VB6 wie so etwas gehen könnte Chatbot Nofi. Erforderlich ist ein Ordner Namens "Bot", in denen sich die erforderlichen txt Dateien befinden müssen. Drei Dateien müssen unbedingt vorhanden sein: Unknown.txt, Fragen1.txt und Unbeantwortet.txt .

'#############################
'# Nofi - Bot #
'# Versuchsmuster 02.0 #
'# mit Unbekannt-Speicher #
'# © by Amun-Re 16.10.2009 #
'#############################

'Es handelt sich bei diesem Bot um ein Versuchsmuster, es ist bewußt einfach
'gehalten damit es überschaubar bleibt. Es dient als Grundmodell zum experimentieren.
'In Verbindung mit den beigelegten txt-Dateien haben Sie schon ein funktionierenden
'Chat-Bot. Dieses Versuchsmuster ist Freeware.
'Das Copyright darf nicht entfernt werden !Urheberrechtsschutz!.

'Die Unbeantwortet.txt ist der Speicher für Unbeantwortete Usereingaben.
'#########################################################################
'# In dieser Datei landen alle Usereingaben auf die der Chatbot momentan #
'# keine Antwort parat hat. Sie ist zweigeteilt in schon beantwortete #
'# Fragen oben und unbeantwortete Fragen unten. Die Leerzeile zwischen #
'# beiden Teilen ist ganz wichtig für das funktionieren des Programms #
'# fehlt sie muß der Chatbot die gesammte Datei abarbeiten, was bei #
'# anschellender Größe der selben zu immer langsameren Progamm-Ablauf #
'# führt. Dieser Speicher Unbeantworteter Usereingaben ist eigentlich #
'# das Auffangbecken um die Fragen1.txt zu erweitern, der obere Teil ist #
'# nur ein zusätzliches Fjutscher, so eine Art schnelle Notlösung, die #
'# später dann mal in die Fragen1.txt eingepflegt werden muß. Da dort #
'# die besseren Möglichkeiten der Erkennug stattfinden, hier geht nur #
'# eine Antwort und die Usereingabe muß auch noch Textgleich sein um #
'# erkannt zu werden und die Groß & Kleinschreibung muß stimmen. #
'#########################################################################

Option Explicit

'CommandButton Senden, oder Entertaste gedrückt
Sub Senden_Click()
Dim Antwort As String
Antwort = BotNofi.Ausgabe1(Eingabe.Text)
Ausgabe.Text = Ausgabe.Text & " Du : " & Eingabe.Text & vbNewLine & "Nofi : " & Antwort & vbNewLine
Ausgabe.SelStart = Len(Ausgabe.Text)
Eingabe.Text = ""
Eingabe.SetFocus

End Sub

'Satzerkennung und die Antwortauswahl
Public Function Ausgabe1(ByVal Eingabe As String) As String

'Usereingabe in Großbuchstaben umwandeln um sie zu vergleichen mit der Fragen1.txt
'Text3 ist auf Visible False eingestellt, es dient nur dem Programm als Vergleich
'und wird deshalb bei der Programmausführung auf der Form nicht angezeigt
BotNofi.Text3 = UCase(BotNofi.Eingabe.Text)

'suchen der Usereingabe auf übereinstimmung in Fragen1.txt
'in welcher Zeile steht der Suchtext (Usereingabe)
Dim Zeile As String
Zeile = ShowLine(App.Path & "\Bot\Fragen1.txt", BotNofi.Text3)

'wen gefunden dann nächste drauf folgende Zeile ausgeben
On Error Resume Next 'wen nicht wird die nächste Zeile übersprungen
Dim AusgabeZeile As String, AusgabeZeile0 As String

'die AusgabeZeile ist die Zeile die auf die gefundene Zeile folgt
AusgabeZeile = ReadLine(App.Path & "\Bot\Fragen1.txt", (Zeile + 1))

'die AusgabeZeile0 ist die Zeile, die in der Fragen1.txt mit der User-Eingabe
'übereinstimmt, sollte es keine Übereinstimmung geben bleibt die Zeile leer
AusgabeZeile0 = ReadLine(App.Path & "\Bot\Fragen1.txt", (Zeile))

'deshalb fragen wir ab ob die User-Eingabe überhaupt in der Fragen1.txt vorhanden ist
If AusgabeZeile0 = Text3.Text Then

' ist dies der Fall, wird die AusgabeZeile ausgegeben
Ausgabe1 = AusgabeZeile

'steht in dieser Zeile ein txt Ordner z.B "$Gruß.txt"
If AusgabeZeile Like "$*.txt" Then

'Name von txt Ordner feststellen
Dim Name_txt As String
Dim lPos As Long
lPos = InStr(AusgabeZeile, "$")
Name_txt = Mid(AusgabeZeile, lPos + 1)

'Zufallszeile aus diesem txt Ordner ausgeben
Dim sPath As String
sPath = App.Path & "\Bot\" & Name_txt
Ausgabe1 = GetLine(sPath)

End If
'ist die Ausgabe1 leer das heißt die Fragen1.txt enthält keine
'Zeile, die genauso wie die User-Eingabe ist gehts weiter im Programm

Else

'Da man nie vorhersehen kann was der User fragen wird, wir aber ein großes
'Spektrum abdecken wollen, sind in der Fragen1.txt Worte mit + Zeichen
'verbunden, um diese mit Like aus der Usereingabe zu filtern

'Zeilennummer der ersten Plusverkettung feststellen
Dim ZeileNr As String
ZeileNr = ShowLine(App.Path & "\Bot\Fragen1.txt", "+")

Do 'Vergleichsschleife Anfang für Plusverkettungen in der Fragen1.txt

Dim String0 As String, String1 As String
'Text der ersten + ZeilenNr der Fragen1.txt feststellen
String0 = ReadLine(App.Path & "\Bot\Fragen1.txt", ZeileNr)

'austauschen der Pluszeichen gegen den Platzhalter "*"
String1 = Replace(String0, "+", "*")

'sind im Text3 die mit Plusverketteten Worte vorhanden
If BotNofi.Text3 Like String1 = True Then
Exit Do 'Vergleichsschleife verlassen
End If

'wen nicht enthalten um Zwei erhöhen und Schleife erneut durchlaufen
If BotNofi.Text3 Like String1 = False Then
'Zeilennummer um 2 erhöhen
ZeileNr = (ZeileNr + 2)
End If

DoEvents 'wärend der Schleifendurchläufe anderen Programmen die Möglichkeit
'geben auf Eingaben zu reagieren um Windows nicht zu blockieren

'ist das Ende der Fragen1.txt erreicht dann
If String0 = "|Ende|" Then
Exit Do 'Vergleichsschleife verlassen
End If

Loop 'Vergleichsschleife Ende

'sind im Text3 die mit + verketteten Worte enthalten
If BotNofi.Text3 Like String1 = True Then

' nächste drauf folgende Zeile ausgeben
Ausgabe1 = ReadLine(App.Path & "\Bot\Fragen1.txt", (ZeileNr + 1))

'steht in dieser Zeile ein txt Ordner z.B "$Gruß.txt"
If Ausgabe1 Like "$*" Then

'Name von txt Ordner feststellen
Dim Name_tx As String, lPoss As Long

lPoss = InStr(Ausgabe1, "$")
Name_tx = Mid(Ausgabe1, lPoss + 1)

'Zufallszeile aus diesem txt Ordner ausgeben
Dim sPat As String
sPat = App.Path & "\Bot\" & Name_tx
Ausgabe1 = GetLine(sPat)

End If

Else 'wen bis jetzt nichts zugetroffen hat gehts weiter

' hat der User eine Leerzeile eingegeben, dann Zufall von Case 0 - 7 ausgeben
If Text3 = "" Then
Randomize
Select Case Int(Rnd * 7)
Case 0:
Ausgabe1 = "Sie müssen was eingeben und Enter drücken, auf Leerzeilen kann ich nicht antworten."
Case 1:
Ausgabe1 = "Ohne Eingabe keine Ausgabe!, so ist das.!"
Case 2:
Ausgabe1 = "Leerzeile, ne auf sowas antworte ich nicht"
Case 3:
Ausgabe1 = "Auf Leer sage ich auch nur leer!, was sonst!"
Case 4:
Ausgabe1 = "Ja Leerzeilen tippen sich am schnellsten, nur gibs darauf keine vernümpftige Antwort."
Case 5:
Ausgabe1 = "Gib leer ein und Du bekommst Leer zurück, ganz einfach."
Case 6:
Ausgabe1 = "Wo Leer steht ist auch Leer drin, ne immer diese Leere."
Case 7:
Ausgabe1 = "In drei Teufelsnamen, was soll ich auf leer antworten, vieleicht mit Unendliche Leere?!."
End Select

Else
'Baustelle Speicher ########################################

'Unbeantwotet txt-Datei auf übereinstimmung prüfen
'gibt es in der Datei eine Zeile mit einen sekrechten Strich
Dim UnbekanntZeileNr As String
UnbekanntZeileNr = ShowLine(App.Path & "\Bot\Unbeantwortet.txt", "|")

'Patzhalter an die Usereingabe anfügen für den Like Vergleich
Eingabe = Eingabe & "*"

Do 'Vergleichsschleife Anfang für Senkrechten Strich in der Unbekannt txt-Datei

Dim StringX As String
'Text der ersten UnbekanntZeileNr feststellen
StringX = ReadLine(App.Path & "\Bot\Unbeantwortet.txt", UnbekanntZeileNr)

'sind in der Unbeantwortet.txt schon die Usereingabe Worte vorhanden
If StringX Like Eingabe Then
Exit Do 'Vergleichsschleife verlassen
Else ' ansonsten
'Zeilennummer um 1 erhöhen und Schleife erneut durchlaufen
UnbekanntZeileNr = (UnbekanntZeileNr + 1)
End If

DoEvents 'wärend der Schleifendurchläufe anderen Programmen die Möglichkeit
'geben auf Eingaben zu reagieren um Windows nicht zu blockieren

'ist das Ende der Unbeantwortet.txt erreicht dann
If StringX = "" Then 'wen der String leer ist
Exit Do 'Vergleichsschleife verlassen
End If

Loop 'Vergleichsschleife Ende

'Like filtert die Zeilen der Unbeantwortet.txt ob die Usereingabe
'schon beantwortet ist, die Antwort steht hinter dem senkrechten Strich
If StringX Like Eingabe Then

'in welcher Zeile steht der Suchtext
Dim Gefunden As String
Gefunden = ReadLine(App.Path & "\Bot\Unbeantwortet.txt", UnbekanntZeileNr)

'Der senkrechte Strich trennt die Eingabe von der Antwort
Dim pos As String
pos = InStr(Gefunden, "|")
'wen gefunden alles hinter dem senkrechten Strich Ausgeben
Ausgabe1 = Mid(Gefunden, pos + 1)

Else 'wen bis jetzt keine Antwort gefunden wurde gehts weiter

'den angehängten Platzhalter aus der Usereingabe entfernen vor dem Speichern
Eingabe = Left(Eingabe, InStr(1, Eingabe, "*") - 1)

'Speichern der Eingabe auf die Nofi keine Antwort hat um sie manuell einzupflegen
'+++ Achtung räumen Sie diese Unbeantwortet.txt Datei ständig auf +++
'durch löschen der Zeilen, oder schreiben Sie ein senkrechten Strich und eine Antwort
Dim App1 As String, fFile As Integer
fFile = FreeFile
'Speicher-Datei bekannt geben
App1 = App.Path & "\Bot\Unbeantwortet.txt"
'Datei zum "Anhängen" von Daten öffnen
Open App1 For Append As #fFile
'und neue Textzeile anfügen
Print #fFile, Eingabe
Close #fFile
'Baustelle Speicher Ende ####################################################

'weil gar nichts zugetroffen hat eine Zufallszeile aus dem Unknown.txt Ordner ausgeben
Dim sPath1 As String
sPath1 = App.Path & "\Bot\Unknown.txt"

'Zufällige Zeile:
Ausgabe1 = GetLine(sPath1)
'End If
End If
End If
End If
End If
End Function

'Zeilennummer des Suchtextes in einer Textdatei feststellen
Private Function ShowLine(ByVal xFile As String, ByVal xSuchText As String) As String
Dim FF As Integer
Dim xBuf As String
Dim xPos As Long
Dim xZeile As String

FF = FreeFile
Open xFile For Binary As FF
xBuf = Space(LOF(FF))
Get FF, 1, xBuf
Close FF

xPos = InStr(1, xBuf, xSuchText, vbTextCompare)
If xPos = 0 Then
ShowLine = xSuchText & " nicht gefunden!"
Exit Function
End If

xZeile = UBound(Split(Left$(xBuf, xPos), vbCr)) + 1
'Zeilennummer
ShowLine = xZeile

End Function

' Lesen einer bestimmten Zeile aus einer Textdatei
Public Function ReadLine(ByVal sFile As String, _
Optional ByVal nLine As Long = 1) As String

Dim sLines() As String
Dim oFSO As Object
Dim oFile As Object

' Fehlerbehandlung aktivieren
On Error GoTo ErrHandler

' Verweis auf das FileSystemObject erstellen
Set oFSO = CreateObject("Scripting.FileSystemObject")

' Existiert die Datei überhaupt?
If oFSO.FileExists(sFile) Then
' Datei öffnen
Set oFile = oFSO.OpenTextFile(sFile)
' Alles lesen und in Array zerlegen
sLines = Split(oFile.ReadAll, vbCrLf)
' Datei schließen
oFile.Close

Select Case Sgn(nLine)
' (nLine > 0)
Case 1
' n-te Zeile von vorne beginnend
ReadLine = sLines(nLine - 1)
' (nLine < 0)
Case -1
' n-te Zeile von hinten beginnend
ReadLine = sLines(UBound(sLines) + nLine + 1)
End Select
End If

ErrHandler:
' Objekte zerstören
Set oFile = Nothing
Set oFSO = Nothing
End Function

'Zufallszeile aus einer Text Datei ausgeben
Private Function GetLine(ByVal FileName As String) As String
Dim Count As Long
Dim sRows() As String
Dim FNr As Integer
FNr = FreeFile
Randomize Timer
Count = 0
ReDim sRows(Count)
Open FileName For Input As #FNr
Do While (Not (EOF(FNr)))
Count = Count + 1
ReDim Preserve sRows(Count)
Line Input #FNr, sRows(Count)
Loop
Close #FNr

'GetLine = Zufällige Zeile
GetLine = sRows(Int(Rnd * Count))
End Function

'################################################################################
'Es verblüfft wie mann in VISUAL BASIC 6 mit ein paar Zeilen Code und
'txt-Dateien ein funktionierenden Chatbot erstellen kann, der auf jede
'Eingabe eine Antwort parat hat.

'Wie Intelligent Ihr damit erstellter Chatbot sein wird bestimmen Sie, und das
'ganz ohne Programmier-Kenntnisse. Dazu schauen Sie sich die Datei "Fragen1.txt"
'genau an. Dort stehen Sätze in Grossbuchstaben, und in der nächsten darauf
'folgenden Zeile steht die Antwort die der Bot ausgeben wird. Wen dort eine
'txt-Datei steht, wird der Bot aus dieser eine Zufallszeile ausgeben. Findet er
'keinen passenden Satz in der "Fragen1.txt" gibt er einfach eine Zufallszeile
'aus der txt-Datei "Unknown" aus und speichert die unbekannte Eingabe.

'Mit Plusverkettungen können Sie auch ungenaue, oder einfach Worte im Satz
'erkennen lassen. z.B. +WELCHE+SCHULE+GEHST+, kommen diese Worte in der
'Usereingabe vor erkennt sie der Bot. z.B. "In welche schule gehst du zur zeit."
'Achten Sie darauf das die zu erkennenden Worte in der Fragen1.txt immer
'groß geschrieben werden, die Antworten können geschrieben sein wie sie wollen,
'aber nicht durchgehend in Großbuchstaben. Setzen Sie die Plusverkettungszeilen
'in der Fragen1.txt immer ans Ende, damit die Like-Vergleichsschleife nicht die
'gesammten Zeilen durchlaufen muß, sonst dauert es unendlich lange bis der Bot
'antwortet. Wen der Bot gar nicht antwortet haben Sie sich im Zeilenwust vertan.

'Beispiel: Usereingabe "Hallo" ,der Bot soll "Hallo" erkennen und eine Begrüssung
'ausgeben. Dann muß in der "Fragen1.txt" Hallo in Grosbuchstaben geschrieben
'stehen "HALLO". Und in der darauf folgenden Zeile muss die Antwort stehen,
'entweder nur ein Wort z.B. "Tach" oder eine vorhandene txt-Datei z.B."$Grus.txt"
'oder ein ganzer Satz. Auf diese Art und Weise können Sie jede Eingabe erkennen
'lassen und mit guten ausgesuchten Textzeilen, die zu alles passen in der
'txt-Datei "Unknown" wird Ihr Chatbot unschlagbar. Achtung die txt-Dateien
'müssen sich im Ordner "Bot" befinden, der im selben Ordner wie Nofi-Bot ist.

'Alles was Nofi noch nicht beantwoten kann landet in der Datei Unbeantwortet.txt und
'kann dann manuell bearbeitet werden, so kann der Bot an jeden Wortschatz des
'Chatter angepasst werden. +++ Achtung räumen Sie diese txt Datei ständig auf.+++
'Entweder Sie Löschen die Zeilen oder schreiben einen senkrechten Strich und
'eine intelligente Antwort dahinter, die der Bot beim nächtenmal dann ausgibt.
'###################################################################################
'# mfg Amun-Re #
'###############

'-----------------------------------------------------------------------------------------

'Nun zum Aufbau der Fragen1.txt

'setzt Sie die Zeilen mit den Plusverkettungen ans Ende
'der Fragen1.txt das macht das Programm schneller

'achten Sie darauf das hinter dem zu erkennenden Wort oder
'Satz sich keine Leerzeile befindet sonst erkennt es der Bot nicht
'prüfen kann man das in dem man den Text markiert (einfärbt)
'dasselbe gilt auch für eine "$***.txt" Ordner Zeile

'Die küzeren Sätze müssen immer zu erst in der Datei stehen,
'das macht das Programm flüssiger
'z.B. der Bot soll Witz erkennen und ein Witz ausgeben,
'dann sehen die Zeilen so aus:

WITZ
$Witze.txt
EIN WITZ
$Witze.txt
HAU MAL EIN WITZ Rein
$Witze.txt
+SAG+EIN+WITZ+
$Witze.txt

'-----------------------------------------------------

'Hier mal ein paar Beispiel-Zeilen für eine Fragen1.txt:

'-----------------------------------------------------

HELLO
$Grus.txt
TACH
$Grus.txt
HI
$Grus.txt
HALLO
$Grus.txt
GUTEN MORGEN
$Grus.txt
WIEDERSEHEN
$BAY.txt
AUF WIEDERSEHEN
$BAY.txt
BIS BALD
$BAY.txt
MAN SIEHT SICH
$BAY.txt
WARMDUSCHER
$Beschimpf.txt
BLÖDER BOT
$Beschimpf.txt
DEUTSCHLAND
Deutschland ist mitten in Europa
NE LASS MA
Nö wieso soll ich das lassen?
WIESO DAS
Weil ich das sage!
FALSCH VERSTANDEN
kann sein!
FALSCH GELESEN
kann schon sein!
UND DANACH
weiss ich nicht!
UND MORGEN
wer weiss schon was Morgen ist!
IST ES GUT
him ja ist es!
WAS GEHT
Alles mit beinen!
WAS GEHT AB
Alles was nicht fest ist!
SPRUCH
$Spruch.txt
EIN SPRUCH
$Spruch.txt
WITZ
$Witze.txt
EIN WITZ
$Witze.txt
+WIE+DEIN+IQ+
$klugheit.txt
+WAS+DEIN+IQ+
$klugheit.txt
+WAS+DEIN+INTELLIGENZQUOTIENT+
$klugheit.txt
+WIE+DEIN+INTELLIGENZ+QUOTIENT+
$klugheit.txt
+SAG+EIN+SPRUCH+
$Spruch.txt
+GIB+SPRUCH+AUS+
$Spruch.txt
+SAG+EIN+WITZ+
$Witze.txt
+ERZÄHL+EIN+WITZ+
$Witze.txt
|Ende|

'Das ist die Endmakierung, sie ist ganz wichtig nie vergessen das Ende der Fragen1.txt zu markieren.
'----------------------------------------------------------------------------------------------------------------------------------------

Inhalt der Unbeantwortet.txt:

oha|Nee waa
eh mann|He Mann
so so|jo Do
eh wat|ein bischen Watt ham wa noch im Keller
klaro Alta|geht ab Digga

#########################################################################
# In dieser Datei landen alle Usereingaben auf die der Chatbot momentan #
# keine Antwort parat hat. Sie ist zweigeteilt in schon beantwortete #
# Fragen oben und unbeantwortete Fragen unten. Die Leerzeile zwischen #
# beiden Teilen ist ganz wichtig für das funktionieren des Programms #
# fehlt sie muß der Chatbot die gesammte Datei abarbeiten, was bei #
# anschellender Größe der selben zu immer langsameren Progamm-Ablauf #
# führt. Dieser Speicher Unbeantworteter Usereingaben ist eigentlich #
# das Auffangbecken um die Fragen1.txt zu erweitern, der obere Teil ist #
# nur ein zusätzliches Fjutscher, so eine Art schnelle Notlösung, die #
# später dann mal in die Fragen1.txt eingepflegt werden muß. Da dort #
# die besseren Möglichkeiten der Erkennug stattfinden, hier geht nur #
# eine Antwort und die Usereingabe muß auch noch Textgleich sein um #
# erkannt zu werden und die Groß & Kleinschreibung muß stimmen. #
#########################################################################
was ist jetzt los
na ja wen es die Finger mitmachen
wat ist jetzt
hi ho der Jo
aber immer
sprache verschlagen
waas geht
aber hallo
vergiss es
'------------------------------------------------------------------------------------------------------------------------------------------

Inhalt der Unknown.txt:

Zuerst schließen wir die Augen, und dann sehen wir weiter
*brrrrrrr* *bing*
Jetzt gerät es einwenig ausser Kontrolle
Ich schwelge einwenig in Einfallslosigkeit
Hossa!!
Achtung Umdrehen Hinter dir! Ah reingefallen
Weeeee!
*denk*
Das interessiert mich derzeit gar nicht!
Boah schreib ich heute wieder einen Mist zusammen
Toller Spruch
Du bist echt komisch, wenn ich dir das mal so sagen darf!
*narf*
Bin voll traurig! Keiner mag mich,....
Piu******
Pssst! Ey ... brauchst du Sprüche ?
Hasta la vista!
Na ja, der letzte Beitrag war ja mal voll fürn' A....!
Fuddel die Futt!
sorry wegen tippfehlern
im mom seh ich net mehr viel
ja nee is klar ;)
Hauptsache mal was geschreiben, oder?!
*iiikkkks*
Ey... was hast du nochmal geschrieben ?
Alles Bio-Hip-Kulturen !
Drück mal die "Alt + F4 Taste" !
Alles Bifi oder was?
Ach Du dicker Troll!
*möp*
Fehler gefunden.
denkst du dasselbe wie ich ?

'---------------------------------------------------------------------------------------------------------------------------------------
na dann mal viel Spass beim ausprobieren.

'mfg Amun-Re