public static MarkovChain ReadFromStream(StreamReader reader) { MarkovChain chain = null; while (!reader.EndOfStream) { var prefixline = reader.ReadLine(); var prefixes = prefixline.Split(','); if (chain == null) { chain = new MarkovChain(prefixes.Length); } var prefix = new MarkovPrefix(prefixes.Select(x => x[0] == '"' ? x.Substring(1, x.Length - 2) : null)); List <string> Postfixes = new List <string>(); var nextLine = reader.ReadLine(); while (nextLine != "-") { Postfixes.Add(nextLine); nextLine = reader.ReadLine(); } chain.Segments.Add(prefix, MarkovChainSegment.GenerateSegment(Postfixes)); } return(chain); }
public MarkovChainSegment Clone() { MarkovChainSegment tmp = new MarkovChainSegment(""); tmp.Postfixes.Clear(); foreach (var Postfix in Postfixes) { tmp.Postfixes.Add(Postfix.Key, Postfix.Value); } return(tmp); }
public static MarkovChainSegment GenerateSegment(List <string> postfixes) { var tuples = postfixes.Select(x => new Tuple <int, string>(int.Parse(x.Substring(0, x.IndexOf(' '))), x.Substring(x.IndexOf(' ') + 1))).ToArray(); MarkovChainSegment segment = new MarkovChainSegment(tuples[0].Item2); segment.Postfixes.Clear(); foreach (var tup in tuples) { segment.Postfixes.Add(tup.Item2, tup.Item1); } return(segment); }
public void Extend(MarkovChain otherChain) { foreach (var seg in otherChain.Segments) { if (Segments.ContainsKey(seg.Key)) { MarkovChainSegment.Merge(Segments[seg.Key], seg.Value); } else { Segments.Add(seg.Key, seg.Value); } } }
public static MarkovChainSegment Merge(MarkovChainSegment mergeInto, MarkovChainSegment data) { foreach (var seg in data.Postfixes) { if (mergeInto.Postfixes.ContainsKey(seg.Key)) { mergeInto.Postfixes[seg.Key] += seg.Value; } else { mergeInto.Postfixes.Add(seg.Key, seg.Value); } } return(mergeInto); }
public static double ComparePercentage(MarkovChainSegment test, MarkovChainSegment source) { var perTest = 1.0 / test.Postfixes.Sum(x => x.Value); var total = 0; foreach (string postfix in test.Postfixes.Keys) { if (source.Postfixes.ContainsKey(postfix)) { total += test.Postfixes[postfix]; } } return(perTest * total); }
public static double PercentageMatch(MarkovChain test, MarkovChain source) { int totalSegments = test.Segments.Count; double perSegment = 1.0 / totalSegments; var total = 0.0; foreach (var segment in test.Segments) { var prefix = segment.Key; if (source.Segments.ContainsKey(prefix)) { var sourceSegment = source.Segments[prefix]; total += perSegment * MarkovChainSegment.ComparePercentage(sourceSegment, source.Segments[prefix]); } } return(total); }
public IEnumerable <MarkovChain> BuildSubChains() { var skip = 1; for (var length = this.MaxChainLength - 1; length >= 1; length--) { MarkovChain tempChain = new MarkovChain(length); var grp = this.Segments.GroupBy((kv) => new MarkovPrefix(kv.Key.Prefix.Skip(skip))); foreach (var SegmentGroup in grp) { var prefix = new MarkovPrefix(SegmentGroup.First().Key.Prefix.Skip(skip)); MarkovChainSegment newSegment = new MarkovChainSegment(""); newSegment.Postfixes.Clear(); foreach (var Segment in SegmentGroup) { newSegment = MarkovChainSegment.Merge(newSegment, Segment.Value); } tempChain.Segments.Add(prefix, newSegment); } yield return(tempChain); skip++; } }