Zum Inhalt springen

Tobias Schulz

Mitglieder
  • Gesamte Inhalte

    15
  • Benutzer seit

  • Letzter Besuch

Beiträge von Tobias Schulz

  1. So, ich habe meine Funktion jetzt vom QString zur QStringList abgeändert und es funktioniert alles soweit ganz gut. Nur jetzt habe ich ein Problem. Meine Funktion soll ja, sofern kein Thema gesetzt war und auch innerhalb der Funktion nicht durch ein [sETTOPIC ...] ein Thema gesetzt wurde, logischerweise kein Thema zurückgeben. Also eine StringList mit nur einem einzigen String, der Antwort des Bots. Nur dann habe ich folgendes Problem: Wie erkenne ich hinterher beim Sortieren von Antwort und Thema, was Antwort und was Thema ist? Angenommen das Thema ist immer das letzte Element der QStringList, dann wäre folgendes Möglich:

    1: Mir gehts auch gut.

    2: Wie geht es Ihnen denn?

    3: Gesundheit

    Hier würde der PC zwei Strings ausgeben und das thema auf Gesundheit setzen. Wenn nun aber kein Thema gesetzt wird und der PC auf 3 Eingaben antwortet, sähe das ganze so aus:

    1: Mir gehts auch gut.

    2: Wie geht es Ihnen denn?

    3: Ist heute nicht schönes Wetter?

    Natürlich sollte hier der dritte String auch ausgegeben werden, aber logischerweise würde er auch als Thema gesetzt werden.

    Ich denke mal, ein leeres Element an die StringList anzuhängen wäre unsinnig, ich weiß nicht mal, ob das überhaupt geht... Auch das ganze mit "Thema: " einzuleiten und hinterher wieder rauszulöschen ist sicher nicht so professionell... Wie löse ich das denn am besten?

    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. Wow, vielen Dank für diese ausführliche Antwort... Das mit der Klasse hatte ich mir auch schon überlegt, aber ich würde gerne ein Funktion machen, die Hinterher andere Leute einfach in Ihr Programm einbauen können... Und es gibt ja nichts einfacheres als einen Funktionsaufruf... Dass ich das ganze mit Parametern löse ist ja ansich auch kein Problem, es funktioniert ja. Nur das blöde ist dann halt, dass eine Funktion nur einen Rückgabewert haben kann... An einen StringList als Workaround dafür habe ich auch schon gedacht, und das werde ich wohl auch dann als nächstes probieren. Vielen Dank wie gesagt, jetzt werde ich erstmal tüfteln, dass es soweit wie es jetzt ist läuft... Vereinfacht wird wie in Mathe hinterher :)

    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. Dankeschön, dass ist sehr nett :)

    Eine Beispieldatei, in welcher das, was ich heute neu dazu zu machen versucht habe zu sehen ist (also das mit SETTOPIC und IFTOPIC), ist in "language/de/gimp.mod"...

    Bevor ich heute dran weitergemacht habe hat alles wunderbar kompilliert und funktioniert. Das heißt die züfällige Ausgabe bei (möglichkeit1|möglichkeit2|möglichkeit3) und alles andere funktioniert.

    Hallo,

    In diesem Falle hilft der Debugger nicht alleine. Was genau machst du mit diesem "|||||"?

    GNU gdb 6.8-debian

    Copyright © 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/cina2009

    [Thread debugging using libthread_db enabled]

    [New Thread 0x7fb97dd8e700 (LWP 9680)]

    Program received signal SIGSEGV, Segmentation fault.

    [switching to Thread 0x7fb97dd8e700 (LWP 9680)]

    0x00007fb97ccbcb43 in QString::append () from /usr/lib/libQtCore.so.4

    (gdb) bt

    #0 0x00007fb97ccbcb43 in QString::append () from /usr/lib/libQtCore.so.4

    #1 0x0000000000405cd9 in mainwindow::sendString (this=0xd12e00) at /usr/include/qt4/QtCore/qstring.h:255

    #2 0x000000000040a89d in mainwindow::qt_metacall (this=0xd12e00, _c=QMetaObject::InvokeMetaMethod, _id=16, _a=<value optimized out>) at moc_mainwindow.cpp:68

    #3 0x00007fb97cd78134 in QMetaObject::activate () from /usr/lib/libQtCore.so.4

    #4 0x00007fb97d79e797 in QAbstractButton::clicked () from /usr/lib/libQtGui.so.4

    #5 0x00007fb97d5228db in ?? () from /usr/lib/libQtGui.so.4

    #6 0x00007fb97d5244a2 in ?? () from /usr/lib/libQtGui.so.4

    #7 0x00007fb97d5246f5 in QAbstractButton::mouseReleaseEvent () from /usr/lib/libQtGui.so.4

    #8 0x00007fb97d26a329 in QWidget::event () from /usr/lib/libQtGui.so.4

    #9 0x00007fb97d217c3d in QApplicationPrivate::notify_helper () from /usr/lib/libQtGui.so.4

    #10 0x00007fb97d22022a in QApplication::notify () from /usr/lib/libQtGui.so.4

    #11 0x00007fb97cd63d61 in QCoreApplication::notifyInternal () from /usr/lib/libQtCore.so.4

    #12 0x00007fb97d21f5c8 in QApplicationPrivate::sendMouseEvent () from /usr/lib/libQtGui.so.4

    #13 0x00007fb97d283be9 in ?? () from /usr/lib/libQtGui.so.4

    #14 0x00007fb97d282607 in QApplication::x11ProcessEvent () from /usr/lib/libQtGui.so.4

    #15 0x00007fb97d2aa2c4 in ?? () from /usr/lib/libQtGui.so.4

    #16 0x00007fb97b1cfd3b in g_main_context_dispatch () from /usr/lib/libglib-2.0.so.0

    #17 0x00007fb97b1d350d in ?? () from /usr/lib/libglib-2.0.so.0

    #18 0x00007fb97b1d36cb in g_main_context_iteration () from /usr/lib/libglib-2.0.so.0

    #19 0x00007fb97cd8c15f in QEventDispatcherGlib::processEvents () from /usr/lib/libQtCore.so.4

    #20 0x00007fb97d2a9a6f in ?? () from /usr/lib/libQtGui.so.4

    #21 0x00007fb97cd62682 in QEventLoop::processEvents () from /usr/lib/libQtCore.so.4

    #22 0x00007fb97cd6280d in QEventLoop::exec () from /usr/lib/libQtCore.so.4

    #23 0x00007fb97cd64cbd in QCoreApplication::exec () from /usr/lib/libQtCore.so.4

    #24 0x000000000040531c in main (argc=1, argv=<value optimized out>) at main.cpp:11

    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. Hm ich experimentiere jetzt schon seit einer Stunde mit gdb rum... Bin das Programm inzwischen per "step" vom Anfang an Schritt für Schritt durchgegangen und es kam kein brauchbares Ergebnis... Also irgendwie bin ich zu doof zum Debuggen... Was kann ich denn noch probieren? :)

    Liebe Grüße,

    Jonathan

    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. Ok, hier der Backtrace:

    #0  0xb762a57b in QString::append () from /usr/lib/libQtCore.so.4
    
    #1  0x0804cb1a in mainwindow::sendString ()
    
    #2  0x08051a9d in mainwindow::qt_metacall ()
    
    #3  0xb76eaa60 in QMetaObject::activate () from /usr/lib/libQtCore.so.4
    
    #4  0xb76eb7e2 in QMetaObject::activate () from /usr/lib/libQtCore.so.4
    
    #5  0xb7c947a7 in QLineEdit::returnPressed () from /usr/lib/libQtGui.so.4
    
    #6  0xb7c9d406 in QLineEdit::keyPressEvent () from /usr/lib/libQtGui.so.4
    
    #7  0xb794f81e in QWidget::event () from /usr/lib/libQtGui.so.4
    
    #8  0xb7c9b157 in QLineEdit::event () from /usr/lib/libQtGui.so.4
    
    #9  0xb78f78ec in QApplicationPrivate::notify_helper () from /usr/lib/libQtGui.so.4
    
    #10 0xb7900806 in QApplication::notify () from /usr/lib/libQtGui.so.4
    
    #11 0xb76d5e61 in QCoreApplication::notifyInternal () from /usr/lib/libQtCore.so.4
    
    #12 0xb79583de in ?? () from /usr/lib/libQtGui.so.4
    
    #13 0xb798ebb0 in ?? () from /usr/lib/libQtGui.so.4
    
    #14 0xb7990d26 in ?? () from /usr/lib/libQtGui.so.4
    
    #15 0xb7967af5 in QApplication::x11ProcessEvent () from /usr/lib/libQtGui.so.4
    
    #16 0xb79927aa in ?? () from /usr/lib/libQtGui.so.4
    
    #17 0xb72006f8 in g_main_context_dispatch () from /usr/lib/libglib-2.0.so.0
    
    #18 0xb7203da3 in ?? () from /usr/lib/libglib-2.0.so.0
    
    #19 0xb7203f61 in g_main_context_iteration () from /usr/lib/libglib-2.0.so.0
    
    #20 0xb7700478 in QEventDispatcherGlib::processEvents () from /usr/lib/libQtCore.so.4
    
    #21 0xb7991ea5 in ?? () from /usr/lib/libQtGui.so.4
    
    #22 0xb76d452a in QEventLoop::processEvents () from /usr/lib/libQtCore.so.4
    
    #23 0xb76d46ea in QEventLoop::exec () from /usr/lib/libQtCore.so.4
    
    #24 0xb76d6da5 in QCoreApplication::exec () from /usr/lib/libQtCore.so.4
    
    #25 0xb78f7767 in QApplication::exec () from /usr/lib/libQtGui.so.4
    
    #26 0x0804c105 in main ()
    
    

    Danke übrigens für den Tipp mit dem srand() :)

    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. Hm, irgendwie bin ich gerade etwas verwirrt... Also meine RegExpressions stimmen eigentlich, weil vor dem Versuch, mehrere in einer Zeile auszulesen, hat es ja funktioniert :) Aber vielleicht übersehe ich was?

    Und den Segmentation fault habe ich gefunden, vielen Dank dafür :)

    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. Dass Pattern Matching ja nicht wirklich in die Richtung von einer KI geht ist denke ich klar... Aber de Facto tut das kein Computerprogramm, auch nicht FreeHal (nichts für ungut)... Auch FreeHal ist letztendlich Pattern Matching, nur auf einem anderen Prinzip aufbauend, welches wesentlich komplexer ist und auch komplexere Reaktionen zulässt.

    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.

    Jetzt ist die Frage, ob ein sehr elegantes Semantisches Netzwerk der KI näher kommt als ein funktionelles Pattern-Matching System. Beide erreichen auf unterschiedliche Weise ihr Ziel, und nach dem, was ich inzwischen alles so getestet habe (FreeHal kann ich ja leider immer noch nicht testen :(), führen die Pattern Matching Systeme meiner Meinung nach die BotWelt an. Aber vom mathematischen Prinzip und dem Potential her liegen definitiv Programme wie FreeHAL vorne :) Ich hoffe das kriegt hier keiner in den falschen Hals und ihr versteht wie ich das meine...:uli

    Naja, bei all dem philosophieren hier hätte ich fast eine Frage vergessen. Ich bin jetzt mit der Verarbeitung der User-Eingabe fast fertig. Genaugenommen war ich das schon, und ich bin gerade dabei, daran zu Arbeiten, dass mehrere Mögliche Ausgaben festgelegt werden können, aus welchen dann eine Ausgelost wird. Es hat sich außerdem Etwas an der Moduldatei geändert. Der leichteren Verarbeitung wegen müssen Trigger und Output jetzt in der selben Zeile stehen:

    <trigger 1>Hallo</trigger> <out>Auch Hallo!</out><out>Ebenfalls Hallo!</out>

    So könnte einer dieser Zeilen aussehen, und da wird auch schon klar, was ich mit den verschiedenen Möglichkeiten meine. Es soll also ausgelost werden, ob auf "Hallo" jetzt "Auch Hallo!" oder "Ebenfalls Hallo!" ausgegeben wird. Dafür muss ich per RegExp vorher beide Outputs aus der Zeile herausfischen. Dabei bekomme ich aber aus irgendeinem Grund einen Segmentation fault... Leider sonst nichts. Hier ist der Code, der für das Auslesen in eine QStringList zuständig ist:

    int successfuloutput = 0; int outputsuccess = 0; QStringList outputstrings;

    while((successfuloutput = regularexpressionoutput.indexIn(line, successfuloutput)) != -1) {

    outputsuccess = 1;

    outputstrings << regularexpressionoutput.cap(1);

    successfuloutput += regularexpressionoutput.matchedLength();

    }

    Laut den QT-Docs sollte das so bzw. ähnlich funktionieren... Was da falsch läuft: Ich weiß es nicht. Ich wäre für Infos sehr dankbar :) Und im Anhang mal wieder die ganze Datei, soweit wie ich jetzt bin.

    Vielen Dank schon mal für eure Hilfe,

    Jonathan

    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
    for(int j=0;j<=foo.size();++j) {
    schreiben, sondern
    for(int j=0;j<foo.size();++j) {
    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. Das ist so genannte "Prädikatenlogik", schau Dir dazu wirklich einmal Prolog an, damit kann man sehr einfach solche Strukturen entwerfen, die auch viel komplexer werden können

    Phil

    Das ist aber dann sehr begrenzt, ... Reine Pattern Abalyse würde sich wohl eher ELIZA entwickeln

    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. Das ist so genannte "Prädikatenlogik", schau Dir dazu wirklich einmal Prolog an, damit kann man sehr einfach solche Strukturen entwerfen, die auch viel komplexer werden können

    Phil

    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. Von mir aus könnt ihr ruhig hier bleiben in dem Thema, mich stört das nicht... Wenn es euch nicht stört, dass ich hier immer mal Fragen in den Raum werfe :)

    Habe mein Problem übrigens gelöst, also vergesst die Frage oben mal eifnach wieder :)

    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. Wow, das ist ziemlich kompliziert... Ich glaube das überlasse ich auch euch, weil so weit bin ich einfach bei weitem noch nicht :)

    Aber ich habe dafür hier gerade noch einmal ein Problem mit meinem RexEx-Bot ;)

    QString treid("\\<trigger.([1-9])\\>.*\\<\\/trigger\\>");

    Das ist das RegEx-Muster, um die ID des Tags auszulesen. Die entsprechende QRegExp Anweisung sieht demzufolge so aus:

    QRegExp rxid(treid, Qt::CaseInsensitive, QRegExp::RegExp2);

    Ja, das CaseInsensitive kann ich mir sparen, aber da später auch Buchstaben als ID dienen sollen, lasse ich es einfach mal drin. Die tatsächliche Abfrage sieht dann so aus:

    positiontriggerid = rxid.indexIn(line);

    In "line" ist die entsprechende Zeile der Textdatei gespeichert. Wenn ich das ganze beim Tag-Inhalt mache (Also alles was zwischen dem öffnendem und schließendem Tag steht), funktioniert alles bestens und ich bekomme meine einzelnen Strings, die ich dann in ein Array speichern kann... Oder ausgeben kann... Oder damit machen kann was ich will ;) Nur hier bei der ID funktioniert das nicht:

    QString triggerid = line.mid(positiontriggerid,1);

    QString triggercontent = line.mid(positiontriggercontent,positiontriggercontentlength);

    parsebase.append("Trigger id: "+triggerid+" ... Trigger content: "+triggercontent);

    So sieht hinterher das Zerschnibbeln des Textes aus. Nun komme ich zu dem, was nicht funktioniert. Und zwar wird letztendlich der String zum Vektor "parsebase" angeefügt. Nur aus irgendeinem Grund macht die "id" aus dem String ein ganz furchtbares Wirrwarr. Hinterher wird das ganze in einem QT Text-Browser ausgegeben, welcher HTML interpretieren kann. Das ganze sieht dann so aus:

    Trigger id: guten (morgen|mittag|abend|tag)Trigger id: gute nachtTrigger id: hallo

    Anstelle von so:

    Trigger id: 1 ... Trigger content: guten (morgen|mittag|abend|tag) Trigger id: 2 ... usw.

    Ich vermute, das Teile des "trigger-Tags mit abgeschnitten werden und dann in dem HTML-Bereich irgendwas verwurschteln... Ersetze ich beim Abschneiden der ID die "1" durch eine 0 (also es werden 0 Zeichen abgeschniten, demzufolge bleibt der String auch 0 Zeichen lang) sieht der Ausgabe-String normal aus, nur dass halt dort, wo die ID stehen sollte, einfach nichts steht. Also:

    Trigger id: ... Trigger content: guten (morgen|mittag|abend|tag) Trigger id: ... usw.

    Ich bin gerade etwas ratlos, weiß nämlich nicht, woran das liegt :/

    Würde mich da über Hilfe sehr freuen :) Danke im Voraus,

    Jonathan

    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. Hallo,

    ich hatte mal vor einigen Jahren die Idee, ein "Semantisches Netz" aufzubauen. Grundlage war, dass das kleinste Element aus Subjekt, Prädikat, Objekt besteht. Dabei sind Subjekt und Objekt Objekte und das Prädikat eine Relation zwichen beiden.

    Das SN hat als notwendige Knoten:

    - Wurzel der Objekte

    - Wurzel der Relationen

    Es hat als notwendige Relationen:

    - is kind of (iko), ist Teil von

    - has as kind (hak), hat als Teil

    - is same as ( isa), ist soviel wie

    In meinem Modell habe ich (o,r,o) eingegeben, um einen Eintrag zu erzeugen. Dabei ist o ein Objekt, und r eine Relation.

    Z.B. ("9","*9","81") bedeutet 9*9=81.

    Wenn ich min. einer Stelle ein "?" eingegeben habe, dann hat mir das programm die Sätze rausgesucht, die passen.

    z.B. ("?","*9,"81") entspräche der Frage "Mit was muss man neune multiplizieren um 81 zu erhalten" und es ergebe den oben genannten Satz.

    Weiter habe ich das Projekt bisher nicht verfolgt.

    Vielleicht könnt ihr das was draus machen!

    LG

    Andre'

    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. Wow, der Admin von FreeHal... Ich fühle mich ja echt geehrt :)

    Danke also auf jeden Fall schon Mal für die Mühe :)

    Auch die 108-Version (precompiled für ubuntu) funktioniert bei mir leider noch nicht. Es gibt da beim "make" eine Menge fehler. Außerdem scheint mir wohl eine "libparrot.so" zu fehlen, die ja aber eigentlich installiert ist... sonderbar... Für den Fall, dass du mit der Ausgabe was anfangen kannst, poste ich sie hier einfach mal:

    jonathan@jonathan-desktop:~/Applications/freehal-r108-ubuntu$ cmake .
    
    -- The C compiler identification is GNU                              
    
    ...                                          
    
    -- Build files have been written to: /home/jonathan/Applications/freehal-r108-ubuntu
    
    jonathan@jonathan-desktop:~/Applications/freehal-r108-ubuntu$ make                  
    
    Scanning dependencies of target hal2009                                             
    
    [  4%] Building C object CMakeFiles/hal2009.dir/hal2009-main.c.o                                                                             
    
    In file included from /home/jonathan/Applications/freehal-r108-ubuntu/hal2009-sql.c:22,                                                      
    
                     from /home/jonathan/Applications/freehal-r108-ubuntu/hal2009.h:131,                                                         
    
                     from /home/jonathan/Applications/freehal-r108-ubuntu/hal2009-main.c:22:                                                     
    
    /home/jonathan/Applications/freehal-r108-ubuntu/hal2009-sql-sqlite.c:22:21: error: sqlite3.h: No such file or directory                      
    
    In file included from /home/jonathan/Applications/freehal-r108-ubuntu/hal2009-sql.c:22,                                                      
    
                     from /home/jonathan/Applications/freehal-r108-ubuntu/hal2009.h:131,                                                         
    
                     from /home/jonathan/Applications/freehal-r108-ubuntu/hal2009-main.c:22:                                                     
    
    /home/jonathan/Applications/freehal-r108-ubuntu/hal2009-sql-sqlite.c:24: Fehler: expected »=«, »,«, »;«, »asm« or »__attribute__« before »*« token                                                                                                                                        
    
    /home/jonathan/Applications/freehal-r108-ubuntu/hal2009-sql-sqlite.c: In Funktion »callback«:                                                
    
    /home/jonathan/Applications/freehal-r108-ubuntu/hal2009-sql-sqlite.c:114: Fehler: »sqlite_connection« nicht deklariert (erste Benutzung in dieser Funktion)                                                                                                                               
    
    /home/jonathan/Applications/freehal-r108-ubuntu/hal2009-sql-sqlite.c:114: Fehler: (Jeder nicht deklarierte Bezeichner wird nur einmal aufgeführt                                                                                                                                          
    
    /home/jonathan/Applications/freehal-r108-ubuntu/hal2009-sql-sqlite.c:114: Fehler: für jede Funktion in der er auftritt.)                     
    
    /home/jonathan/Applications/freehal-r108-ubuntu/hal2009-sql-sqlite.c: In Funktion »sql_sqlite_begin«:                                        
    
    /home/jonathan/Applications/freehal-r108-ubuntu/hal2009-sql-sqlite.c:180: Fehler: »sqlite_connection« nicht deklariert (erste Benutzung in dieser Funktion)                                                                                                                               
    
    /home/jonathan/Applications/freehal-r108-ubuntu/hal2009-sql-sqlite.c: In Funktion »sql_sqlite_end«:                                          
    
    /home/jonathan/Applications/freehal-r108-ubuntu/hal2009-sql-sqlite.c:195: Fehler: »sqlite_connection« nicht deklariert (erste Benutzung in dieser Funktion)                                                                                                                               
    
    /home/jonathan/Applications/freehal-r108-ubuntu/hal2009-sql-sqlite.c: In Funktion »sql_sqlite_add_record«:                                   
    
    /home/jonathan/Applications/freehal-r108-ubuntu/hal2009-sql-sqlite.c:212: Fehler: »sqlite_connection« nicht deklariert (erste Benutzung in dieser Funktion)                                                                                                                               
    
    /home/jonathan/Applications/freehal-r108-ubuntu/hal2009-sql-sqlite.c: In Funktion »sql_sqlite_get_records«:                                  
    
    /home/jonathan/Applications/freehal-r108-ubuntu/hal2009-sql-sqlite.c:325: Fehler: »sqlite_connection« nicht deklariert (erste Benutzung in dieser Funktion)                                                                                                                               
    
    In file included from /home/jonathan/Applications/freehal-r108-ubuntu/hal2009.h:136,                                                         
    
                     from /home/jonathan/Applications/freehal-r108-ubuntu/hal2009-main.c:22:                                                     
    
    make[2]: *** [CMakeFiles/hal2009.dir/hal2009-main.c.o] Fehler 1                                                                              
    
    make[1]: *** [CMakeFiles/hal2009.dir/all] Fehler 2                                                                                           
    
    make: *** [all] Fehler 2
    Und als ich versucht habe, das schon vorkompillierte Programm auszuführen, kam dann die Fehlermeldung:
    jonathan@jonathan-desktop:~/Applications/freehal-r108-ubuntu$ ./hal2009
    
    ./hal2009: error while loading shared libraries: libparrot.so.0.9.0: cannot open shared object file: No such file or directory
    Ich habe extra nachgeguckt, laut "apt-get install libparrot" bzw. "apt-get install parrot" ist alles auf dem neusten stand... Hm... Vielleicht hast Du ja noch eine Idee, was ich probieren könnte :)
    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 noch einmal :)

    Erst Mal vielen Dank für alle bisherigen Antworten!

    Um hier noch ein paar Fragen aus der Welt zu schaffen: Es soll sich vorerst um ein Eigenständiges Programm handeln, also der Benutzer führt es aus, erhält eine grafische Oberfläche mit Chatfenster und Eingabefeld. Also ist das Programm (vorerst) nicht für die Einsetzung in IRC-Channels oder Sonstigem gedacht. Auf die Idee war ich ursprünglich im Gimpforum(.de) gekommen. Dort stellten (wie in jedem anderen Forum wohl auch ;)) mindestens 70% der neuen User die selbe Frage, ohne Suchfunktion, ohne vorher zu googlen. So ist das halt. Ich hatte die Idee, eine automatisierte Antworten-Funktion zu bauen. Also dass der Beitrag des Users genau auf Schlüsselwörter und Frageformen hin analysiert wird und der Bot hinterher eine Antwort auf die Frage schreibt. Daraufhin habe ich mich informiert und bin generell auf Bots und Chatbots gestoßen. Ich habe lange versucht, FreeHAL zum Laufen zu bringen, was jedoch leider nicht hingehauen hat... Denn das geht genau in die Richtung, die ich suche.

    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...