Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void Main()
- {
- var test = new Markov(2);
- test.ReadFromSource(File.ReadAllText(@"filenamet"));
- test.GenerateText().Dump();
- }
- public class Markov
- {
- public Markov(int length)
- {
- _length = length;
- _keys = new Dictionary<string, List<string>>();
- }
- int _length;
- public Dictionary<string, List<string>> _keys;
- public void ReadFromSource(string source)
- {
- var buffer = new Queue<string>(_length);
- foreach (var word in getWords(source))
- {
- var key = getKey(buffer.Take(_length));
- buffer.CircularAdd(_length, word);
- if (buffer.Count() < _length) continue;
- if (!_keys.ContainsKey(key)) _keys[key] = new List<string>();
- _keys[key].Add(word);
- }
- }
- public string GenerateText()
- {
- var maxLen = 500;
- var sb = new StringBuilder();
- foreach (var word in generate())
- {
- if(maxLen-- <= 0) break;
- sb.Append(word + " ");
- }
- return sb.ToString();
- }
- private IEnumerable<string> generate()
- {
- var rnd = new Random();
- var size = _keys.Count();
- var queue = new Queue<string>(_length);
- var first = _keys.Keys.ElementAt(rnd.Next(size-1));
- while (true)
- {
- if (queue.Count() < _length)
- {
- foreach (var word in first.Split('|'))
- {
- queue.CircularAdd(_length, word);
- yield return word;
- }
- }
- var key = getKey(queue);
- if (_keys.ContainsKey(key))
- {
- var words = _keys[key];
- var index = rnd.Next(words.Count());
- var word = words[index];
- queue.CircularAdd(_length, word);
- yield return word;
- }
- else
- {
- Debug.WriteLine("No key found", getKey(queue));
- queue.Dequeue();
- }
- }
- }
- private string getKey(IEnumerable<string> keys)
- {
- return keys.DefaultIfEmpty().Aggregate((a, b) => $"{a}|{b}");
- }
- private IEnumerable<string> getWords(string source)
- {
- var result = source.Split(" ".ToArray(), StringSplitOptions.RemoveEmptyEntries);
- foreach (var r in result) yield return r;
- }
- }
- static class Helpers
- {
- public static Queue<string> CircularAdd(this Queue <string> queue, int length, string value)
- {
- queue.Enqueue(value);
- while(queue.Count() > length) queue.Dequeue();
- return queue;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement