All pastes #215277 Raw Edit

djuls

public python v1 · immutable
#215277 ·published 2006-10-22 14:53 UTC
rendered paste body
#!/usr/bin/env pythonimport string, random, sys, os, re, impcp = imp.find_module('cPickle')cPickle = imp.load_module('cPickle', cp[0], cp[1], cp[2])MAXGEN=1000 # Max number of words to generateNONWORD = '\n' # Use as start- and endmarkersSAVECOUNT = 30class MarkovChainer:    def __init__(self, bot):        self.bot = bot        self.dict = cPickle.load(open("markov.state", 'r'))        self.savecounter = 0    def handle_pubmsg(self, origin, match, args):        spoken = 0        addressed = 0        chainable = 1        whonick = origin.nick        message = event.arguments()[0]        target = event.target()        if re.search(string.lower(self.nick),                     string.lower(message)):            addressed = 1        if message == "%s, status?" % self.nick:            reply = (target, "I know %s phrases" %                               str(len(self.dict.keys())))            return        message = self.strip_nick(message)        message = self.strip_shit(message)        if chainable:            self.input(message)        if not spoken:            splitmsg = string.split(message, ' ')            try:                text = string.strip(self.output(splitmsg[0], splitmsg[1]))            except:                text = string.strip(self.output())        if addressed:            connection.privmsg(target, text)    def strip_nick(self, message):        return string.replace(string.strip(message),                              self.nick, '')    def strip_shit(self, message):        index = 0         for char in string.lower(message):            if char in [',']:                index = index + 1            else:                break        return string.strip(message[index:])            def input(self, originalText):        word1, word2 = NONWORD, NONWORD        wordList = string.split(originalText)        for word3 in wordList: # Loop over rest of words            if not self.dict.has_key( (word1,word2) ):                self.dict[(word1,word2)] = [] #initialize to empty list            self.dict[(word1, word2)].append(word3) # Add suffix for word-pair            word1,word2 = word2, word3 # Shift in new words as dictionary keys        self.dict[(word1,word2)] = [NONWORD] # Mark end of text        self.savecounter = self.savecounter + 1                if self.savecounter >= SAVECOUNT:            self.dumpdb()            self.savecounter = 0                def dumpdb(self):        try:            os.rename("markov.state.2", "markov.state.3")        except:            pass        try:            os.rename("markov.state.1", "markov.state.2")        except:            pass        try:            os.rename("markov.state", "markov.state.1")        except:            pass        cPickle.dump(self.dict, open("markov.state", "w"))    def output(self, word1=NONWORD, word2=NONWORD):        #word1,word2 = NONWORD, NONWORD # Start at beginning        output = word1 + " " + word2        for i in range(MAXGEN):            successorList = self.dict[(word1,word2)]            word3 = random.choice(successorList)            if word3 == NONWORD:                break            output = output + " "  + word3            word1, word2 = word2, word3        return output