Advertisement
Shinmera

Colleen Markov Module

Nov 16th, 2013
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 2.14 KB | None | 0 0
  1. (define-handler on-message markov (privmsg-event event)
  2.   (when (char= (aref (channel event) 0) #\#)
  3.     (unless (char= (aref (message event) 0) #\!)
  4.       (learn markov (message event)))
  5.  
  6.     (when (< (random 100) (probability markov))
  7.       (let ((wordlist (split-sequence:split-sequence #\Space (message event) :remove-empty-subseqs T)))
  8.         (when (cdr wordlist)
  9.           (let ((response (generate-string markov (first wordlist) (second wordlist))))
  10.             (when (and response (not (string= (message event) response)))
  11.               (respond event response))))))))
  12.  
  13. (defmethod learn ((markov markov) message)
  14.   (let ((wordlist (split-sequence:split-sequence #\Space message :remove-empty-subseqs T)))
  15.     (when (cddr wordlist)
  16.       (v:debug :markov "Learning from: ~a" message)
  17.       (loop for word1 = "!NONWORD!" then word2
  18.          for word2 = "!NONWORD!" then word3
  19.          for k = (format NIL "~a ~a" word1 word2)
  20.          for word3 in wordlist
  21.          do (push word3 (gethash k (registry markov)))
  22.          finally (push "!NONWORD!" (gethash k (registry markov)))))))
  23.  
  24. (defmethod generate-string ((markov markov) &optional (word1 "!NONWORD!") (word2 "!NONWORD!"))
  25.   (let* ((output (if (string= word1 "!NONWORD!") "" (format NIL "~a ~a" word1 word2))))
  26.     (unless (string= word1 "!NONWORD!")
  27.       (let ((wordlist (remove "!NONWORD!" (gethash output (registry markov)) :test #'string=)))
  28.         (when wordlist
  29.           (let ((word3 (random-elt wordlist)))
  30.             (setf output (format NIL "~a ~a" output word3)
  31.                   word1 word2
  32.                   word2 word3)))))
  33.     (loop for i from 0 below 50
  34.        for wordlist = (gethash (format NIL "~a ~a" word1 word2) (registry markov))
  35.        while wordlist
  36.        for word3 = (random-elt wordlist)
  37.        until (string= word3 "!NONWORD!")
  38.        do (setf output (format NIL "~a ~a" output word3)
  39.                 word1 word2
  40.                 word2 word3))
  41.     (setf output (string-trim '(#\Space #\Tab #\Return #\Linefeed) output))
  42.     (v:trace :markov "Generated string: ~a" output)
  43.     (if (> (length (split-sequence:split-sequence #\Space output)) 0) output)))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement