Advertisement
Guest User

Untitled

a guest
Feb 20th, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.20 KB | None | 0 0
  1. from collections import defaultdict as dd, deque
  2. from random import random
  3. import re
  4.  
  5. class MarkovTextGenerator:
  6. def __init__(self, depth):
  7. self.freq = dd(lambda: dd(int))
  8. self.quantity = dd(int)
  9. self.depth = depth
  10. def learn(self, text):
  11. words = re.split("\\s+", text)
  12. state = deque([None] * self.depth)
  13. for word in words:
  14. state.popleft()
  15. self.freq[str(state)][word] += 1
  16. self.quantity[str(state)] += 1
  17. state.append(word)
  18. def generate(self, size):
  19. state = deque([None] * self.depth)
  20. for i in range(size):
  21. try:
  22. state.popleft()
  23. except:
  24. break
  25. pick = random()
  26. acc = 0.0
  27. for p in self.freq[str(state)].keys():
  28. if (acc + self.freq[str(state)][p] / self.quantity[str(state)] >= pick):
  29. print(p, end=" ")
  30. state.append(p)
  31. break
  32. acc += self.freq[str(state)][p] / self.quantity[str(state)]
  33.  
  34. # usage
  35. fin = open('input.txt')
  36.  
  37. mtg = MarkovTextGenerator(4)
  38. mtg.learn(fin.read())
  39. mtg.generate(1000)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement