Пример #1
0
 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)
Пример #2
0
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)
Пример #3
0
from SemiMarkov import *
l = SemiMarkov(3)
l.read_file('evanbot.txt')
l.process()
print(l.generate_sequence(50))