動物專家系統(2)
阿新 • • 發佈:2018-12-19
# -*- 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()