示例#1
0
        public string Generate(int order)
        {
            if (order > ModelOrder)
            {
                throw new ApplicationException("Cannot generate higher order than was built.");
            }
            StringBuilder rslt = new StringBuilder();

            rslt.Append(StartChar, order);
            int  iStart = 0;
            char ch     = StartChar;

            do
            {
                MarkovNode node = Root.Children[rslt[iStart]];
                for (int i = 1; i < order; ++i)
                {
                    node = node.Children[rslt[i + iStart]];
                }
                ch = SelectChildChar(node);
                if (ch != EndChar)
                {
                    rslt.Append(ch);
                }
                ++iStart;
            } while (ch != EndChar);

            // remove start characters from the string
            return(rslt.ToString().Substring(order));
        }
示例#2
0
        public string ToString(int order)
        {
            StringBuilder result = new StringBuilder();

            result.Append(StartChar, order);
            int  iStart = 0;
            char ch     = StartChar;

            do
            {
                MarkovNode node = Root.Children[result[iStart]];
                for (int i = 1; i < order; i++)
                {
                    node = node.Children[result[i + iStart]];
                }
                ch = ChildGet(node);
                if (ch != StopChar)
                {
                    result.Append(ch);
                }
                ++iStart;
            }while (ch != StopChar);

            string clean = result.ToString().Substring(order);

            if (clean.Contains(StartChar))
            {
                clean = clean.Replace(StartChar.ToString(), "");
            }
            return(clean);
        }
示例#3
0
 public void AddDescendent(MarkovNode n)
 {
     var current = root.descendents.SingleOrDefault(descendent => descendent.Value == n.Value);
     if (current == null)
         descendents.Add(n);
     else
         current.AddHit();
 }
示例#4
0
        public MarkovChain(int order = 0)
        {
            ModelOrder = order;
            Root       = new MarkovNode(StartChar);

            //foreach (char c in text)
            //{
            //    ++Root.Count;
            //    Root.AddNode(c);
            //}

            //Root.AddNode(StopChar);
        }
示例#5
0
        public MarkovTextModel(string text, int order)
        {
            Root = new MarkovNode(StartChar);

            // Currently building only an order 0 model
            foreach (char c in text)
            {
                ++Root.Count;
                Root.AddChild(c);
            }

            // Add the stop character
            Root.AddChild(EndChar);
        }
        public MarkovTextModel(string text, int order)
        {
            Root = new MarkovNode(StartChar);

            // Currently building only an order 0 model
            foreach (char c in text)
            {
                ++Root.Count;
                Root.AddChild(c);
            }

            // Add the stop character
            Root.AddChild(EndChar);
        }
示例#7
0
            public MarkovNode AddNode(char c)
            {
                ++FollowCount;
                MarkovNode child;

                if (Children.TryGetValue(c, out child))
                {
                    ++child.Count;
                }
                else
                {
                    child = new MarkovNode(c);
                    Children.Add(c, child);
                }
                return(child);
            }
示例#8
0
        private char ChildGet(MarkovNode node)
        {
            int roll      = StatePicker.Next(node.FollowCount);
            int frequency = 0;

            foreach (var kvp in node.Children)
            {
                frequency += kvp.Value.Count;
                if (frequency > roll)
                {
                    return(kvp.Key);
                }
            }

            throw new Exception("I shit the bed!");
        }
示例#9
0
        private MarkovChain <MapPixel> GetMarkovChain(MapPixel startValue)
        {
            var landNode  = new MarkovNode <MapPixel>(MapPixel.LAND);
            var waterNode = new MarkovNode <MapPixel>(MapPixel.WATER);

            landNode.AddConnection(waterNode, _landWaterConnectionWeight);
            waterNode.AddConnection(landNode, _waterLandConnectionWeight);

            var nodeList = new List <MarkovNode <MapPixel> >
            {
                landNode,
                waterNode
            };

            return(new MarkovChain <MapPixel>(nodeList, nodeList.FirstOrDefault(node => node.NodeValue == startValue)));
        }
        private MarkovChain <MapPixel> GetMarkovChain()
        {
            var landNode  = new MarkovNode <MapPixel>(MapPixel.LAND);
            var waterNode = new MarkovNode <MapPixel>(MapPixel.WATER);

            landNode.AddConnection(waterNode, _landWaterConnectionWeight);
            waterNode.AddConnection(landNode, _waterLandConnectionWeight);

            var nodeList = new List <MarkovNode <MapPixel> >
            {
                landNode,
                waterNode
            };

            return(new MarkovChain <MapPixel>(nodeList));
        }
示例#11
0
        private char SelectChildChar(MarkovNode node)
        {
            // Generate a random number in the range 0..(node.Count-1)
            int rnd = RandomSelector.Next(node.Count);

            // Go through the children to select the node
            int cnt = 0;

            foreach (var kvp in node.Children)
            {
                cnt += kvp.Value.Count;
                if (cnt > rnd)
                {
                    return(kvp.Key);
                }
            }
            throw new ApplicationException("This can't happen!");
        }
示例#12
0
        public void AddString(string s)
        {
            StringBuilder builder = new StringBuilder(s.Length + 2 * ModelOrder);

            builder.Append(StartChar, ModelOrder);
            builder.Append(s);
            builder.Append(StopChar, ModelOrder);

            for (int iStart = 0; iStart < builder.Length; ++iStart)
            {
                MarkovNode parent = Root.AddNode(builder[iStart]);

                for (int i = 1; i <= ModelOrder && i + iStart < builder.Length; i++)
                {
                    MarkovNode child = parent.AddNode(builder[iStart + i]);
                    parent = child;
                }
            }
        }
示例#13
0
            public MarkovNode AddChild(char c)
            {
                if (Children == null)
                {
                    Children = new Dictionary <char, MarkovNode>();
                }
                ++FollowCount;
                MarkovNode child;

                if (Children.TryGetValue(c, out child))
                {
                    ++child.Count;
                }
                else
                {
                    child = new MarkovNode(c);
                    Children.Add(c, child);
                }
                return(child);
            }
            public MarkovNode AddChild(string w)
            {
                if (Children == null)
                {
                    Children = new Dictionary <string, MarkovNode>();
                }
                ++FollowCount;
                MarkovNode child;

                if (Children.TryGetValue(w, out child))
                {
                    ++child.Count;
                }
                else
                {
                    child = new MarkovNode(w);
                    Children.Add(w, child);
                }
                return(child);
            }
示例#15
0
        private string OutputNode(MarkovNode node, int parentCount, string pad)
        {
            //Console.WriteLine("{0}{1} - {2:N0} ({3:P2})", pad, node.Ch, node.Count, (double)node.Count / parentCount);
            var sb = new StringBuilder();

            sb.AppendLine(String.Format("{0}{1} - {2:N0} ({3:P2})",
                                        pad, node.Ch, node.Count, (double)node.Count / parentCount));
            if (node.Children != null)
            {
                int cnt = 0;
                foreach (var kvp in node.Children)
                {
                    sb.AppendLine(OutputNode(kvp.Value, node.Count, pad + "  "));
                    cnt += kvp.Value.Count;
                }
                if (cnt != node.Count)
                {
                    Console.WriteLine("ERROR: child count doesn't match.");
                }
            }
            return(sb.ToString());
        }
        public void AddString(string s)
        {
            var input = s.Split(' ');

            // Naive method
            for (int iStart = 0; iStart < input.Length; ++iStart)
            {
                // Get the order 0 node
                MarkovNode parent = Root.AddChild(input[iStart]);

                // Now add N-grams starting with this node
                for (int i = 1; i <= ModelOrder && i + iStart < input.Length; ++i)
                {
                    MarkovNode child = parent.AddChild(input[iStart + i]);
                    parent = child;
                    if (parent.word.Last() == '.')
                    {
                        parent.AddChild(EndChar.ToString());
                    }
                }
            }
        }
示例#17
0
        public void AddString(string s)
        {
            // Construct the string that will be added.
            StringBuilder sb = new StringBuilder(s.Length + 2 * (ModelOrder));

            // Order+1 Start characters. The string to add. Order+1 Stop characters.
            sb.Append(StartChar, ModelOrder);
            sb.Append(s);
            sb.Append(EndChar, ModelOrder);

            // Naive method
            for (int iStart = 0; iStart < sb.Length; ++iStart)
            {
                // Get the order 0 node
                MarkovNode parent = Root.AddChild(sb[iStart]);

                // Now add N-grams starting with this node
                for (int i = 1; i <= ModelOrder && i + iStart < sb.Length; ++i)
                {
                    MarkovNode child = parent.AddChild(sb[iStart + i]);
                    parent = child;
                }
            }
        }
        public string Generate(int order)
        {
            if (order > ModelOrder)
            {
                throw new ApplicationException("Cannot generate higher order than was built.");
            }
            List <String> rslt = new List <string>();

            // Trying to add one start char per order 'level', have to do it in a loop because we
            // don't have a method that adds a given number like we do with StringBuilder.Append()
            for (var i = 0; i < order; ++i)
            {
                rslt.Add(StartChar.ToString());
            }

            int    iStart = 0;
            string w      = StartChar.ToString();

            do
            { //TODO: Fix this garbage
                MarkovNode node = Root.Children[rslt[iStart]];
                for (int i = 1; i < order; ++i)
                {
                    node = node.Children[rslt[i + iStart]];
                }
                w = SelectChildWord(node);
                if (w.Equals(EndChar.ToString()))
                {
                    rslt.Add(" " + w);
                }
                ++iStart;
            } while (!w.Equals(EndChar.ToString()));

            // remove start characters from the string
            return(rslt.ToString().Substring(order));
        }
示例#19
0
 public MarkovNode(String value, MarkovNode root)
 {
     this.root = root;
     MarkovNode(value);
 }
示例#20
0
 public MarkovTextModel(int order)
 {
     ModelOrder = order;
     Root = new MarkovNode(StartChar);
 }
 public MarkovTextModelWord(int order)
 {
     ModelOrder = order;
     Root       = new MarkovNode(StartChar.ToString());
 }
示例#22
0
        private char SelectChildChar(MarkovNode node)
        {
            // Generate a random number in the range 0..(node.Count-1)
            int rnd = RandomSelector.Next(node.Count);

            // Go through the children to select the node
            int cnt = 0;
            foreach (var kvp in node.Children)
            {
                cnt += kvp.Value.Count;
                if (cnt > rnd)
                {
                    return kvp.Key;
                }
            }
            throw new ApplicationException("This can't happen!");
        }
示例#23
0
 public MarkovNode AddChild(char c)
 {
     if (Children == null)
     {
         Children = new Dictionary<char, MarkovNode>();
     }
     ++FollowCount;
     MarkovNode child;
     if (Children.TryGetValue(c, out child))
     {
         ++child.Count;
     }
     else
     {
         child = new MarkovNode(c);
         Children.Add(c, child);
     }
     return child;
 }
示例#24
0
 private string OutputNode(MarkovNode node, int parentCount, string pad)
 {
     //Console.WriteLine("{0}{1} - {2:N0} ({3:P2})", pad, node.Ch, node.Count, (double)node.Count / parentCount);
     var sb = new StringBuilder();
     sb.AppendLine(String.Format("{0}{1} - {2:N0} ({3:P2})",
         pad, node.Ch, node.Count, (double)node.Count / parentCount));
     if (node.Children != null)
     {
         int cnt = 0;
         foreach (var kvp in node.Children)
         {
             sb.AppendLine(OutputNode(kvp.Value, node.Count, pad + "  "));
             cnt += kvp.Value.Count;
         }
         if (cnt != node.Count)
         {
             Console.WriteLine("ERROR: child count doesn't match.");
         }
     }
     return sb.ToString();
 }
 public MarkovTextModelWord(int order)
 {
     ModelOrder = order;
     Root = new MarkovNode(StartChar.ToString());
 }
 public MarkovNode AddChild(string w)
 {
     if (Children == null)
     {
         Children = new Dictionary<string, MarkovNode>();
     }
     ++FollowCount;
     MarkovNode child;
     if (Children.TryGetValue(w, out child))
     {
         ++child.Count;
     }
     else
     {
         child = new MarkovNode(w);
         Children.Add(w, child);
     }
     return child;
 }
示例#27
0
 // adds a child node
 public void AddNode(MarkovNode node)
 {
     children.Add(node);
 }
示例#28
0
 public MarkovTextModel(int order)
 {
     ModelOrder = order;
     Root       = new MarkovNode(StartChar);
 }