动物识别 python 人工智能实验

构建动物识别系统

系统分为两部分,第一部分是初始化综合数据库,分为两类,一类是间接数据库,即不指向最终动物的信息。另一类是直接数据库,即指向最终动物的信息。使用的是二维列表加上一个一维列表存储key与value。第二部分为添加数据库和识别动物,查询的时候添加,可以有效的扩增数据库,使功能更灵活与完善。在识别动物的时候,先在间接数据库中完善信息,在直接数据库中查找对应的动物,记录信息时,使用字典记录某个特征是否出现,这样查询的复杂度就为O(1)。(这一段为老师所给提示)

思路:

1、我选择构建直接、间接数据库的方式为将条件存入列表中,列表中的元素都有对应的下标,将下标作为字典的值、结果作为字典的键构成数据库,这样条件和结果就能构成一一对应的关系。因此程序中的数据库是包括列表、字典两部分的。

eg: 间接库列表:奶                             哺乳动物+蹄                    羽毛

        间接库字典:哺乳动物->0             蹄类动物->1                    鸟->2

2、识别动物的时候,先在间接库中进行推理,再在直接库中推理。

Indirdict=dict()#间接库字典,用于从数字寻找对应结果
Dirdict=dict()#直接库字典,用于从数字寻找对应结果
Indirlist=[]#间接库列表,用于存放动物特征的集合和定义、存放这个集合对应数字
Dirlist=[]#直接库列表,用于存放动物特征的集合和定义、存放这个集合对应数字
Indirnum=0#作为间接库字典的值
Dirnum=0#作为直接库字典的值

def change(str):#以字符串的形式输入全部特征值,这个函数可以将字符串中的特征值识
                #别出来,并且将所有特征值存放到一个集合中
    set1=set()#定义一个集合,存放特征值
    str1=""
    for i in range(0,len(str)):
        if(str[i]!=" "):
            str1+=str[i]
        else:
            set1.add(str1)
            str1=""
            i+=1
    return set1

list1=[]#定义一个临时列表,表示间接库或直接库
dict1=dict()#定义一个临时字典,表示间接库字典或直接库字典
num1=0

def Builddata(list1,dict1,num1):#num1存放在字典中,与结果相对应
    str2=input("请输入条件,以空格隔开:")#定义一个字符串,存放用户输入特征值
    str2+=" "
    while(str2!="0 "):
        str3=input("请输入结果:")#字符串,存放结果
        dict1[num1]=str3#将值与结果在字典中相对应
        set2=change(str2)#集合,将用户输入特征值放入此集合内
        list1.append(set2)#将特征值集合存入列表
        str2=input("请输入条件,以空格隔开:")
        str2+=" "
        num1+=1
    return num1

def Infer(animalset,list1,dict1):#推理函数,将动物条件的集合放在间接库或直接库中进行匹配
    for i in range(0,len(animalset)):#保证循环足够多的次数
        for j in range(0,(len(list1))):
            if(list1[j].issubset(animalset) or list1[j]==animalset):
                animalset.add(dict1[j])
                #print(list1[j])
                animalset=animalset-list1[j]
    return animalset

def Rec():#识别动物
    feature=input("请输入动物的特征(不同特征之间用空格隔开):")
    feature+=" "
    animalset=change(feature)
    #将动物的特征化为关键词的集合
    animalset=Infer(animalset,Indirlist,Indirdict)
    set3=Infer(animalset,Dirlist,Dirdict)#返回经过直接规则库过滤后的集合
    list2=list(set3)#将动物特征集合化为列表,便于确定最后剩下多少特征值
    if(len(list2)==1):
        print("这个动物是:"+list2[0])
    else:
        print("查无此动物")

print("请输入接下来操作(1.添加间接数据库 2.添加直接数据库 3.查询动物 0.结束操作):")
chose = input()
while (chose!='0'):
    if (chose=='1'):
        print("构造间接数据库:(输入条件时输入0结束构建)")
        Indirnum=Builddata(Indirlist,Indirdict,Indirnum)
        print("间接数据库构造完成!")
        print("")
        chose = input("请输入接下来操作(1.添加间接数据库 2.添加直接数据库 3.查询动物 0.结束操作):")
    elif (chose=='2'):
        print("构造直接数据库:(输入条件时输入0结束构建)")
        Dirnum=Builddata(Dirlist,Dirdict,Dirnum)
        print("直接数据库构造完成!")
        print("")
        chose = input("请输入接下来操作(1.添加间接数据库 2.添加直接数据库 3.查询动物 0.结束操作):")
    elif (chose=='3'):
        Rec()
        print("")
        chose = input("请输入接下来操作(1.添加间接数据库 2.添加直接数据库 3.查询动物 0.结束操作):")
    else:
        print("输入不合法,请重新输入")
        chose = input("请输入接下来操作(1.添加间接数据库 2.添加直接数据库 3.查询动物 0.结束操作):")

注:输入条件、结果时,构建间接规则库、构建直接规则库、查询动物时输入形式、相同的内容必须保持一致。

 

此文是借鉴大佬博客https://blog.csdn.net/weixin_46178977/article/details/105842471,是对大佬代码的拙劣优化。。

能够搞懂并改写这样的一个不很简单的程序,也算是对大一身为python小小白的我一个交代了吧。。

你可能感兴趣的:(python)