1. 程式人生 > >動物專家系統(2)

動物專家系統(2)

# -*- coding: utf-8 -*-
"""
這是網上找的別人的python實現,用做參考,但是這個是用python2.7的,python3要想實現還要做一些更改
"""
import numpy as np
class productionSystem:
    def __init__(self):
        f=open("productions.txt","rb")
        self.productions=[]     # 儲存的是全體名詞
        self.charicters=[]       #  儲存的是全體特徵名詞
        self.myclass=(f.readline().strip("最終類別為:").strip()).split(",")   #  f.readline()是讀取一行
        '''
        self.myclass=   ['金錢豹', '虎', '長頸鹿', '斑馬', '鴕鳥', '企鵝', '信天翁']    # 這個列表儲存的是7個要識別的動物名稱
        '''
        for line in f.readlines():  # 針對第一行之外的每行
            if(line!='\n'):
                line=line.replace("->"," ")
                line=line.replace(","," ")
                line=line.split()    # 最終得到了一個每行名詞的列表
                self.productions.append(line)     # self.productions儲存的是全體名詞
                for ch in line:   #  針對每行的每一個名詞
                    if (ch not in self.myclass) and (ch not in self.charicters):
                        self.charicters.append(ch)    # 把特徵名詞放進self.charicters這個列表中
    def showProduction(self):
        print()
    def match(self,x):
        for ch in self.productions[x][:-1]:
            if(ch in self.work):
                continue
            else:
                return False
        return True
    def classify(self,work):
        used=np.zeros(len(self.productions))
        counter=len(self.work)
        while(True):
            for i in range(len(self.productions)):
                if(used[i]==0 and self.match(i)):
                    used[i]=1
                    self.work.append(self.productions[i][-1])
                    if(self.work[-1] in self.myclass):
                        return True
            tmp=len(self.work)
            if(tmp==counter):
                return False
            else:
                counter=tmp
    def dowork(self):
        print("所有類別有:")
        for t in self.myclass:
            print('{:<10}'.format(t),end="")
        print()
        print("所有屬性有:")
        counter=0
        for t in self.charicters:
            counter+=1
            if(counter%5==0):
                print('{:<10}'.format(t))
            else:
                print('{:<10}'.format(t),end='')
        self.work=input("\n請輸入屬性\n----屬性之間用空格隔開----\n")
        self.work=self.work.split()
        if(self.classify(self.work)):
            print("該物種為:"+self.work[-1])
        else:
            print("抱歉,未能識別出該物種\n")
def main():
    p=productionSystem()
    p.dowork()
    
if __name__=="__main__":
    main()