Zum Inhalt springen

Tobias Schulz

Mitglieder
  • Gesamte Inhalte

    15
  • Benutzer seit

  • Letzter Besuch

  1. Wie du selbst gesagt hast, mit einem leeren String (einfach ein QString Objekt, dem du nichts zugewiesen hast). Oder mit einer Klasse, die aber dann ebenfalls einen leeren String enthalten würde. Man muss von dem Gedanken wegkommen, eine perfekte API zu erstellen. Mach es so wie es ohne großen Aufwand machbar ist und so, dass der Code möglichst übersichtlich und logisch bleibt. Und wenn das Thema (der QSTring) leer ist, ist eben kein Thema vorhanden. Gruß Tobias
  2. Wenn du den Parser wirklich auch in andere Programme integrierbar machen willst, ist hier Qt für den Parser eigentlich verkehrt. Denn angenommen, jemand will ihn in ein Gtk- oder rein Shell-basiertes Programm integrieren, dann braucht er trotzdem den "Qt-Klotz". Die Online-Demo von FreeHAL könnte es nicht geben, wenn ich nicht reines C++ verwendet hätte - Qt im CGI-Script, das klingt so, als ob ich einen Bleiakkumulaor für Auto in ein Fahrrad einbauen würde, nur der Beleuchtung wegen - Nein, da reichen ein paar kleine Batterien. Gruß Tobias
  3. Hallo, In diesem Falle hilft der Debugger nicht alleine. Was genau machst du mit diesem "|||||"? Hier sieht man eigentlich schon die Ursache, du hängst einen String an einem anderen an (append) und das löst einen Segmentation fault aus. Das passiert dann, wenn versucht wird, auf eine Speicherstelle zuzugreifen, die dem jeweiligen Programm nicht vom Betriebssystem zugewiesen wurde und ist ein Schutz sowohl für die Stabilität des Gesamtsystems und gegen Auslesen von Daten, die gerade in anderen Programmen verwendet werden. Die Quellcodedatei der Methode mainwindow::sendString wurde auf den ersten Blick "falsch" angegeben, was aber daran liegt, dass Qt einen Teil deines Quellcodes zuerst (mit "moc") umwandelt, um die Qt-spezifischen Makros aufzulösen. In mainwindow::sendString verwendest du mehrmals die "append"-Funktion. Was mir dann sofort auffällt, ist dieses Konstrukt: QStringList outputtopic = foo.split("|||||"); Vermeide so etwas unbedingt. Ich habe bei FreeHAL auch früher gedacht, dass es praktischer/einfacher/bequemer ist, mehrere String aneinander anzuhängen und später wieder zu trennen, auch weil dadurch die API nicht verändert wird. Am Ende hatte ich dann soetwas (Beispiel): QStringList outputtopic = foo.split("|||||"); QStringList hierMussNochMeinUserNameDrinSein = outputtopic[5].split("]][["); QString username = hierMussNochMeinUserNameDrinSein[0]; QString dasUntergeordneteThema = hierMussNochMeinUserNameDrinSein[2].split("^")[0]; Verwende lieber gleich eine QStringList, oder noch besser, eine eigene Klasse "Answer" oder ähnlich, die diese Attribute enthält. Der Fehler war hier ja, dass du das zweite Element der QStringList abgefragt hast, aber nur eins existierte, weil kein |||| enthalten war. Gruß Tobias
  4. Wenn du nochmal ein Quellcodearchiv als Anhang anfügst, kann ich dir die Terminalausgabe beim debuggen des Fehlers senden. Eine halbe Datei kann aber keiner kompilieren und deshalb auch noch nachvollziehen. Gruß Tobias
  5. Hallo, Wenn du mit gdb arbeitest, solltest du den Code mit "-g" (Debugging Symble) kompilieren. Wenn du dann nach dem Aufruf des Backtraces vermutest, dass der Fehler in #123 steckt (die Nummern links bezeichnen praktisch die Rekusionstiefe), gibst du "frame 123" ein. Danach kannst du dir mit "list" den entsprechenden Codeabschnitt anzeigen lassen und mit "print variablenname" die Variable ausgeben lassen. Gruß Tobias
  6. Ersetze mal successfuloutput += regularexpressionoutput.matchedLength(); durch ++successfuloutput; Dann bekommst du zwei Antworten: Auch Hallo!</out><out>Ebenfalls Hallo! Ebenfalls Hallo! Das Problem ist, dass ".*" zu "gierig" ist. Wenn der Tag wie hier mit "<" beginnt, kannst du das hier verwenden: QRegExp regularexpressionoutput("\\<out\\>([^<]*)\\<\\/out\\>", Qt::CaseInsensitive, QRegExp::RegExp2); "[^<]" ist alles außer "<". Gruß Tobias
  7. Sorry, aber das ist einfach falsch. FreeHAL verwendet bis auf 2 Ausnahmen keine Art von Pattern Matching: Begrüßung und Abschied. Kein auf Pattern Matching basierendes Programm kann lernen, höchstens ein paar Variablen zwischenspeichern. Warum? Weil es nur Frage-Muster und Standardantworten kennt. Es kann keine Sätze parsen oder bilden. Anscheinend hast du die Dateien im lang_de/-Verzeichnis grundlegend falsch verstanden. Bis auf die Tatsache, dass der Regex verkehrt ist... $ ./a.out Auch Hallo!</out><out>Ebenfalls Hallo! Ist eigentlich auf den ersten Blick fast alles richtig. Du darfst nur nicht schreiben, sondern Wenn du j auf 0 setzt, und die Länge ist 0, findet ein Durchlauf statt, obwohl die Länge ja Null ist. $ g++ -g chatbot.cpp -I/usr/include/qt4/QtGui -I/usr/include/qt4/ -I/usr/include/qt4/QtCore -lQtGui ; ./a.out ASSERT failure in QList<T>::at: "index out of range", file /usr/include/qt4/QtCore/qlist.h, line 387 Aborted $ gdb ./a.out GNU gdb 6.8-debian Copyright (C) 2008 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-linux-gnu"... (gdb) run Starting program: /home/tobias/temp/a.out [Thread debugging using libthread_db enabled] [New Thread 0x7fc484539700 (LWP 19922)] ASSERT failure in QList<T>::at: "index out of range", file /usr/include/qt4/QtCore/qlist.h, line 387 Program received signal SIGABRT, Aborted. [Switching to Thread 0x7fc484539700 (LWP 19922)] 0x00007fc482d0dfa5 in raise () from /lib/libc.so.6 (gdb) bt #0 0x00007fc482d0dfa5 in raise () from /lib/libc.so.6 #1 0x00007fc482d0fb13 in abort () from /lib/libc.so.6 #2 0x00007fc4829016b5 in qt_message_output () from /usr/lib/libQtCore.so.4 #3 0x00007fc4829017fd in qFatal () from /usr/lib/libQtCore.so.4 #4 0x00000000004039f2 in QList<QString>::at (this=0x7fff8c568720, i=2) at /usr/include/qt4/QtCore/qlist.h:387 #5 0x0000000000402956 in parse (input= {static null = {<No data fields>}, static shared_null = {ref = {_q_value = 79}, alloc = 0, size = 0, data = 0x6061da, clean = 0, simpletext = 0, righttoleft = 0, asciiCache = 0, capacity = 0, reserved = 0, array = {0}}, static shared_empty = {ref = {_q_value = 4}, alloc = 0, size = 0, data = 0x7fc482cd92fa, clean = 0, simpletext = 0, righttoleft = 0, asciiCache = 0, capacity = 0, reserved = 0, array = {0}}, d = 0x7fff8c5689b0, static codecForCStrings = 0x0}, language= {static null = {<No data fields>}, static shared_null = {ref = {_q_value = 79}, alloc = 0, size = 0, data = 0x6061da, clean = 0, simpletext = 0, righttoleft = 0, asciiCache = 0, capacity = 0, reserved = 0, array = {0}}, static shared_empty = {ref = {_q_value = 4}, alloc = 0, size = 0, data = 0x7fc482cd92fa, clean = 0, simpletext = 0, righttoleft = 0, asciiCache = 0, capacity = 0, reserved = 0, array = {0}}, d = 0x7fff8c5689a0, static codecForCStrings = 0x0}) at chatbot.cpp:78 #6 0x0000000000402e31 in main (argc=1, argv=0x7fff8c568aa8) at chatbot.cpp:90 (gdb) q The program is running. Exit anyway? (y or n) y $ Der Fehler liegt also in charbot.cpp Zeile 78, aufgerufen von Zeile 90. Gruß Tobias
  8. Klar, aber die Frage ist was der Threadautor vorhat oder sich zutraut. ALICE hat es zu erstaunlicher Bekanntheit gebracht, wo ja der Zusammenhang zwischen dem Namen "A.I. Foundation" und Pattern matching gar nicht gegeben ist. Dass die sich nicht lächerlich vorkommen :upps Gruß Tobias
  9. Ich habe für FreeHAL lange Libraries bzgl. Prolog und ähnliches gesucht, aber nichts plattformunabhängiges und zum embedden geeingetes gefunden. Die schönste von Mathematik-Informatikern erdachte Theorie nützt nichts, wenn es keine für ein solches Projekt geeigneten praktischen Umsetzungen gibt. Ich habe mich aber auch dagegen entschieden ein solches System zu implementieren und darauf aufzubauen, und habe stattdessen mit einer Datenbank und SQL-Abfragen das gleiche erreicht. Vielleicht ist die Situation jetzt etwas anders, vor 3 Jahren hätte es sich für mich nicht gelohnt mit SWI Prolog oder anderen bekannten Implementierungen anzufangen. Das Programm hier entwickelt sich aber sowieso in die ganz andere Richtung Pattern-Matching. Gruß Tobias
  10. Trigger id: < ... Trigger content: <trigger 1>guten <var 1>(morgen|mittag|abend|tag)</var></trigger>Trigger id: < ... Trigger content: <trigger 2>gute <var 2>nacht</var></trigger>Trigger id: < ... Trigger content: <trigger 3>hallo</trigger> Gruß Tobias
  11. Hallo, Kannst du die ganze Codedatei als Anhang anfügen, damit man das Programm mal starten kann, sonst kann ich nur raten, denn beim Aufruf einzelner Funktionen kann man nicht viel falsch machen, der Zusammenhang ist das wichtige? Hast du dir schonmal überlegt, welche Lizenz usw. du verwenden willst? (treid = trigger regex id? Auf den ersten Blick etwas unverständlich) Gruß Tobias
  12. So funktioniert FreeHAL. Nur dass du die Eingaben und Abfragen in natürlicher Sprache formilieren kannst. Wenn gegeben ist: "Ich bin eine künstliche Intelligenz" Und ich Frage nach: "Wer bin ich?" Wird das, was du da beschrieben hast, in SQL formuliert und als Datenbankabfrage ausgeführt. Heraus kommt dann der oben genannte Fakt, genau wie bei "Kennst du eine künstliche Intelligenz?". Die größte Arbeit bei FreeHAL macht der Parser, der diese deutschen und englischen Sätze zu logischen Abfragen umwandelt, da er möglichst alles parsen können soll. Beschränkt man sich auf ganz einfache Sätze wie diesen da, lief das schon 2007 in FreeHAL. Gruß Tobias
  13. Hallo, Das, was du machen willst, ist eigentlich exakt ein Alice mit AIML. Die AIML-Dateien entsprechen bis auf die Syntax den Modulen. (Verschiedene AIML-Implementierungen findest du hier) Da dein Chatbot ja nicht lernt, sondern alle Ausdrücke aus den von Menschen geschriebenen .mod-Dateien bezieht, ist eine Datenbank natürlich überflüssig. Freehal geht ein ganzes Stück weiter, indem es die Sätze des Users parst und nach Subjekt, Prädikat, Objekt getrennt in die Datenbank abspeichert. Da kann man keine Textdateien nehmen. Wenn du vorhast, irgendwann Module mit mehreren Tausend Triggern einlesen zu können (das hört sich erst viel an, ist aber eigentlich fast gar nichts), solltest du unbedingt auf eine vernünftige Speicherverwalung überall achten. Bei älteren Versionen von FreeHAL haben wir alle Inputdateien geparst und in den Speicher geladen, doch das ist bald an seine Grenzen gestoßen. Mit SQLite, einer in jedes Programm integrierbaren Datenbankengine haben wir nun 20 MB RAM-Verbrauch bei mehreren Millionen Sätzen. Bei den Regexangelegenheiten solltest du darauf achten, dass du dir vorher wirklich ein Konzept machst, wie du das implementieren willst, und das sollte möglichst allumfassend sein und neue Features zulassen, notfalls auf Papier. Wenn du das einfach so implementierst musst du es in einem halben Jahr neu schreiben, wenn du neue Features hinzufügen willst. Vermeide auch Funktionen/Methoden, die mehr als eine Aufgabe erfüllen. Wenn eine Funktion meinetwegen etwas an einem String verändern muss (Klassisches Beispiel: Verben konjugieren, oder auch nur Leerzeichen am Ende entfernen), solltest du das von Anfang an extra implementieren. Und gerade bei C++ sollte man keine "Auffangklassen" verwenden, die eine bunte Mischung an Methoden enthalten, nur weil man sie nicht als Funktionen implementieren will oder weil man kein Konzept für die Klassen im Projekt hat. Gruß Tobias
  14. Hallo, 1.) Die Kompilierung klappt nicht, weil die Headerdateien von SQLite fehlen, die im Paket libsqlite3-dev sind. 2.) Ubuntu enthält noch Version 0.4 von Parrot (/usr/lib/libparrot.so.0.4.13), und da FreeHAL Version 0.9 erwartet, kann man entweder 0.9 kompilieren oder eine 0.9er vortäuschen: ln -sf /usr/lib/libparrot.so.0.4.13 /usr/lib/libparrot.so.0.9.0 ln -sf /usr/lib/libparrot.so.0.4.13 /usr/lib/libparrot.so.0.9 sudo ldconfig -aq Gruß, Tobias
  15. Hallo Mesfisto, FreeHAL ist vorhin in einer neuen Version erschienen, vielleicht hilft dir ja auch der Code im Subversion-Repository weiter. Zum Kompilieren braucht man nur CMake zu installieren, "cmake .", "make" auszuführen und dann "./hal2009" zu starten. (Warum bin ich hier? Weil ich öfters neue Ideen für FreeHAL suche) Gruß Tobias Schulz (Admin FreeHAL Projekt)

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...