Advertisement
Guest User

Untitled

a guest
Feb 11th, 2016
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.08 KB | None | 0 0
  1. void Main()
  2. {
  3. var test = new Markov(2);
  4. test.ReadFromSource(File.ReadAllText(@"filenamet"));
  5. test.GenerateText().Dump();
  6. }
  7.  
  8.  
  9.  
  10. public class Markov
  11. {
  12. public Markov(int length)
  13. {
  14. _length = length;
  15. _keys = new Dictionary<string, List<string>>();
  16. }
  17.  
  18. int _length;
  19. public Dictionary<string, List<string>> _keys;
  20.  
  21.  
  22. public void ReadFromSource(string source)
  23. {
  24. var buffer = new Queue<string>(_length);
  25.  
  26. foreach (var word in getWords(source))
  27. {
  28. var key = getKey(buffer.Take(_length));
  29. buffer.CircularAdd(_length, word);
  30.  
  31. if (buffer.Count() < _length) continue;
  32.  
  33. if (!_keys.ContainsKey(key)) _keys[key] = new List<string>();
  34. _keys[key].Add(word);
  35. }
  36. }
  37.  
  38. public string GenerateText()
  39. {
  40. var maxLen = 500;
  41. var sb = new StringBuilder();
  42. foreach (var word in generate())
  43. {
  44. if(maxLen-- <= 0) break;
  45. sb.Append(word + " ");
  46. }
  47.  
  48. return sb.ToString();
  49. }
  50.  
  51. private IEnumerable<string> generate()
  52. {
  53. var rnd = new Random();
  54. var size = _keys.Count();
  55.  
  56. var queue = new Queue<string>(_length);
  57. var first = _keys.Keys.ElementAt(rnd.Next(size-1));
  58.  
  59.  
  60.  
  61.  
  62. while (true)
  63. {
  64.  
  65. if (queue.Count() < _length)
  66. {
  67. foreach (var word in first.Split('|'))
  68. {
  69. queue.CircularAdd(_length, word);
  70. yield return word;
  71. }
  72. }
  73.  
  74. var key = getKey(queue);
  75. if (_keys.ContainsKey(key))
  76. {
  77. var words = _keys[key];
  78. var index = rnd.Next(words.Count());
  79. var word = words[index];
  80. queue.CircularAdd(_length, word);
  81. yield return word;
  82. }
  83. else
  84. {
  85. Debug.WriteLine("No key found", getKey(queue));
  86. queue.Dequeue();
  87. }
  88. }
  89.  
  90. }
  91.  
  92.  
  93.  
  94. private string getKey(IEnumerable<string> keys)
  95. {
  96. return keys.DefaultIfEmpty().Aggregate((a, b) => $"{a}|{b}");
  97. }
  98.  
  99. private IEnumerable<string> getWords(string source)
  100. {
  101. var result = source.Split(" ".ToArray(), StringSplitOptions.RemoveEmptyEntries);
  102. foreach (var r in result) yield return r;
  103. }
  104. }
  105.  
  106. static class Helpers
  107. {
  108. public static Queue<string> CircularAdd(this Queue <string> queue, int length, string value)
  109. {
  110. queue.Enqueue(value);
  111. while(queue.Count() > length) queue.Dequeue();
  112. return queue;
  113. }
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement