2016-07-28 1 views
2

J'essaye le paquet PyAiml pour écrire un chatbot. J'ai écrit un programme très basique avec tous ces fichiers aiml par défaut de A.L.I.C.E. Tout fonctionne bien jusqu'à présent, sauf le <que> tag. Je pensais que c'était le problème de la session. Puis j'ai réparé la session. Mais toujours aucune chance avec < que tag > pour une conversation contextuelle. Quelqu'un sait comment le faire fonctionner? Ou le PyAiml a un bug avec < que l'analyse des étiquettes >?pyaiml ne répond pas sur <that> tag

Voici mon programme de bot et un fichier AIML très peu je teste avec:

testbot.py

import aiml 
import marshal 
import os 
from pprint import pprint 

BOOTSTRAP_FILE = "/var/www/html/chatbot/std-startup.xml" 
BOT_SESSION_PATH = "/var/www/html/chatbot/" 

sess_id = 'user_id_moshfiqur' 

while True: 
    k = aiml.Kernel() 
    k.bootstrap(learnFiles=BOOTSTRAP_FILE, commands="load aiml b") 

    if os.path.isfile(BOT_SESSION_PATH + sess_id + ".ses"): 
     sessionFile = file(BOT_SESSION_PATH + sess_id + ".ses", "rb") 
     sessionData = marshal.load(sessionFile) 
     sessionFile.close() 

     for pred, value in sessionData.items(): 
      k.setPredicate(pred, value, sess_id) 

    response = k.respond(raw_input(">> "), sessionID=sess_id) 

    sessionData = k.getSessionData(sess_id) 
    pprint(sessionData) 
    sessionFile = file(BOT_SESSION_PATH + sess_id + ".ses", "wb") 
    marshal.dump(sessionData, sessionFile) 
    sessionFile.close() 

    pprint("<< " + response) 

minimal.aiml

<aiml version="1.0.1" encoding="UTF-8"> 
    <category> 
     <pattern>TEST1</pattern> 
     <template>testing one</template> 
    </category> 
    <category> 
     <pattern>TEST2</pattern> 
     <that>testing one</that> 
     <template>Success</template> 
    </category> 
</aiml> 

Répondre

0

En ce qui concerne votre <that> étiquette question, tout ce que je peux vous dire, c'est que c'est bien sur la partie AIML, wha t Je suis venu à offrir une alternative à l'utilisation de cette balise (si c'est la façon dont vous aviez l'intention de l'utiliser):

<category> 
     <pattern>TEST1</pattern> 
     <template>testing one<think> 
      <set name="xfunc">XTEST2</set> 
     </think></template> 
    </category> 

    <category> 
     <pattern>XTEST2</pattern> 
     <template>Success</template> 
    </category> 

    <category> 
     <pattern>TEST2</pattern> 
     <template><condition name="xfunc"> 
      <li value="xxnull"><srai>XDEFAULT ANSWER</srai></li> 
      <li value="*"><think> 
       <set var="temp"><get name="xfunc"/></set> 
       <set name="xfunc">xxnull</set> 
      </think><srai><get var="temp"/></srai></li> 
      <li><srai>XDEFAULT ANSWER</srai></li> 
     </condition></template> 
    </category> 

    <category> 
     <pattern>*</pattern> 
     <template><srai>XDEFAULT ANSWER</srai></template> 
    </category> 

    <category> 
     <pattern>XDEFAULT ANSWER</pattern> 
     <template>Bad input</template> 
    </category> 

La sauvera au-dessus de la fonction qui mène à la prochaine partie de la conversation, puis laisser être utilisé s'il y a une réponse qui a réellement une utilité pour la variable qui le déclenche, ceci est utile dans les situations où vous avez un motif qui dit "oui" par exemple, et qui est nécessaire pour de nombreuses catégories. Notez qu'il y a plus à améliorer sur ce code pour le rendre plus fluide. Faites-moi savoir si vous avez trouvé cela utile et je veux élargisse la portée :)

+0

Honnêtement votre réponse semble compliquée à moi :) Mais c'est probablement parce que je Je n'ai pas beaucoup d'expérience avec aiml. Je vais essayer de comprendre votre réponse. En ce qui concerne ma solution originale, comme vous l'avez dit aiml n'a pas de problème, alors savez-vous pourquoi cela ne fonctionne pas? Comment as-tu fait ton travail? En utilisant cette solution ci-dessus? – sparrow

0
<category> 
    <pattern>TEST THAT</pattern> 
    <template>DO YOU LIKE MOVIES</template> 
</category> 

<category> 
    <pattern>YES</pattern> 
    <that>DO YOU LIKE MOVIES</that> 
    <template> What's your favorite movie? </template> 
</category> 

Pour moi, ce travaille ...