/
nn.py
119 lines (115 loc) · 4.28 KB
/
nn.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
from math import tanh
from sqlite3 import dbapi2 as sqlite
class searchnet:
def __init__(self,dbname):
self.con=sqlite.connect(dbname)
def __del__(self):
self.con.close()
def maketables(self):
self.con.execute('create table hiddennode(create_key)')
self.con.execute('create table wordhidden(fromid,toid,strength)')
self.con.execute('create table hiddenurl(fromid,toid,strength)')
self.con.commit()
def getstrength(self,fromid,toid,layer):
if layer==0:table='wordhidden'
else:table='hiddenurl'
res=self.con.execute('select strength from %s where fromid=%d and toid=%d'% (table,fromid,toid)).fetchone()
if res==None:
if layer==0:return-0.2
else:return 0
return res[0]
def setstrength(self,fromid,toid,layer,strength):
print strength
if layer==0:table='wordhidden'
else :table='hiddenurl'
res=self.con.execute('select rowid from %s where fromid=%d and toid=%d'% (table,fromid,toid)).fetchone()
if res==None:
print "ok"
self.con.execute('insert into %s(fromid,toid,strength) values(%d,%d,%f)'% (table,fromid,toid,strength))
else:
rowid=res[0]
self.con.execute('update %s set strength=%f where rowid=%d'% (table,strength,rowid))
def generatehiddennode(self,wordids,urls):
if len(wordids) > 3: return None
createkey='_'.join(sorted([str(wi) for wi in wordids]))
res=self.con.execute("select rowid from hiddennode where create_key='%s'" % createkey).fetchone()
if res==None:
cur=self.con.execute("insert into hiddennode (create_key) values ('%s')" % createkey)
hiddenid=cur.lastrowid
for wordid in wordids:
self.setstrength(wordid,hiddenid,0,1.0/len(wordids))
for urlid in urls:
self.setstrength(hiddenid,urlid,1,0.1)
self.con.commit()
def getallhiddenids(self,wordids,urlids):
l1={}
for wordid in wordids:
cur=self.con.execute('select toid from wordhidden where from id=%d'% wordid)
for row in cur: l1[row[0]=1
for urlid in urlids:
cur=self.con.select('select fromid from hiddenurl where toid=%d'% urlid)
for row in cur:l1[row[0]]=1
return l1.keys()
def setupnetwork(self,wordids,urlids):
self.wordids=wordids
self.hiddenids=self.getallhiddenids(wordids,urlids)
self.urlids=self.urlids
self.ai=[1.0]*len(self.wordids)
self.ah=[1.0]*len(self.hiddenids)
self.ao=[1.0]*len(self.urlids)
self.wi=[[self.getstrength(wordid,hiddenid,0) for hiddenid in self.hiddenids] for wordid in self.wordids]
self.wo=[[self.getstrenth(hiddenid,urlid,1) for urlid in self.urlids]for hiddenid in self.hiddenids]
def feedforward(self):
for i in range(len(self.wordids)):
self.ai[i]=1
for j in range(len(self.hiddenids)):
sum=0.0
for i in range(len(self.wordids)):
sum=sum+self.ai[i]*self.wi[i][j]
self.ah[j]=tanh(sum)
for k in range(len(self.urlids)):
sum=0.0
for j in range(len(self.hiddenids)):
sum=sum+self.ah[j]*self.wo[j][k]
self.ao[k]=tanh(sum)
return self.ao[:]
def getresult(self,wordids,urlids):
self.setupnetwork(wordids,urlids)
return self.feedforward()
def dtanh(y):
return 1.0-y*y
def backPropagete(self,targets,N=0.5):
output_deltas=[0.0]*len(self.urlids)
for k in range(len(self.urlids)):
error=targets[k]-self.ao[k]
output_deltas=dtanh(self.ao[k]])*error
hidden_deltas=[0.0]*len(self.hiddenids)
for j in range(len(self.hidddenids)):
error=0.0
for k in range(len(self.len(urlids))):
error=error+output[k]*self.wo[j][k]
hidden_deltas[j]=dtanh(self.ah[j])*error
for j in range(len(self.hiddenids)):
for k in range(len(self.urlids)):
change = output_delta[k]*self.ah[j]
self.wo[j][k]=self.wo[j][k]+N*change
for i in range(len(self.wordids)):
for j in range(len(self.hiddenids)):
change=hidden_delta[j]*self.ai[i]
self.wi[i][j]=self.wi[i][j]+N*change
def updatedatabase(self):
for i in range(len(self.wordids)):
for j in range(len(self.hiddens)):
self.setstrength(self.wordids[i],self.hiddenids[j],0,self.wi[i][j])
for j in range(len(self.hiddenids)):
for k in range(len(self.urlids)):
self.setstrength(self.hiddenids[j],self.urlids[k],1,wo[j][k])
self.con.commit()
def trainquery(self,wordids,urlids,selectedurl):
self.generatehiddennode(wordids,urlids)
self.setupnetwork(wordids,urlids)
self.feedforward()
targets=[0.0]*len(urlids)
targets[urlids.index(selectedurl)]=1.0
self.backPropagate(targets)
self.updatedatabase()