Bots mit Persönlichkeit (RiveScript)

Begonnen von yrwyddfa, 29 April 2017, 18:43:50

Vorheriges Thema - Nächstes Thema

yrwyddfa

Hallo zusammen,

nachdem ich ein wenig mit RiveScript experimentiert habe, bin ich auf die Idee gekommen, die Sprachsteuerung ein wenig über den reinen Fhembetrieb hinaus zu erweitern, also quasi eine Art Smalltalk zu realisieren. Ich dachte da an eine Serie namens Eureka, in der S.A.R.A.H. ein intelligentes Haus ist, das flüssig und über wichtiges und unwichtiges mit den Darstellern spricht. Dies wollte ich in bescheidenem Rahmen umsetzen, und als ich davon erzählte, ist meinem besten Freund gleich Jarvis von Iron man eingefallen (der aber natürlich wieder ein anderes Sprachmuster verwendet). Ich nutze den Dialog derzeit über die (momentan etwas buggy laufende) TALKTOME-Schnittstelle in Verbindung mit FHEMBOT und plane bald über AMAD die Antworten auch auditiv zu haben (fehlt dann nur noch eine Sprachsteuerung a la google oder alexa, da warte ich noch etwas auf eine offline-Lösung :) ).

Derweil bastel ich erst mal weiter an "meiner Sarah", aber gleichzeitig frage ich mich, ob es nicht sinnvoll wäre, das ein wenig zu "standardisieren" und somit auf einer gleichen Plattform mehrere Bots zu realisieren, die unterschiedliche "Persönlichkeiten" haben und ggf. auch langmütiger oder schneller gereizt sind als andere (das habe ich theoretisch sogar schon gelöst).

Mit RiveScript Dialoge zu erstellen ist eigentlich recht einfach, ich habe als Nichtprogrammierer das Wesentliche innerhalb eines Tages eigentlich rausgehabt (der Teufel steckt aber wie immer im Detail).


Jetzt meine Frage: hätte jemand Lust daran mit zu entwickeln? Da gibt es einiges an Hirnschmalz reinzustecken, aber ich bin mir sicher, dass sich das lohnt.

Meinungen und Anregungen? Immer her damit ;)
If every day has its number, Monday would be a zero division.

yrwyddfa

Ps: hier mal ein snippet über die Moodsteuerung.
If every day has its number, Monday would be a zero division.

MadMax-FHEM

Hi,

klingt ja mal interessant!

Aktuell habe ich Alexa in Betrieb aber hauptsächlich zur Steuerung, denn für Unterhaltungen ist sie nicht zu gebrauchen....

Google Home soll da ja schon besser sein...

Wäre nur die Frage nach dem Aufwand und was man dazu alles braucht/bräuchte (hab aber die erwähnten Dinge noch nicht angeschaut)...
...und bleibt nat. Klang und v.a. "Sprachaufnahme", denn die Mikrophone von Alexa sind schon klasse...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

yrwyddfa

Generell bietet RiveScript sozusagen eine Programmiersprache für Chatbots. Du sagst dem Chatbot simpel gesagt, was er zu antworten hat, wenn er eine definierte Frage oder Aussage präsentiert bekommt.

Bei Alexa scheint es ja so zu laufen, dass sie nach dem hotkey-Word ("Alexa") das Internet anschmeißt, die Sprache analysiert und dann die geforderte Aktion ausführt. Ich habe selbst kein Alexa-Device, meine aber gelesen zu haben, dass sie nicht so wirklich in ihrer Sprache flexibel ist und es so einen Unterschied machen kann, ob man nun

"Alexa, setzte Staubsaugen auf  meine Todo-Liste" sagt oder aber
"Alexa, ich muss dringend mal wieder staubsaugen".

Mit RiveScript könnte man hierauf nicht nur beidesmal das selbe Fhem-Event triggern (z.B. "set todosliste addtask staubsaugen"), man kann sogar eine Antwort beliebig definieren und diese z.B. über die Sprachausgabe eines Android-Gerätes ausgeben lassen. Z.B.:

"Ich habe Staubsaugen auf die Liste gesetzt"
"Ich finde auch, dass Du dringend mal wieder saubermachen solltest"
"Du hast das letzte mal vor 8 Wochen gestaubsaugt"
"Mach ich, aber ich finde, die Wohnung sieht doch noch sauber genug aus."
etc.
Und könntest sogar je nach "Gemütszustand" deines Bots eine andere Antwort vorgeben lassen. Wenn Du ihn z.B. sauer gemacht hast, könnte er die  zweite Antwort nehmen, und wenn er "gut drauf" ist, würde er die letzte Antwort nehmen. Die eigentliche Sprachanalyse und nachfolgende Sprachausgabe sind hiervon absolut unabhängig:

Sprachanalyse ------> Transkribierter Text ------>  fhem  <-------> RiveScript    --------> Sprachausgabe
If every day has its number, Monday would be a zero division.

hartenthaler

#4
Im Moment sehe ich eigentlich folgende Herausforderungen, damit so eine Sprachdialog-/Chat-Funktion gut in FHEM integriert werden kann:

  • Abstraktionsschicht für FHEM-Devices: Die FHEM-Module sind meist eher gerätenah; für eine natürliche Sprachsteuerung aber braucht man abstrahierte, dem Menschen nähere Elemente und Konzepte. Etwa ein Raumkonzept (eine Küche ist etwas anderes als ein Wohnzimmer oder eine Garage). Oder ein Konzept für Lampen (schaltbar/dimmbar/Farbe/etc), dem es egal ist von welchem Hersteller die Lampe stammt oder über welches FHEM-Modul sie angesteuert werden. Und ein abstraktes Konzept für Geräteklassen, etwa Elektrogeräte oder für Messwerte (Temperatur, Wetter, ...) oder Alarmierung. Die FHEM-Module zu Bewohnern/Gästen oder das msg-Modul gehen schon in diese Richtung.
  • Trennung von Wissen und Dialog: Derzeit integriert man bei RiveScript notwendiges Wissen häufig direkt in den Sprachdialog, etwa beim Dialog: "Wie groß ist die Wohnung? Die Wohnung ist 60,5 m² groß." Dynamische Inhalte holt man direkt aus FHEM, etwa bei der Frage "Welche Lampen sind im Wohnzimmer an?", das ist gut (sofern Punkt 1 erfüllt ist und klar ist was eine Lampe ist und was das Wohnzimmer ist). Wenn Wissen im Dialog verquickt ist, lässt sich so ein Dialogmodul nur mühsam von einem Nutzer zum anderen portieren. Aber genau das ist eigentlich ein Vorteil bei FHEM, dass man ein Modul von anderen übernimmt und es leicht auf den eigenen Bedarf, die eigene Umgebung anpasst. Also müsste man eine generische Wissensdatenbank rings um das SmartHome modellieren und dort alles nötige individuelle Wissen sammeln. Jeder kann dann dort sein Wissen einpflegen und der Dialog greift darauf zu. Wenn in der Wissensdatenbank nichts zur Wohnungsgröße steht, dann erfolgt eben die Antwort "Das weiß ich nicht." Mit so einem Konzept könnte man auch externe Wissensdatenbanken verfügbar machen, etwa Wikidata oder Wolfram Alpha. Wichtig wäre auch der Zugriff auf unstrukturierte Daten (ich möchte etwa dem System gerne das pdf-Protokoll der letzten Eigentümerversammlung vorwefen und es soll dann die TOPs und die Beschlüsse extrahieren).
  • Integration von Grammatik und Wörterbüchern: RiveScript bietet da zwar ein paar Konzepte, aber eine komplette Grammatik nachzubilden übersteigt wohl die Möglichkeiten dieses Tools. Und auch ein Zugriff auf ein Wörterbuch fehlt,
    man muss selber definieren, dass man mit einem "Artikel" die Wörter "der,die,das,ein,eine" meint. Eine Synonymdatenbank für alle Begriffe rings um SmartHome wäre schon mal hilfreich.
  • Lernen/Gedächtnis: Das System müsste lernfähig sein; wenn das System die Antwort auf die Wohnungsgröße nicht kennt, dann soll es nachfragen: "Kannst Du mir verraten wie groß die Wohnung ist?".
  • Gefühle/Stimmungen/Persönlichkeit: Und das System müsste auf Stimmungen eingehen können. Wenn ich beim Weggehen in Zeit-Streß bin, dann reicht auf meine Frage: "Ist noch ein Fenster offen?" ein knappes "nur im Wohnzimmer", abends beim Insbettgehen wäre vielleicht ein "Ja, das Fenster im Wohnzimmer ist gekippt." passender. Das System sollte durch Beobachtung erkennen wie es den Bewohnern geht, welche Lichtstimmung angesagt ist, welche Musik gespielt werden soll. Und es sollte eine eigene Persönlichkeit verkörpern; pahs Jeannie ist etwas anderes als Jarvis oder C-3po oder mein englisch unterkühlter James.
Alles sind Herkulesaufgaben, aber lösbar. Was meint Ihr?
fhem 5.8 auf RaspberryPi 3 mit HMLAN und CCU2, ZWave, JeeLink, FHZ1000 für FS20, HMS, Fritz!Box, Fritz!DECT200, Harmony, Sonos, hue, netatmo, SSCam, Wetter- und Verkehrsmodule, Chat-Bot mit RiveScript/Telegram, IFTTT, pushover, ...

yrwyddfa

Hi Hardenthaler,

Danke für Deine Überlegungen :) Ich denke, ein Gutteil dürfte sich mit den verfügbaren Tools heute schon realisieren lassen, ich will mich aber mal durch Deine Punkte hangeln:

1. Das ist ein sehr wichtiger Punkt. Um es salopp auf den Punkt zu bringen: Die Wahrscheinlichkeit, dass jemand die Temperatur im Wohnzimmer verändern will ("Im Wohnzimmer ist es zu kalt") ist höher als die, dass jemand sagen würde "Im Wohnzimmer sind die Heizungen 1, 2 und 3 zu niedrig", oder, noch abstruser: Im Wohnzimmer haben die Geräte WZ_Thermostat_1 und WZ_Thermostat_2 eine zu niedrige Temperatureinstellung.
Ich glaube, hier bieten uns die Fhem-Module schon recht mächtige Werkzeuge. Residence & co hast du ja schon angeschnitten, structure würde ich hier auch noch mal mit in die Waagschale werfen.

2. Hier denke ich auch drauf rum. Zum einen ist es deutlich eleganter, diese Werte dynamisch einlesen zu lassen, sprich, mit einem <call> im Rivescript zu arbeiten, als diese fest in den Dialog zu schreiben. Da bin ich ganz bei dir. Wo ich gerade am überlegen bin, ist, ob es möglich ist, Rivescript-Variablen, die ja im Tutorial  beispielsweise im Abschnitt the begin file verwendet werden, automatisch mit den korrespondierenden fhem-Werten befüllen zu lassen und im Dialog dann tatsächlich nur die Variablen zu verwenden. Allerdings werden wir da wahrscheinlich nicht um Perl-Coding herum kommen (das ich selbst leider nicht beherrsche). Allerdings ist hier auch die Frage, ob wir das gewollte Wissen in eine separate Datenbank pflegen wollen oder ob wir es vielleicht versuchen können direkt anzusteuern? Vorteile? Nachteile?

2a. Hier sollten wir auch mit ins Kalkül ziehen, ob und wie sich die Informationen sprachlich darstellen lassen. Wenn ich meine S.A.R.A.H. (Nerdalarm -> Hinweis ) beispielsweise nach "Berlin" frage, und sie mir den Wiki-Artikel aufmacht, möchte ich mir die nächsten zwei Stunden natürlich nicht anhören, was es über Berlin so alles zu wissen gibt, für die Sprachausgabe wäre mir sogar die einleitende "Kurz-" Definition  viel zu lang.

2b. Zum Extrahieren bestimmter Dokumentenbestandteile bedarf es glaube ich noch zusätzlicher Software, denn es muss ja nicht nur erkannt werden, was im Text nun TOP und was Beschluss ist, es muss das eine dem anderen ja auch noch zugewiesen werden und letztlich so hinterlegt werden, dass man es beispielsweise über ein Reading aufnehmen könnte.

3. Hier haben wir mit Rive in der Tat eine Schwäche. Was aber natürlich möglich wäre, ist, wenn wir eine entsprechende Routine hätten, die quasi die Vorarbeit abnimmt, diese dann auf eine Antwort zugreifen zu lassen (keine Ahnung ob und wenn ja wie das möglich wäre).
Z.B.  nach der Satzanalyse, die dann die wichtigen Elemente herausfiltert (meinetwegen "Küche", "Temperatur" und "runter") und anhand dieser "keywords" dann einen Trigger in Rive ansteuert (der ja dann generisch sein könnte, also beispielsweise +küche_temperatur_reduzieren heißen könnte). Die Frage ist nur: Wie sinnvoll ist das? Oder wäre dann ein ganz anderer Ansatz besser, da weniger komplex?

4. Zum Thema Lernfähigkeit: Generell ließe sich ja einrichten, beispielsweise über eine sub unbekannte Trigger aufzunehmen, via Rive zu fragen, wie in Zukunft darauf geantwortet werden könnte. Was die unbekannten Werte angeht: Das kann Rive ja nativ, wenn der unbekannte Wert in eine Variable in Rive übergegeben und damit gespeichert wird (allerdings dann nur bis zum Neustart, was natürlich nicht optimal ist).

5. Ich denke, eine Botlaune zu erzeugen ist relativ einfach. Je nachdem wie "Sauer" das System ist, lässt sich sehr einfach realisieren, dass der Wortlaut ein anderer ist. Hierbei müssen die Fhem-Befehle selbstredend immer ausführbar sein, ich würde lediglich die Antworten entsprechend patzig oder freundlich gestalten.
5a. Eine automatische Erkennung der Stimmung des Nutzers wäre natürlich phänomenal, aber ich glaube, da sind wir noch etwas davon entfernt. Was aber möglich wäre, ist, je nach Trigger eine  entsprechende Antwort zu geben (Bin ich genervt, werden meine Fragen ja auch knapper). Das ist dann zwar keine echte Erkennung, bewegt sich aber zumindest in gaaaaanz groben Zügen in diese Richtung. Oder aber ich muss klipp und klar meine Stimmung zu erkennen geben (bei mir ist es derzeit z.B. "Sarah, ich bin sauer, mach Musik an!" A:"In Ordnung, ich habe deine Rockmusik-Liste aufgelegt.")

Das erst mal meine Gedanken zu deinen sehr validen Punkten. Gibt es noch weitere Ideen, Ansätze, sonstiges? Wie könnten wir das anpacken?
If every day has its number, Monday would be a zero division.

tiroso

Klingt alles gut. Echt gut.
Wie wollt ihr die Problematik des vergessen lösen? Zig Timer aufstellen?
Beispiel
Befehl: Ich bin sauer
Rückfrage: Soll ich Rock Musik starten?
...24Stunden später. ..
Antwort: Ja  ;D

Wenn ich da mal Werbung in eihrer Sache macjen darf...Einfache Befehle über Telegram oder per Sprache über AMAD hattr ich in einem eigenen Modul mal umgesetzt. https://forum.fhem.de/index.php/topic,72657.0.html
Vllt hilft das ja.....oder man kann es iwie ummodelieren....

yrwyddfa

Hey Tiroso! Interessantes Modul, das Du da am zusammenbauen bist! In der Tat könnte das den Weg über die Cloud obsolet machen, ich sehe da vor allem eine Stärke in der Kombination mit Rivescript (RS), weil wir die Trigger, die in  RS verwendet werden, ja sehr schön eingesetzt werden können.

Nehmen wir dein Beispiel mit der Deckenlampe: Wenn Du aus
"Dimme die Deckenlampe im Wohnzimmer um 30%" ebenso wie aus
"Dimme im Wohnzimmer die Deckenlampe um 30%" als auch
"Im Wohnzimmer muss die Deckenlampe um 30% gedimmt werden" den selben Text extrahieren kannst, beispielsweise

"Wohnzimmer Deckenlampe dimmen 30%"
kann man genau diesen Wert nehmen und nach wünschen unterschiedliche Bestätigungen ausgeben (auch davon abhängig, wie der bot gelaunt ist), also z.B.


- Ich hab Dir Dein Licht so eingestellt, wie du es wolltest
- ich habe im Wohnzimmer die Deckenlampe auf 30% gesetzt
- Ich hoffe, so ist das Wohnzimmerlicht nun nach deinen Wünschen
- Du hast es zwar nicht verdient, ich habe dir das Licht aber trotzdem so eingestellt
- etc. pp

Es ließen sich hier auch Statusabfragen integrieren, auch unmittelbar über RS:


Wie warm ist es im Wohnzimmer|welche Temperatur hat es im Wohnzimmer|ist es im Wohnzimmer warm?|...
- Im Wohnzimmer haben wir zur Zeit 18°C. (Wobei die 18° ausgelesen werden)


Man könnte das sogar verfeinern:

|code|
Ich: Ist es im Wohnzimmer warm?
Bot: Wir haben zur Zeit 18°C im Wohnzimmer. soll ich die Temperatur ändern?
Ich: ja
Bot: Auf wie viel Grad soll ich die Wohnzimmertemperatur stellen?
Ich: Auf 28°C
Bot: Oh, das ist sehr warm, aber ich stelle Dir das natürlich gern ein. --> set Wohnzimmer_Heizung desiredTemperature 28
[/code]

Zu Deiner Frage: RS lässt sich so gestalten, dass es auf eine Frage zwar eine Antwort erwartet (Ich bin Sauer --> möchtest Du Rockmusik hören? --> ja|nein ), diese Antwort aber nicht zwangsläufig kommen muss. Beantwortest Du die Frage nicht und sagst hinterher statt dessen etwas anderes, wird die vorangegangene Frage verworfen (es sei denn, du möchtest, dass auf die Frage geantwortet werden muss, dann wartet der bot aber tatsächlich so lang, bis die richtige Antwort kommt). Ich denke, das wird der übliche Fall sein, wenn man eine Frage nicht beantwortet. Dennoch könnte dein Szenario natürlich auftreten, darüber habe ich mir noch gar keine Gedanken gemacht. Ich werde da mal in mich gehen, oder hat jemand eine Idee?

Alles in allem denke ich, dass man hier gut aufeinander aufbauen kann und es kein Problem sein dürfte, variierende Antwortarten, Launenabhängigkeit des Bots etc. in dein Vorgehen zu integrieren - nur der Output der Satzerkennung muss entsprechend angepasst sein.
If every day has its number, Monday would be a zero division.

tiroso

#8
Also verschiedene Varianten des Satzes lässt mein Modul zu.
Alle deine genannten Vorschläge werden erkannt und ungesetzt. Die Antwort efolgt per Zufall aus einen Antwort Pool.
Abgesehen von diesem abgehackten satz mit "wohnzimmer deckenlampe dimmen 30%" da fehlt die preposition. ...Da muss das Device schon "Wohnzimmer Deckenlampe" heißen.
Bei der anderen Sache. ..Wie warm ist es in einem Raum....Bin ich gerade dabei. Gibt die Temperatur eines Gerätes zurück oder den Mittelwert aller Temperaturen die in einem Raum gefunden werden. Aber bei mir halt ohne das jemand die Befehle aufsetzt.

Dann muss ich mir RS doch mal näher ansehen  ;)

Geht ja auch letztendlich darum einen Bot  zu haben der alles von alleine erkennt. Mit RS macht ja jeder sein eigenes Süppchen, oder?

yrwyddfa

Bislang macht jeder mit RS ein wenig sein eigenes Süppchen, ja. Allerdings fänd ich es auch deutlich besser, wenn wir einen individuellen Part und einen Part für alle haben. Das muss halt ein wenig koordiniert werden. Was meinen "Hacksatz" angeht: da denke ich vor allem an Leute, die nicht so geübt sind im Gespräch mit Maschinen - bisweilen sind ja die integrierten Navis im Auto ja auf solche Sätze angewiesen.
Der Charme von RS ist, dass es sehr einfach zu erlernen ist und man sehr nahe an der Sprache programmiert. das ist sehr intuitiv und lässt auch zu, dass man, wenn man es möchte, auch Gespräche einpflegen kann, die gar nichts mit FHEM zu tun hat, wie z.B.


Ich: "Sarah, du bist blöd"
bot: " Dafür musst du dich entschuldigen!"
Ich: "Nö"
Bot: "Entschuldige dich!"
Ich: "Meinetwegen: Entschuldigung"
Bot: "In Ordnung, Entschuldigung akzeptiert. Aber ich bin immer noch sauer auf dich!"


Natürlich ist das nicht wirklich nötig, aber erweitert natürlich die Möglichkeiten, die man "im Gespräch" hat, natürlich enorm.

Dein Modul werde da Wochenende mal testen, wenn nichts dazwischen kommt :)
If every day has its number, Monday would be a zero division.

LachaDieEnte

#10
Moin, ich klinke mich hier mal ein. Zum Thema Lernfähigkeit habe ich mir auch den ein oder anderen Gedanken gemacht. Ich bin mittlerweile so weit, dass ich meiner ADA (mein Rivebot) zumindest beibringen kann, wie sie auf Fragen, die sie noch nicht kennt reagieren soll (Dialogschicht). Wissen wird immer aus Fhem-Devices gezogen über ein Call. Das klappt auch sehr gut.

Damit die Dialog-Lernfähigkeit gegeben ist, habe ich folgende Schritte vollzogen:
1. dem Bot in Fhem ein Braindir zugewiesen:
rsbraindir     /opt/fhem/FHEM
das Brainfile darf hierbei nicht definiert sein. Es ist wichtig, dass das Braindir der FHEM Ordner ist, damit rive über die Calls auf die Devices zugreifen kann.

2. meine .rive Dateien einheitlich benannt.
Ich nenne sie:
brain.00.unanswered.rive
brain.01.defines.rive
brain.02.welcome.rive

Das dient lediglich der Übersichtlichkeit und sieht nur nach hierarchie aus.

3. die Datei brain.00.unanswered.rive mit Dateiberechtigung 0777 betraut. Da sollen die ganzen unbeantworteten Sätze rein.

4. Ein Dummy Device BotUnanswered einlegen und diesem zwei Userreadings verpassen:
userReadings     answer, question

5. eine Funktion zum Speichern in ein Sub packen:
sub addToRive {
my $brainfile = "/opt/fhem/FHEM/brain.00.unanswered.rive";
my $type = $_[0];
my $text;
my $question = ReadingsVal("BotUnanswered",$type,0);
if($question ne ""){
my $mainquestion = ReadingsVal("BotUnanswered","question",0);
my $type2 = substr($question,0,5);
my @file;
my $questionline=-1;
my $endline =-1;
my $emp = 0;
$text = $question;
if($type2 eq "learn" && $type eq "question"){
$text = substr($question,6,length($question)-6);
}
open (in, "<$brainfile") || die $!;
while (<in>){
if($_ eq ""){
$emp++;
if($emp <= 1){
push(@file,$_);
}
}
else{
push(@file,$_);
}
}
close(in);
if($type eq "question"){
my %params = map { $_ => 1 } @file;
if(!exists($params{"+ ".$text})){
push(@file,"+ ".$text."\n\n");
}
}
if($type eq "answer"){
for(my $i=0;$i<@file;$i++){
if($file[$i] eq $mainquestion){
$questionline = $i;
}
if($questionline >= 0 and $endline eq -1){
$file[$i] =~ s/^\s+|\s+$//g;
if($file[$i] == ""){
$endline = $i;
}
}
}
my $first = substr($text,0,1);
if($first ne "@" and $first ne "*" and $first ne "-"){
$text = "- ".$text;
}
my @endarr = splice(@file,$endline);
push(@file,$text."\n");
push(@file,@endarr);
}
my $filetext = join("",@file);
open(DATEI, ">$brainfile"); # Datei zum anhängenden Schreiben öffnen
binmode(DATEI, ":utf8");
print DATEI $filetext;
close(DATEI);
}
}


6. ein notify auf die UserReadings legen, welche die Funktion triggert:
define n_BotUnansweredAnswer notify BotUnanswered:answer:.* { addToRive("answer")  }
attr n_BotUnansweredAnswer room xBotConf

define n_BotUnansweredQuestion notify BotUnanswered:question:.* { addToRive("question")  }
attr n_BotUnansweredQuestion room xBotConf


7. Dem Bot sagen, was er zu tun hat und zwar in einer rive-Datei:
//wechsle bei unbekanntem Befehl etc. in das topic learning
+ *
- <call>fhem setreading BotUnanswered question <star></call> Learning initiated for sentence "<star>". Please input reply.{topic=learning}

+ learn *
- <call>fhem setreading BotUnanswered question <star></call> Learning initiated for sentence "<star>". Please input reply.{topic=learning}



> object resetlearning perl
fhem("deletereading BotUnanswered question");
fhem("deletereading BotUnanswered answer");
fhem("set FHEMTALKTOME reload");
< object



>topic learning
// Ordne die folgende Antwort der vorhergehenden Frage zu und übergib die Antwort an den Lern-Dummy, verlasse das Thema wieder
+ *
- <call>fhem setreading BotUnanswered answer {formal}<star>{/formal}</call> Thank you. Do you want to add another answer?

+ yes
% [*] another answer
- Please input reply.

+ no
% [*] another answer
- <call>resetlearning</call>Ok, i will not ask anymore{topic=random}


<topic


8. Starte einmal alles durch und du hast einen Bot, der dich fragt, was er antworten soll, wenn er dich nicht versteht.

Die Antwort wird aktuell noch komplett lowercase gespeichert und aller Satzzeichen entledigt.

Diese Lösung ist aktuell nur eine Übergangslösung. Die Sätze benötigen ein Review und müssen in die entsprechenden Rive-Dateien eingepflegt werden.

Ich hoffe, das ist interessant für euch.

[EDIT] Habe ein paar Bugs beseitigt, die ich noch im Script hatte (danke an YrWyddfa fürs Beta-testen) und auch die Lowercase Problematik gelöst (auch dank an YrWyddfa für den Denkanstoß mit {formal})

hartenthaler

So, hatte heute endlich mal etwas Zeit um diese sehr gute Idee zu übernehmen. Gefällt mir viel besser als meine alte Lösung (habe mir auftauchende unbekannte Fragen bislang per E-Mail zugeschickt). Noch läuft es nicht rund, aber ich bin dran.
Was mir bislang aufgefallen ist:
zu 1. Brainfile darf hierbei nicht definiert sein Das geht bei mir nicht. Wenn ich Brainfile nicht setze, dann findet der Bot meine Bilder nicht mehr, die ich mir im Dialog zuschicken lasse. Ist zwar nicht logisch, ist aber so (Error object not found). Warum darf Brainfile nicht definiert sein?

zu 4. UserReadings ? Muss das nicht das Attribut readingList sein?

zu 5.
my $type2 = substr($question,0,5);
...
if($type2 eq "learn" && $type eq "question"){
$text = substr($question,6,length($question)-6);
}

Verstehe ich nicht. Wie kann ein "learn" in die question reinkommen? Bei der Chat-Eingabe "Learn welche farbe hat die sonne" landet doch nur "welche farbe hat die sonne" in der question. Oder?
fhem 5.8 auf RaspberryPi 3 mit HMLAN und CCU2, ZWave, JeeLink, FHZ1000 für FS20, HMS, Fritz!Box, Fritz!DECT200, Harmony, Sonos, hue, netatmo, SSCam, Wetter- und Verkehrsmodule, Chat-Bot mit RiveScript/Telegram, IFTTT, pushover, ...

LachaDieEnte

Zitat von: hartenthaler am 02 Juli 2017, 00:01:17
zu 1. Das geht bei mir nicht. Wenn ich Brainfile nicht setze, dann findet der Bot meine Bilder nicht mehr, die ich mir im Dialog zuschicken lasse. Ist zwar nicht logisch, ist aber so (Error object not found). Warum darf Brainfile nicht definiert sein?
Ich nahm an, dass sich rsbrainfile und "rsbraindir     /opt/fhem/FHEM" in die Quere kommen. Wenn das nicht so ist, solls mir racht sein.

Zitat von: hartenthaler am 02 Juli 2017, 00:01:17
zu 4. UserReadings ? Muss das nicht das Attribut readingList sein?
Userreadings sind schon ok. Obs genauso mit readingList funktionieren würde hab ich noch nicht ausprobiert

Zitat von: hartenthaler am 02 Juli 2017, 00:01:17
zu 5.
my $type2 = substr($question,0,5);
...
if($type2 eq "learn" && $type eq "question"){
$text = substr($question,6,length($question)-6);
}

Verstehe ich nicht. Wie kann ein "learn" in die question reinkommen? Bei der Chat-Eingabe "Learn welche farbe hat die sonne" landet doch nur "welche farbe hat die sonne" in der question. Oder?
Na wenn ich meinem Bot schreibe "Learn welche farbe hat die sonne", versteht er "learn welche farbe hat die sonne", also muss ich ihm die ersten 6 zeichen wieder abnehmen, damit das learn da nicht am anfang steht

Prof. Dr. Peter Henning

Ich finde die Diskussion zwar ganz interessant, Die Codierung leidet aber bisher daran, dass die Sätze eben nicht semantisch auseinandergenommen werden. Wenn ich lese
ZitatWie warm ist es im Wohnzimmer|welche Temperatur hat es im Wohnzimmer|ist es im Wohnzimmer warm?|...
graust es mich ehrlich gesagt etwas (und nicht nur wegen der Formulierung "hat es"...). Es gibt mindestens 10 weitere (und grammatikalisch richtige) Arten, nach der Temperatur zu fragen - und es ist auch aus Performancegründen absolut illusorisch, diese alle "lernen" und analysieren zu lassen.

Nun könnte man ja einwenden, dass die so genannte "Lernfähigkeit" immerhin hilft, sich an eine Person anzupassen - und diese eine Person würde höchstens drei verschiedene Formulierungen verwenden. Das ist aber nicht zukunftsfähig, die gesamte Forschung zur Sprachsteuerung geht einen anderen Weg.

Im konkreten Fall müsste man zuerst den Substring "Wohnzimmer" herauslösen und als Ortsbeschreibung erkennen.

LG

pah



tiroso

Hallo,
Wie würdest du denn sowas angehen? Klar graust einem bei der Satz Stellung und das alles so starr ist.

Wie würdest du die Information filtern un welches Device es geht und ggf auch die Raumangabe?

ich Filter z.b. Alle Wörter in einem Satz und lasse sie klassifizieren. Alles was übrig bleibt sind z.b Device oder Raumabgaben (je nachdem ob vorher eine preposition genannt wurde.)
Alles was übrig bleibt wird in 3 Zeichen lange teile unterteilt.  Diese werden dann mit den Devices oder Rooms abgeglichen.
Je nach übereinstimmung wird damit weitergemacht. Und je nachdem welche weiteren Wörter sich in dem substring befinden werden unterschiedliche Aktionen durchgeführt. (Siehe TEERKO)
Tim