文章会有【原创】或者【转载】标示,部分来自Google Baidu的学习结果 {Java/PHP/Python/Ruby/Go}

Python aiml使用  


std-startup.xml:
<aiml version="1.0.1" encoding="UTF-8">
    <!-- std-startup.xml -->
    <!-- Category is an atomic AIML unit -->
    <category>
        <!-- Pattern to match in user input -->
        <!-- If user enters "LOAD AIML B" -->
        <pattern>LOAD AIML B</pattern>
        <!-- Template is the response to the pattern -->
        <!-- This learn an aiml file -->
        <template>
            <learn>didi_register.aiml</learn>
            <!-- You can add more aiml files here -->
            <!--<learn>more_aiml.aiml</learn>-->
        </template>      
    </category>
</aiml>


didi_register.aiml:
<aiml version="1.0.1" encoding="UTF-8">
<!-- didi_register.aiml -->

    <category>
        <pattern>HELLO</pattern>
        <template>
            <random>
                <li>Weclome Register Didi Driver, Please Your Name... explame: My Name *</li>
            </random>
        </template>
    </category>
    
    <category>
        <pattern>MY NAME *</pattern>
        <template>
            Please Your Name... explame: My Age *
        </template>
    </category>
    
    <category>
        <pattern>MY AGE *</pattern>
        <template>
            Thanks Register OK!!!
        </template>
    </category>
</aiml>

#-*- coding: UTF-8 -*- 
"""
Didi Driver Register
"""
import os
import aiml
import random
import string

# Driver SessionId
def getChatSessionId(length):
    num_of_numeric = random.randint(1,length-1)
    num_of_letter = length - num_of_numeric
    numerics = [random.choice(string.digits) for i in range(num_of_numeric)]
    letters = [random.choice(string.ascii_letters) for i in range(num_of_letter)]
    all_chars = numerics + letters
    random.shuffle(all_chars)
    result = ''.join([i for i in all_chars])
    return result

# Create the kernel and learn AIML files
try:
    kernel = aiml.Kernel()

    if os.path.isfile("bot_brain.brn"):
        kernel.bootstrap(brainFile = "bot_brain.brn")
    else:
        kernel.bootstrap(learnFiles = "std-startup.xml", commands = "load aiml b")
        kernel.saveBrain("bot_brain.brn")
except Exception, ex:
        print(ex)

if __name__ == "__main__":
    # Press CTRL-C to break this loop
    driverSid = getChatSessionId(6)
    while True:
        message = raw_input("Enter your message >> ")
        if message == "quit":
            exit()
        elif message == "show":
            sessionData = kernel.getSessionData(driverSid)
            print(sessionData)
        else:
            print(kernel.respond(message, driverSid))
    

DAIML(Distributed Artificial Intelligence Markup Language)是用于分布式人工智能系统中智能语言的标记库。DAIML主要分为Pattern和Template两部分,Pattern用于模式匹配,Template用于回答模板,下面将分别介绍两者的示例。

      Pattern示例:

      (1) 直接完全匹配模式。

           

     (2) Set匹配模式。

           

     (3) 带*匹配。

           

    (4) 带约束的*匹配。

          

   (5) Set与*的混合匹配。

          

   (6) Set与带约束的*混合匹配。

         

   备注:上述过程中的带约束的*除了NUMBER之外,还可以是DATETIME(时间类型)、EN_WORD(英文单词)、EMAIL(邮箱)、TELEPHONE(手机号和座机号)、IPADDRESS(ip地址)、URL(链接)。

   完整的示例:

   (1)  直接模式。

<category>

        <pattern>你好</spanpattern>

        <template>

            你好!

        </spantemplate>

</spancategory>

        此种模式将会在命中“你好”之后直接返回“你好!”。

   (2) 随机模式。

<category>

        <pattern>今天天气真好</spanpattern>

        <template>

            <random>

                <li>是呀,天气不错。</spanli>

                <li>要不出去走走?</spanli>

                <li>希望每天天气都这么好!</spanli>

            </spanrandom>

        </spantemplate>

</spancategory>

       随机模式在命中Pattern之后,将会从template中的li元素中随机选择一条返回。

   (3) 上下文替代模式。

<category>

        <pattern>你好,我是*</spanpattern>

        <template>

            你好,很高兴认识<star index="1" />

        </spantemplate>

</spancategory>

      上下文替代模式,将会在template中替换star,例如在问“你好,我是刘凡平”的时候,则“*”指向的内容是“刘凡平”,则返回结果为“你好,很高兴认识刘凡平“。表示取用户模糊匹配的第一个*号的内容。

  (4) 递归模式。

<category>

        <pattern>您好,我是*</spanpattern>

        <template>

            <srai>

               你好,我是<star index="1" />

            </spansrai>

        </spantemplate>

</spancategory>

      递归模式采用”srai“标识,表示不直接返回答案,而是将问题替换为另外一个问题继续寻找。例如用户问”您好,我是刘凡平”的时候,template中将会替换为”你好,我是刘凡平“的问题,这个问题将会再次在DAIML中进行匹配,直至直接返回结果”你好,跟高兴认识刘凡平“。

  (5) 带约束的pattern匹配。

<category>

        <pattern that="你好">你好啊</spanpattern>

        <template>

            <random>

                <li>

                    你好,我们刚刚说过一遍了。

                </spanli>

                <li>

                    你好,客气啥!

                </spanli>

            </spanrandom>

        </spantemplate>

</spancategory>

       上述示例中,并不会直接命中”你好啊“,而是在上一次是匹配的”你好“,当又匹配了”你好啊“才会命中上述category,即上次和当前次的连续匹配。

  (6) 单请求模式。

<category>

        <pattern>*身高</spanpattern>

        <template>

            <request node="example"><star index="1" />身高</spanrequest>

            <ret>

                <node index="1" />

            </spanret>

            <script>return "<star index='1' />的身高是<ret/>" </spanscript>

        </spantemplate>

</spancategory>

      但请求模式在DAIML中最简单的网络请求标记,例如当提问”马云身高“的时候,将会命中上述示例的pattern。在template中并没有直接返回的结果,而是网络请求。其中request标签中的node属性中则为请求的服务器,request标签的值则为请求的内容。ret表示返回结果的表达式,表示第一个请求节点返回的值内容。