Beispiel #1
0
        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);
        }
Beispiel #2
0
        public MarkovChainSegment Clone()
        {
            MarkovChainSegment tmp = new MarkovChainSegment("");

            tmp.Postfixes.Clear();
            foreach (var Postfix in Postfixes)
            {
                tmp.Postfixes.Add(Postfix.Key, Postfix.Value);
            }
            return(tmp);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
 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);
         }
     }
 }
Beispiel #5
0
 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);
 }
Beispiel #6
0
        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);
        }
Beispiel #7
0
        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);
        }
Beispiel #8
0
        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++;
            }
        }