def __init__(self, data_file, keywords_file=None): self.find_serial() self.lcd = LiquidCrystal(20, 4) self.bot = SemiMarkov() self.bot.load_trained_data(data_file) self.bot.remove_links() if keywords_file is not None: self.establish_keywords(keywords_file)
class LauraBot: def __init__(self, data_file, keywords_file=None): self.find_serial() self.lcd = LiquidCrystal(20, 4) self.bot = SemiMarkov() self.bot.load_trained_data(data_file) self.bot.remove_links() if keywords_file is not None: self.establish_keywords(keywords_file) def find_serial(self): '''Tries to find an active /dev/ttyACM# port''' port = '/dev/ttyACM{0}' for port_num in range(0, 10): try: self.serial = serial.Serial(port.format(port_num), 19200) self.serial.write(self.lcd.format('Engaged Serial on ttyACM{0}'.format(port_num))) print('Connected on {0})'.format(port)) return except: print('Unable to find on port {0}.'.format(port_num)) def establish_keywords(self, keywords_file): ''' Gets a set of keywords from a file (which will be used to scale specific instances of words, and therefore increase the likelihood of specific topics) ''' self.keywords = json.load(open(keywords_file,'r')) for wset in self.keywords['keywords']: self.bot.scale_specific_words(wset['words'], wset['scalar']) def generate_sequences(self, num): '''Attempts to find a sequence which is acceptable''' possible_sequences = self.bot.generate_sequences(num) refined = [s for s in possible_sequences if (len(s) > 10 and len(s) < self.lcd.maximum_sequence_length())] return sorted(refined, reverse=True, \ key = lambda y: self.evaluate_keywords(y) )[0] def evaluate_keywords(self, sequence): '''Looks for matches in a sequence''' weight = 0 if hasattr(self, 'keywords'): for wset in self.keywords['keywords']: seq_set = set([a.lower() for a in sequence]) num_matches = len(list(seq_set.intersection(wset['words']))) weight += math.log10(wset['scalar'])*num_matches return weight def wait_for_button_press(self): '''Waits for a button press event from Arduino''' self.serial.read() time.sleep(0.1) while self.serial.inWaiting(): nonsense = self.serial.read() time.sleep(0.05)
from SemiMarkov import * l = SemiMarkov(3) l.read_file('evanbot.txt') l.process() print(l.generate_sequence(50))