Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (define-handler on-message markov (privmsg-event event)
- (when (char= (aref (channel event) 0) #\#)
- (unless (char= (aref (message event) 0) #\!)
- (learn markov (message event)))
- (when (< (random 100) (probability markov))
- (let ((wordlist (split-sequence:split-sequence #\Space (message event) :remove-empty-subseqs T)))
- (when (cdr wordlist)
- (let ((response (generate-string markov (first wordlist) (second wordlist))))
- (when (and response (not (string= (message event) response)))
- (respond event response))))))))
- (defmethod learn ((markov markov) message)
- (let ((wordlist (split-sequence:split-sequence #\Space message :remove-empty-subseqs T)))
- (when (cddr wordlist)
- (v:debug :markov "Learning from: ~a" message)
- (loop for word1 = "!NONWORD!" then word2
- for word2 = "!NONWORD!" then word3
- for k = (format NIL "~a ~a" word1 word2)
- for word3 in wordlist
- do (push word3 (gethash k (registry markov)))
- finally (push "!NONWORD!" (gethash k (registry markov)))))))
- (defmethod generate-string ((markov markov) &optional (word1 "!NONWORD!") (word2 "!NONWORD!"))
- (let* ((output (if (string= word1 "!NONWORD!") "" (format NIL "~a ~a" word1 word2))))
- (unless (string= word1 "!NONWORD!")
- (let ((wordlist (remove "!NONWORD!" (gethash output (registry markov)) :test #'string=)))
- (when wordlist
- (let ((word3 (random-elt wordlist)))
- (setf output (format NIL "~a ~a" output word3)
- word1 word2
- word2 word3)))))
- (loop for i from 0 below 50
- for wordlist = (gethash (format NIL "~a ~a" word1 word2) (registry markov))
- while wordlist
- for word3 = (random-elt wordlist)
- until (string= word3 "!NONWORD!")
- do (setf output (format NIL "~a ~a" output word3)
- word1 word2
- word2 word3))
- (setf output (string-trim '(#\Space #\Tab #\Return #\Linefeed) output))
- (v:trace :markov "Generated string: ~a" output)
- (if (> (length (split-sequence:split-sequence #\Space output)) 0) output)))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement