public IEnumerable <string> GenerateSequence() { IMarkovNode <string> start = GetNode(Constants.SentenceStart); IMarkovNode <string> end = GetNode(Constants.SentenceBreak); return(GetSequenceInternal(start, end)); }
public string GenerateSentence() { IMarkovNode <string> start = GetNode(Constants.SentenceStart); IMarkovNode <string> end = GetNode(Constants.SentenceBreak); IEnumerable <string> sequence = GetSequenceInternal(start, end); return(string.Join(" ", sequence)); }
private IEnumerable <string> GetSequenceInternal(IMarkovNode <string> start, IMarkovNode <string> end) { for (int i = 0; i < MaxGenerateAttempts; i++) { List <string> s = GenerateSequenceInternalFrom(start, end).ToList(); if (s.Count < 3) { continue; } return(s); } return(Enumerable.Empty <string>()); }
private IEnumerable <string> GenerateSequenceInternalFrom(IMarkovNode <string> start, IMarkovNode <string> end) { IMarkovNode <string> current = start; while (true) { // TODO: If the character is a quote, comma or semi-colon, the previous word should // be used instead string nextKey = current.GetRandomNext(); if (nextKey == end.Value) { break; } string word = nextKey.Split('|').First(); yield return(word); current = GetNode(word); } }
public void Train(IEnumerable <string> sequence) { IEnumerator <string> enumerator = sequence.GetEnumerator(); enumerator.MoveNext(); string token = enumerator.Current; IMarkovNode <string> currentNode = GetNode(token); while (enumerator.MoveNext()) { // Get the next node. token = enumerator.Current; IMarkovNode <string> node = GetNode(token); // Point the current node to the next node currentNode.AddNext(token); // Update the current node currentNode = node; } }