Seite 2 von 2

Verfasst: 01.02.2006 15:44
von Green Snake
Sicher mehr als 200, da Waponez II schon 500 Zeilen hat ;)
es sollte also locker gehen, den code zu kompilieren (auch wenn er eingerückt ist)

aber es kommt höchstwarscheinlich gar nicht auf die zeilen an (gibt ja schon genug topics)

Verfasst: 01.02.2006 15:54
von Konne

Code: Alles auswählen

 For i = 0 To num-1
    Wort$(i) = StringField(text$, i + 1, " ")
    ;Wort für Wort analysieren und Synonyme vereinheitlichen
    If FindString (Wort$(i),"nehm",1) : Wort$(i)="nimm"
    ElseIf Wort$(i)="schwert"Or Wort$(i)="messer"Or Wort$(i)="saebel"Or Wort$(i)="degen"Or Wort$(i)="stichwaffe"Or Wort$(i)="dolch" : Wort$(i)="messer"
    ElseIf Wort$(i)="gehen"Or Wort$(i)="gehe"Or Wort$(i)="ging"Or Wort$(i)="laufe"Or Wort$(i)="wandern"Or Wort$(i)="schreite"Or Wort$(i)="schleichen" : Wort$(i)="gehen"
    ElseIf FindString (Wort$(i),"nord",1)Or FindString (Wort$(i),"sued",1)Or FindString (Wort$(i),"west",1)Or FindString (Wort$(i),"ost",1) : Wort$(i)="Richtung"
    ElseIf FindString (Wort$(i),"movie",1)Or FindString (Wort$(i),"streifen",1) : Wort$(i)="film"
    ElseIf FindString (Wort$(i),"gucken",1)Or FindString (Wort$(i),"schauen",1): Wort$(i)="sehen"
    EndIf
    Ausgabe$ = Ausgabe$ + Wort$(i) + " " : Debug (Ausgabe$)
  Next
kannst du durch replacestring ersetzen

Verfasst: 01.02.2006 15:59
von Macros
Hier der Code gekürzt und eingerückt:

Code: Alles auswählen

OpenConsole()
PrintN( "HALLO")
PrintN( "BEENDEN KANNST DU DIES PROGRAMM MIT - quit" )
PrintN ( "Wie geht es Dir - USER ?" )
Global Ausgabe$
Procedure String(text$)
  If FindString(Ausgabe$, text$, 1)
    ProcedureReturn 1
  Else
    ProcedureReturn 0
  EndIf
EndProcedure
Repeat
  PrintN("")
  ConsoleColor(13,0)
  text$ = LCase(Trim(Input())) : PrintN("")
  If text$ = ("quit") : End
  EndIf
  text$=RemoveString (RemoveString (RemoveString (RemoveString (RemoveString (RemoveString (text$,","),"."),";"),":"),"!"),"?")
  num = CountString(text$, " ") + 1
  Dim Wort$(num)
  For I = 0 To num-1
    Wort$(I) = StringField(text$, I + 1, " ")
    If FindString (Wort$(I),"nehm",1) : Wort$(I)="nimm"
    ElseIf Wort$(I)="schwert"Or Wort$(I)="messer"Or Wort$(I)="saebel"Or Wort$(I)="degen"Or Wort$(I)="stichwaffe"Or Wort$(I)="dolch" : Wort$(I)="messer"
    ElseIf Wort$(I)="gehen"Or Wort$(I)="gehe"Or Wort$(I)="ging"Or Wort$(I)="laufe"Or Wort$(I)="wandern"Or Wort$(I)="schreite"Or Wort$(I)="schleichen" : Wort$(I)="gehen"
    ElseIf FindString (Wort$(I),"nord",1)Or FindString (Wort$(I),"sued",1)Or FindString (Wort$(I),"west",1)Or FindString (Wort$(I),"ost",1) : Wort$(I)="Richtung"
    ElseIf FindString (Wort$(I),"movie",1)Or FindString (Wort$(I),"streifen",1) : Wort$(I)="film"
    ElseIf FindString (Wort$(I),"gucken",1)Or FindString (Wort$(I),"schauen",1): Wort$(I)="sehen"
    EndIf
    Ausgabe$ = Ausgabe$ + Wort$(I) + " " : Debug (Ausgabe$)
  Next
  ConsoleColor(14,0) : PrintN("")
  If String ("mir")And String ("geht")And String ("gut") : PrintN ( "Das freut mich zu hoeren, das es Dir gut geht USER.")
  ElseIf String ("bist")And String ("du") And String ("da") : PrintN ( "Ja, wo soll ich denn sonst sein." )
  ElseIf String ("film")And String ("sehen") : PrintN ( "Was willst Du denn fuer einen Film sehen ?" )
  ElseIf String ("geht")And String ("dir") : PrintN ( "Danke der Nachfrage - USER." )
  ElseIf String ("fuehle")And String ("wohl") : PrintN ( "Ich bin erfreut, dass Du dich wohl fuehlst." )
  ElseIf String ("geht")And String ("gut") : PrintN ( "Ich bin erfreut das es Dir gut geht." )
  ElseIf String ("geht")And String ("so") : PrintN ( "Vieleicht geht es Dir besser, wenn Du Dir einen Spielfilm ansiehst." )
  ElseIf String ("nachfrage") : PrintN ("Es freut mich, dass es Dir gut geht.")
  ElseIf String ("gut") : PrintN ("Schoen zu hoeren, das es Dir gut geht.")
  Else : ConsoleColor (15,0) : PrintN ( "Das Thema lautet FILM, deswegen habe ich Deine Eingabe nicht verstanden - USER." )
  EndIf
  Ausgabe$ = ""
ForEver
CloseConsole()

Verfasst: 01.02.2006 16:31
von Kiffi
hier auch noch mal ein Vorschlag von mir:

Zur Erläuterung: Im Replacements-Array stehen die Begriffe, die ersetzt
werden sollen (mit Semikolon getrennt). Es wird immer mit dem jeweils
letzten Wort des Strings ersetzt.

Das ist für's erste schon mal eine kleine Erleichterung, dennoch bin ich der
Meinung, dass Du mit Deinem Textparser in dieser Form schnell an die
Grenzen des Machbaren stossen wirst.

Code: Alles auswählen

OpenConsole()
;Hallo, sagt das Programm
PrintN( "HALLO" )
PrintN( "BEENDEN KANNST DU DIES PROGRAMM MIT - quit" )
PrintN ( "Wie geht es Dir - USER ?" )
;Globaliere String$
Global Ausgabe$
Procedure String(text$)
  If FindString(Ausgabe$, text$, 1)
    ProcedureReturn 1
  Else
    ProcedureReturn 0
  EndIf
EndProcedure
;Beginn der Endlos - Schleife
Repeat
  PrintN("")
  ConsoleColor(13,0)
  ;Texteingabe
  text$ = Input() : PrintN("")
  ;Entfernt Space von Beginn & Ende des Strings
  text$ = Trim(text$)
  ;Konvertiert alle Grossbuchstaben in Kleinbuchstaben
  text$ = LCase(text$)
  If text$ = ("quit") : Break : EndIf
  
  ;Satzzeichen , . ; : ! ? werden ermittelt und entfernt
  text$ = RemoveString (text$,",")
  text$ = RemoveString (text$,".")
  text$ = RemoveString (text$,";")
  text$ = RemoveString (text$,":")
  text$ = RemoveString (text$,"!")
  text$ = RemoveString (text$,"?")
  
AnzahlReplacements=5

  Dim Replacements$(AnzahlReplacements)
  Replacements$(0)="nehm;nimm"
  Replacements$(1)="schwert;messer;saebel;degen;stichwaffe;dolch;messer"
  Replacements$(2)="gehen;gehe;ging;laufe;wandern;schreite;schleichen;gehen"
  Replacements$(3)="nord;sued;west;ost;Richtung"
  Replacements$(4)="movie;streifen;film"
  Replacements$(5)="gucken;schauen;sehen"
  
  Ausgabe$ = ""
  
  ;String wird in einzelne Woerter geteilt
  num = CountString(text$, " ") + 1
  Dim Wort$(num) ; num viele elemente (0 bis num-1)
  For I = 0 To num-1
    
    ;Wort für Wort analysieren und Synonyme vereinheitlichen
    
    Wort$(I) = StringField(text$, I + 1, " ")
    
    For r_Counter = 0 To AnzahlReplacements
      If Replacements$(r_Counter) <> ""
        For w_Counter = 1 To CountString(Replacements$(r_Counter), ";")
          If Wort$(I) = StringField(Replacements$(r_Counter), w_Counter, ";")
            Wort$(I) = StringField(Replacements$(r_Counter), CountString(Replacements$(r_Counter), ";")+1, ";")
          EndIf
        Next
      EndIf
    Next  
    
    Ausgabe$ + Wort$(I) + " "
    
  Next
  
  Debug Ausgabe$
  
  ConsoleColor(14,0) : PrintN("")
  ;Ausgabe der Antwort, anhand von Schlüsselwörtern - 3 WÖRTER
  If String ("mir")And String ("geht")And String ("gut") : PrintN ( "Das freut mich zu hoeren, das es Dir gut geht USER.")
  ElseIf String ("bist")And String ("du") And String ("da") : PrintN ( "Ja, wo soll ich denn sonst sein." )
    ;Ausgabe der Antwort anahnd von Schlüsselwörtern - 2 WÖRTER
  ElseIf String ("film")And String ("sehen") : PrintN ( "Was willst Du denn fuer einen Film sehen ?" )
  ElseIf String ("geht")And String ("dir") : PrintN ( "Danke der Nachfrage - USER." )
  ElseIf String ("fuehle")And String ("wohl") : PrintN ( "Ich bin erfreut, dass Du dich wohl fuehlst." )
  ElseIf String ("geht")And String ("gut") : PrintN ( "Ich bin erfreut das es Dir gut geht." )
  ElseIf String ("geht")And String ("so") : PrintN ( "Vieleicht geht es Dir besser, wenn Du Dir einen Spielfilm ansiehst." )
    ;Ausgabe der Antwort, anhand von Schlüsselwörtern - 1 WORT
  ElseIf String ("nachfrage") : PrintN ("Es freut mich, dass es Dir gut geht.")
  ElseIf String ("gut") : PrintN ("Schoen zu hoeren, das es Dir gut geht.")
  Else : ConsoleColor (15,0) : PrintN ( "Das Thema lautet FILM, deswegen habe ich Deine Eingabe nicht verstanden - USER." )
  EndIf
  
ForEver
CloseConsole()

Verfasst: 01.02.2006 17:43
von Ironsmurf
wie meinst du das, das ich schnell an die Grenzen stoßen werde.
Für Denkanstöße in die richtige Richtung bin ich jederzeit offen und hoffe daraus auch lernen zu können.

Danke

Verfasst: 01.02.2006 18:16
von Kiffi
> wie meinst du das, das ich schnell an die Grenzen stoßen werde.

nun ja, die menschliche Sprache ist bekanntermaßen ziemlich komplex.
Einen Programmcode zu schreiben, der die Grundbegriffe einigermassen
akzeptabel bewältigen kann, ist ein nicht zu unterschätzendes Projekt.

Da reicht es nicht, möglichst viele Wörter in den Code einzuhacken und
verschiedene Kombinationen abzufragen (weil der Anwender mit
Sicherheit eine nicht im Code vorhandene Wortkombination eingeben
wird).

Man muss also die Eingabe nach Nomen, Verben und Adjektive
aufschlüsseln. Idealerweise setzt man die Benutzereingaben in einen
Kontext, sodass ein 'richtiges Gespräch' zustande kommen kann.

Computer: "Wie geht es Dir"
Mensch: "Gut! Und Dir?"
Computer: "Danke der Nachfrage, mir geht es auch gut"

Es ist mir schon klar, dass Du mit Deinem Programm jetzt nicht den
ultimativen und alles verstehenden Konversations-Bot schreiben möchtest,
aber selbst für einfache Unterhaltungen muss man schon tief in die
Trickkiste greifen.

Ich persönlich würde jedenfalls keine 10 Sekunden mit einem Programm
arbeiten wollen, dessen jede zweite Ausgabe ein 'Das Thema lautet FILM,
deswegen habe ich Deine Eingabe nicht verstanden' ist ;-)

> Für Denkanstöße in die richtige Richtung bin ich jederzeit offen und hoffe
> daraus auch lernen zu können.

dann google mal ein wenig mit den Begriffen 'eliza, conversation, bot,
tutorial'.

Grüße ... Kiffi