AIML框架标签详解
文章目录
前言:
之前有写过关于 AIML初探的文章,
链接: https://blog.csdn.net/weixin_42250835/article/details/86766776
AIML框架—>分词
中文分词库-Jieba
安装Jieba中文分词库:pip install jieba / pip3 install jieba (全自动安装)
目前 Jieba 是几个主流的中文分词库之一,下面是几个主流的分词工具包
分词工具 词库中词的数量 最后更新时间
分词工具 | 词库中词的数量 | 最后更新时间 |
---|---|---|
jieba | 16.6万 | 2015年 |
IK | 27.5万 | 2012年 |
mmseg | 15万 | 2014年 |
word | 64.2万 | 2015年 |
以上分词工具、词库中词的数量、最后更新时间 信息来自网络搜集。
中英文分词的方式
my name is Fiarter: my name is Fiarter
我的名字是张三: 我 的 名字 是 张三
以上的中英文分词特点,我们可以看到中文分词与英文分词有很大的不同,对英文而言,一个单词就是一个词,而汉语是以字为基本的书写单位,词语之间没有明显的区分标记,需要人为的切分才可以达到中文分词的目的。
在NLP中,分词是一块比较大的知识要点,自然语言处理汉语的时候,中文分词技术是相当重要的,这里关于分词技术不做太多深入的详解,先带大家初步了解分词,形成一种简单直观的分词感觉。
jieba 支持三种分词模式:全模式、精确模式、搜索模式。
全模式:将句子中所有的可能成词的词语都扫描出来,速度非常快,但是不能解决歧义。
精确模式:试图将句子最精确地切开,适合文本分析。
搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适用于搜索引擎分词。
全模式分词
使用全模式分词需要添加 cut_all 参数,将其设置为 True,代码如下:
import jieba #导入jieba
#全模式
while True:
my_in = input("") #input手动输入的内容,赋值给变量 my_in
s = jieba.cut(my_in,cut_all = True) #input手动输入的内容,通过jieba.cut函数调用,匹配cut_all全模式
z = " ".join(s) #使用空格把 jieba 分词的结果区分开。" ":引号中就是普通的字符串
print(z) #输出 分词 的结果
#例句:早上吃了一个茶叶蛋
#分词结果:早上 吃 了 一个 茶叶 茶叶蛋
精确模式分词
精确模式分词,默认情况下使用精确模式。同样的也可使用cut()方法进行精确模式分词的操作,cut()方法的参数改为 False 即可。代码如下:
#精确模式
while True:
my_in = input("")
#s = jieba.cut(my_in) #默认的情况下使用的就是精确模式
s = jieba.cut(my_in,cut_all = False)
z = " ".join(s)
print(z)
#例句:早上吃了一个茶叶蛋
#分词结果:早上 吃 了 一个 茶叶蛋
搜索模式
使用搜索引擎模式分词需要调用 cut_for_search() 方法,代码如下:
#搜索模式(也叫‘搜索引擎模式’)
while True:
my_in = input("")
s = jieba.cut_for_search(my_in)
z = " ".join(s)
print(z)
#例句:早上吃了一个茶叶蛋
#分词结果:早上 吃 了 一个 茶叶 茶叶蛋
AIML框架—>基本标签
小试牛刀
“Project”下新建一个 aiml_main.py 文件,代码如下:
import aiml
import jieba
kernel = aiml.Kernel()
kernel.learn("std-startup.xml")
kernel.respond("load aiml b")
while True:
print(kernel.respond(" ".join(jieba.cut_for_search(input("请输入你的内容>>>")))))
new —> file —> std-startup.xml 创建 “std-startup.xml”文件,代码如下:
<aiml version="1.0.1" encoding="UTF-8">
<category>
<pattern>我 老 了</pattern> <!--加空格的原因是因为需要加入分词-->
<template>
好像是的
</template>>
</category>
</aiml>
运行 aiml_main
基本标签
<aiml> : 定义AIML文档的开头和结尾
<category> : 定义机器人的知识库中的知识单元。
附:可以理解为所有的对话都由category组成
<pattern> : 定义模式以匹配用户可以输入到机器人中的模式
附:其实就是问题
<template> : 定义机器人对用户输入的响应
附:其实就是机器人对用户的回答
举例:
<aiml version="1.0.1" encoding="UTF-8">
<category>
<pattern>HELLO</pattern>
<template>Hello User</template>
</category>
</aiml>
star标签
使用方法 <star index = “n”/> n 表示<pattern>标签中用户输入中 * 的位置
附:这样说可能不是很直观,我们结合下面的代码来看一下
<category>
<!--一个 苹果是一种水果 吗-->
<pattern>一个 * 是 一种 * 吗</pattern>
<template>
第一个参数值是<star index="1"/>,第二个参数值是<star index="2">
</template>
</category>
第一个 * 对应的是苹果,第二个行对应的是水果。
附:也可以通过正则表达式这样理解,* 匹配的是苹果和水果。
random标签
用于获取随机响应。此标记使AIML能够针对相同的输入做出不同的响应。
<random>标签与<li>标签一起使用,<li>标签带有不同的响应,这些响应将随机传递给用户。
代码实例:
<category>
<pattern>我 想 你 了</pattern>
<template>
<li>我也想你了</li>
<li>不要脸,想我干啥</li>
<li>你真奔放啊,上来就说想人家</li>
<li>上旁边想去</li>
</template>
</category>
srai标签
<srai>标签是一个多功能标签。 此标记使AIML能够为同一模板定义不同的目标。
有很多时候,我们提出一系列的问题,但实际上只需要统一的回答,这个时候<srai>标签就有用武之地了。
<srai>标签实例:
<category>
<pattern>你好 *</pattern>
<template>
<srai>你好</srai>
</template>
</category>
<category>
<pattern>你好</pattern>
<template>
<li>你好啊</li>
<li>很高兴见到你</li>
<li>好巧啊,你也来啦</li>
<li>是不是又想我了</li>
</template>
</category>
set和get标签
<set>和<get>标签用于处理AIML中的变量,变量可以是预定义变量或程序员创建的变量。
<set>标签用于设置变量的值
示例: <set name = “variable-name”>variable-value</set>
<get>标签用于从变量中获取值
示例: <get name = “variable-name”></get>
<category>
<pattern>你好 我 是 *</pattern>
<template>
你好啊<set name="username"><star/></set>很高兴见到你
</template>
</category>
<category>
<pattern>晚安</pattern>
<template>
美梦,<get name="username"/>跟你聊天很愉快,期待下一次!
</template>
</category>
that标签
<that>template</that>: <that>标签在AIML中用于根据上下文进行响应
实例:
<category>
<pattern>你 喜欢 哪个 明星 吗</pattern>
<template>刘德华</template>
</category>
<category>
<pattern>我 也 是</pattern>
<that>刘德华</that>
<template>太棒了,我也喜欢刘德华啊</template>
</category>
<category>
<pattern>我 喜欢 * </pattern>
<that>刘德华</that>
<template>我也很喜欢他啊</template>
</category>
topic标签
<topic>标签在AIML中用于存储上下文,以便以后的对话可以基于该上下文完成。通常,
<topic>标签用于 是/否类型对话。它有助于AIML搜索在主题上下文中编写的类别
1、使用<set>标记定义主题
<template>
<set name="topic">topic-name</set>
</template>
2、使用<topic>标记定义类别
<topic name="topic-name">
<category>...</category>
</topic>
实例:
<category>
<pattern>我们 讨论一下 作业 吧</pattern>
<template>好啊,那就聊聊<set name="topic">作业</set>呗</template>
</category>
<topic name="作业">
<category>
<pattern>好难 啊</pattern>
<template>作业真是难,我也这么想的,太难啦</template>
</category>
<category>
<pattern>作业 怎么 做</pattern>
<template>你说什么呢?我不太理解</template>
</category>
think标签
<think>:用于AIML存储变量不通知用户。
实例:
<category>
<pattern>我的 名字 是 *</pattern>
<template>你好,欢迎来到贪心学院!<think><set name="username1"></set></think></template>
</category>
<category>
<pattern>不聊 了</pattern>
<template>
好啊,<get name="username1"/>,那下次聊。
</template>
</category>
condition标签
<condition>标签类似于编程语言中的swich语句。也可以理解成多个 if else
<ondition name = “variable-name” value = “variable-value” />
实例:
<category>
<pattern>我 爱 *</pattern>
<template>
<think>
<set name="star"><star/></set>
</think>
哇塞,你好
<condition name="star">
<li value="健身">帅啊</li>
<li value="读书">有内涵啊</li>
<li>666啊</li>
<condition>
</template>
</category>