lolamontes69

Ch12 App3:Neural Network Classifier. Prog..Collective Intel.

Oct 1st, 2013
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 11.41 KB | None | 0 0
  1. """ Chapter 12 Programming Collective Intelligence: Neural Network Classifier.
  2.  
  3.   As the chapter has no exercises in it I have decided to create a practical
  4.   application for each of the Algorithms and Methods described.
  5.   Next up the Neural Network Classifier.
  6.  
  7.   So for this I have created an app that trains a Neural Network and classifies
  8.   whether files opened are likely to contain Python, Bash or AIML code
  9.   based upon the presence of 8 keywords from each code.
  10.  
  11.   I used psyco to speed things up, but psyco is not obligatory :)
  12. """
  13.  
  14. from math import tanh
  15. import json
  16. from Tkinter import *
  17. from tkFileDialog import askopenfilename
  18. import os as os
  19. import re as re
  20. import time as time
  21.  
  22. def dtanh(y):
  23.     return 1.0-y*y
  24.  
  25. class searchnet:
  26.     def __init__(self):
  27.         try:
  28.             f = open('hiddennode.json', 'r')
  29.             self.hiddennode={}
  30.             for line in f:
  31.                 self.hiddennode = json.loads(line)           # json saves keys as strings so...
  32.             for a in self.hiddennode.keys():
  33.                 self.hiddennode[int(a)]=self.hiddennode[a]   # ...for keeping track of hiddenid.
  34.                 del self.hiddennode[a]
  35.             f = open('wordhidden.json', 'r')
  36.             self.wordhidden={}
  37.             for line in f:
  38.                 self.wordhidden = json.loads(line)
  39.             f = open('hiddenurl.json', 'r')
  40.             self.hiddenurl={}
  41.             for line in f:
  42.                 self.hiddenurl = json.loads(line)
  43.         except:
  44.             print "The required dictionaries don't exist in this folder."
  45.             shall=str(raw_input('Shall I create them for you? (y/n) >'))
  46.             if shall=='y' or shall=='Y':
  47.                 self.create_dics()
  48.                 print"-"*44
  49.                 print '"hiddennode.json", "wordhidden.json" and "hiddenurl.json" created.'
  50.         self.include_list = ['def','return','global','input','class','int','elif','except','import','pidof','grep','echo','sh','ls','cd','read','then','arr','category','pattern','topic','template','li','star','aiml','think']
  51.  
  52.     def create_dics(self):
  53.         self.hiddennode={}
  54.         self.wordhidden={}
  55.         self.hiddenurl={}
  56.         f = open('hiddennode.json', 'w')
  57.         f.write(json.dumps(self.hiddennode))
  58.         f.close()
  59.         f = open('wordhidden.json', 'w')
  60.         f.write(json.dumps(self.wordhidden))
  61.         f.close()
  62.         f = open('hiddenurl.json', 'w')
  63.         f.write(json.dumps(self.hiddenurl))
  64.         f.close()
  65.  
  66.     def save_dics(self):
  67.         f = open('hiddennode.json', 'w')
  68.         f.write(json.dumps(self.hiddennode))
  69.         f.close()
  70.         f = open('wordhidden.json', 'w')
  71.         f.write(json.dumps(self.wordhidden))
  72.         f.close()
  73.         f = open('hiddenurl.json', 'w')
  74.         f.write(json.dumps(self.hiddenurl))
  75.         f.close()
  76.  
  77.     def getstrength(self,fromid1,toid1,layer):
  78.         fromid=str(fromid1)  # json saves as strings
  79.         toid=str(toid1)
  80.         if layer==0:
  81.             try: res=self.wordhidden[fromid][toid]
  82.             except: res=-0.2
  83.         else:
  84.             try: res=self.hiddenurl[fromid][toid]
  85.             except: res=0
  86.         return float(res)
  87.  
  88.     def setstrength(self,fromid1,toid1,layer,strength):
  89.         fromid=str(fromid1)  # json saves as strings
  90.         toid=str(toid1)
  91.         if layer==0:
  92.             if str(fromid) in self.wordhidden:
  93.                 self.wordhidden[fromid][toid]=strength
  94.             else:
  95.                 self.wordhidden[fromid]={}
  96.                 self.wordhidden[fromid][toid]=strength
  97.         else:
  98.             if fromid in self.hiddenurl:
  99.                 self.hiddenurl[fromid][toid]=strength
  100.             else:
  101.                 self.hiddenurl[fromid]={}
  102.                 self.hiddenurl[fromid][toid]=strength
  103.  
  104.     def generatehiddennode(self,wordids,urls):
  105.         # if len(wordids)>3: return None
  106.         createkey='_'.join(sorted([str(wi) for wi in wordids]))
  107.         hiddenid=0
  108.         notin=0
  109.         if len(self.hiddennode)==0:
  110.             self.hiddennode[0]=createkey
  111.             notin=1
  112.         else:
  113.             for a in self.hiddennode:
  114.                 if self.hiddennode[a]==createkey:
  115.                     hiddenid=a
  116.                     notin=1
  117.         if notin==0:
  118.             hiddenid=int(max(self.hiddennode))+1
  119.             self.hiddennode[hiddenid]=createkey
  120.         for wordid in wordids:
  121.             self.setstrength(wordid,hiddenid,0,1.0/len(wordids))
  122.         for urlid in urls:
  123.             self.setstrength(hiddenid,urlid,1,0.1)
  124.  
  125.  
  126.     def getallhiddenids(self,wordids,urlids):
  127.         l1={}
  128.         for wordid in wordids:
  129.             if str(wordid) in self.wordhidden:
  130.                 a=self.wordhidden[str(wordid)].keys()
  131.                 for row in a: l1[row]=1
  132.         for urlid in urlids:
  133.             for a in self.hiddenurl:
  134.                 if str(urlid) in self.hiddenurl[a]:
  135.                     l1[a]=1
  136.         return l1.keys()
  137.  
  138.     def setupnetwork(self,wordids,urlids):
  139.         # Value lists
  140.         self.wordids=wordids
  141.         self.hiddenids=self.getallhiddenids(wordids,urlids)
  142.         self.urlids=urlids
  143.  
  144.         # Node outputs         strengths set to default values
  145.         self.ai = [1.0]*len(self.wordids)
  146.         self.ah = [1.0]*len(self.hiddenids)
  147.         self.ao = [1.0]*len(self.urlids)
  148.  
  149.         # Create weights matrix
  150.         self.wi =[[self.getstrength(wordid,hiddenid,0) for hiddenid in self.hiddenids] for wordid in self.wordids]
  151.         self.wo =[[self.getstrength(hiddenid,urlid,1) for urlid in self.urlids] for hiddenid in self.hiddenids]
  152.  
  153.     def feedforward(self):
  154.         # the only inputs are the query words
  155.         for i in range(len(self.wordids)):
  156.             self.ai[i] = 1.0
  157.  
  158.         # hidden activations
  159.         for j in range(len(self.hiddenids)):
  160.             sum = 0.0
  161.             for i in range(len(self.wordids)):
  162.                 sum = sum + self.ai[i] * self.wi[i][j]
  163.             self.ah[j] = tanh(sum)
  164.  
  165.         # output activations
  166.         for k in range(len(self.urlids)):
  167.             sum = 0.0
  168.             for j in range(len(self.hiddenids)):
  169.                 sum = sum + self.ah[j] * self.wo[j][k]
  170.             self.ao[k] = tanh(sum)
  171.  
  172.         return self.ao[:]
  173.  
  174.     def getresult(self,wordids,urlids):
  175.         self.setupnetwork(wordids,urlids)
  176.         return self.feedforward()
  177.  
  178.     def backPropagate(self,targets, N=0.5):
  179.         # calculate errors for output
  180.         output_deltas = [0.0]*len(self.urlids)
  181.         for k in range(len(self.urlids)):
  182.             error = targets[k]-self.ao[k]
  183.             output_deltas[k] = dtanh(self.ao[k])*error
  184.  
  185.         # calculate errors for hidden layer
  186.         hidden_deltas = [0.0]*len(self.hiddenids)
  187.         for j in range(len(self.hiddenids)):
  188.             error = 0.0
  189.             for k in range(len(self.urlids)):
  190.                 error = error+output_deltas[k]*self.wo[j][k]
  191.             hidden_deltas[j] = dtanh(self.ah[j])*error
  192.  
  193.         # update output weights
  194.         for j in range(len(self.hiddenids)):
  195.             for k in range(len(self.urlids)):
  196.                 change=output_deltas[k]*self.ah[j]
  197.                 self.wo[j][k] = self.wo[j][k] + N*change
  198.  
  199.         # update input weights
  200.         for i in range(len(self.wordids)):
  201.             for j in range(len(self.hiddenids)):
  202.                 change = hidden_deltas[j]*self.ai[i]
  203.                 self.wi[i][j] = self.wi[i][j] + N*change
  204.  
  205.     def trainquery(self,wordids,urlids,selectedurl):
  206.         # generate a hiddennode if neccessary
  207.         self.generatehiddennode(wordids,urlids)
  208.  
  209.         self.setupnetwork(wordids,urlids)
  210.         self.feedforward()
  211.         targets=[0.0]*len(urlids)
  212.         targets[urlids.index(selectedurl)]=1.0
  213.         error = self.backPropagate(targets)
  214.         self.updatedatabase()
  215.  
  216.     def updatedatabase(self):
  217.         # set them to database values
  218.         for i in range(len(self.wordids)):
  219.             for j in range(len(self.hiddenids)):
  220.                 self.setstrength(self.wordids[i],self.hiddenids[j],0,self.wi[i][j])
  221.         for j in range(len(self.hiddenids)):
  222.             for k in range(len(self.urlids)):
  223.                 self.setstrength(self.hiddenids[j],self.urlids[k],1,self.wo[j][k])
  224.  
  225.     def getwords(self,doc):
  226.         splitter=re.compile('\\W*')
  227.         words=[s.lower() for s in splitter.split(doc) if len(s)>2 and len(s)<20]
  228.         dicto = dict([(w,1) for w in words])
  229.         list1=[]
  230.         for a in dicto:
  231.             if a in self.include_list:
  232.                 list1.append(a)
  233.         return list1
  234.  
  235.     def train_one(self):
  236.         os.system('clear')
  237.         a = time.time()
  238.         print "Training the Neural Network..."
  239.         print 'Current time =',str(time.localtime(a)[3])+':'+str(time.localtime(a)[4])+':'+str(time.localtime(a)[5])
  240.         featlist=[['def','return','class','int','elif','global','except','import'],
  241.                   ['echo','sh','ls','cd','read','pidof','grep','arr'],
  242.                   ['category','pattern','template','li','star','topic','aiml','think']]
  243.         catlist=['python','bash','aiml']
  244.         for a in range(len(featlist)):
  245.             for b in range(len(featlist[a])):
  246.                 featlist1=[featlist[a][b]]
  247.                 self.trainquery(featlist1,catlist,catlist[a])         # train single
  248.                 for c in range(len(featlist[a])):
  249.                     featlist2=[]
  250.                     if featlist[a][b]==featlist[a][c]:
  251.                         pass
  252.                     else:
  253.                         featlist2.append(featlist[a][b])
  254.                         featlist2.append(featlist[a][c])
  255.                         self.trainquery(featlist2,catlist,catlist[a]) # train single
  256.         self.save_dics()
  257.  
  258.     def classify(self):
  259.         another = ""
  260.         while another != 'n':
  261.             fulltext = ""
  262.             os.system('clear')
  263.             root = Tk()           # This closes the askopenfilename box after it gets the filename
  264.             root.withdraw()
  265.             print "-"*44,"\n      Classify a file.\n","-"*44
  266.             filename = askopenfilename(filetypes = [('All','*')])
  267.             os.system('clear')
  268.             for line in open(filename):
  269.                 fulltext += line.strip()
  270.             featlist=self.getwords(fulltext)
  271.             catlist=[]
  272.             try:
  273.                 for a in self.hiddenurl:
  274.                     for b in self.hiddenurl[a]:        
  275.                         if b not in catlist: catlist.append(b)
  276.             except: pass
  277.             print "-"*44
  278.             print "Contains features\n",featlist
  279.             a=self.getresult(featlist,catlist)
  280.             if len(a)==0: a=[0]*len(catlist)
  281.             self.save_dics()
  282.             print "-"*44
  283.             print filename,"\nClassified as:"
  284.             for z in range(len(catlist)):
  285.                 print '   ',catlist[z],'\t:',a[z]
  286.             print "-"*44
  287.             another = raw_input('Classify another? >')
  288.  
  289.  
  290. if __name__ == "__main__":
  291.     import neural_network_example as nn
  292.     mynet=nn.searchnet()
  293.     try:
  294.         import psyco
  295.         psyco.full()
  296.     except:
  297.         print 'Unable to import psyco'
  298.     doya=str(raw_input('Do you want to train/create the neural network? (y/n) >'))
  299.     if doya=="y" or doya=="Y":
  300.         for a in range(200):
  301.            mynet.train_one()
  302.     mynet.classify()
  303.  
  304. """
  305. #########
  306. # Usage #
  307. #########
  308.  
  309. import neural_network_example as nn
  310. mynet=nn.searchnet()
  311. for a in range(200):
  312.    mynet.train_one()
  313.  
  314. mynet.classify()
  315.  
  316. """
Advertisement
Add Comment
Please, Sign In to add comment