Paste number 5495: intelligence.py

Paste number 5495: intelligence.py
Pasted by: AaronSw
When:7 years, 3 months ago
Share:Tweet this! | http://paste.lisp.org/+48N
Channel:#swhack
Paste contents:
Raw Source | XML | Display As
import random
from copy import copy


class Node:
	def __init__(self, name):
		self.m = {} # memory
		self.c = 0 # counter
		self.name = name
	
	def __repr__(self): return "<Node "+str(self.name)+">"
	
	def input(self, names):
		out = []
		for name in names:
				if name in self.m:
					out.append(self.m[name])
		
		return sum(out)
	
	def learn(self, names):
		for name in names:
			if name in self.m: self.m[name] += 1
			else: self.m[name] = 1.
			self.c += 1
	
	def top(self, n):
		out = []
		for k in self.m.keys():
			if len(out) < n:
				out.append(k)
			elif self.m[k] > self.m[out[0]]:
				out[0] = k
			out.sort(lambda x,y: cmp(self.m[x], self.m[y]))

		return out			

class Brain:
	def __init__(self, size):
		self.nodes = []
		for i in range(size): self.nodes.append(Node(i))

	def train(self, input):
		for names in input:
				self.choose(names, 1)

	def choose(self, names, train=0):
		max = -1
		best = None
		equal = True
	
		for node in self.nodes:
			r = node.input(names)
			if max != -1 and r!=max: equal = False
			if r > max:
				max = r
				best = node
		if equal:
			newnodes = copy(self.nodes)
			newnodes.sort(lambda x,y: cmp(len(x.m.keys()), len(y.m.keys())))
			newnodes[0].learn(names)
			best = self.choose(names, train)
		else:
			best.learn(names)
		return best

	def related(self, names, n):
		node = self.choose(names)
		return node.top(n)
			

training = [
	("eat", "kill", "hit"),
	("hit", "sit", "stare"),
	("stare", "strike", "sip"),
	("book", "box", "mat"),
	("mat", "bat", "bit"),
	("bit", "kit", "kite")
]

b = Brain(2)

for i in range(1): b.train(training)

This paste has no annotations.

Colorize as:
Show Line Numbers

Lisppaste pastes can be made by anyone at any time. Imagine a fearsomely comprehensive disclaimer of liability. Now fear, comprehensively.