Example #1
0
        /// <summary>
        /// 应答机器人的初始化工作
        /// </summary>
        public void Init(string resourceFolder = "")
        {
            if (!SetUp)
            {
                //xml文档对象
                var xmlDoc = new XmlDocument();
                //加载对应的智能文件
                if (resourceFolder == "")
                {
                    xmlDoc.Load(resourceFolder + "Iveely.AI.aiml");
                }
                else
                {
                    xmlDoc.Load(resourceFolder + "\\Iveely.AI.aiml");
                }
                //子节点集合
                var selectSingleNode = xmlDoc.SelectSingleNode("aiml");
                if (selectSingleNode != null)
                {
                    XmlNodeList nodeList = selectSingleNode.ChildNodes;
                    //当前结点
                    //遍历每一个子节点
                    for (int i = 0; i < nodeList.Count; i++)
                    {
                        foreach (var categoryNode in nodeList[i].ChildNodes)
                        {
                            //将当前结点赋值
                            XmlNode currentNode = (XmlNode)categoryNode;
                            //如果是类别结点
                            if (currentNode.Name.ToLower() == "category" && currentNode.HasChildNodes)
                            {
                                // 新建类别
                                var category = new Category();
                                //说明存在模式
                                var childList = currentNode.ChildNodes;
                                for (int j = 0; j < childList.Count; j++)
                                {
                                    //子节点赋值
                                    XmlNode childNode = childList[j];
                                    //如果是模式
                                    if (childNode.Name.ToLower() == "pattern")
                                    {
                                        //新建模式
                                        var pattern = new Pattern { Value = childNode.InnerXml.Trim() };
                                        //模式复制
                                        //下一个一定是模板
                                        j++;
                                        //新建模板
                                        var template = new Template();
                                        //如果没有子结点
                                        if (!childList[j].HasChildNodes)
                                        {
                                            //模板赋值
                                            template.Value = childList[j].InnerXml.Trim();
                                        }
                                        else
                                        {
                                            //获取当前所有的子节点
                                            XmlNodeList innerList = childList[j].ChildNodes;
                                            //定义子节点值
                                            string tempValue = "";
                                            //遍历循环
                                            for (int m = 0; m < innerList.Count; m++)
                                            {
                                                //如果是随机
                                                if (innerList[m].Name.ToLower() == "random")
                                                {
                                                    //说明存在随机组
                                                    var rand = new Rand();
                                                    //那么获取出随机值
                                                    for (var n = 0; n < innerList[m].ChildNodes.Count; n++)
                                                    {
                                                        //增加进去
                                                        rand.List.Add(innerList[m].ChildNodes[n].InnerXml);
                                                    }
                                                    //模板随机值
                                                    template.Rand = rand;
                                                }
                                                //如果是普通值
                                                else if (innerList[m].Name.ToLower() == "#text")
                                                {
                                                    tempValue += innerList[m].Value.Trim();
                                                }
                                                //如果是*号标记
                                                else if (innerList[m].Name.ToLower() == "star")
                                                {
                                                    //获取star属性index,标识位置
                                                    int index = int.Parse(innerList[m].Attributes["index"].Value);
                                                    //设定答值
                                                    template.Star.Add(index);
                                                }
                                                //如果是input号标记
                                                else if (innerList[m].Name.ToLower() == "input")
                                                {
                                                    //获取input属性index,标识位置
                                                    int index = int.Parse(innerList[m].Attributes["index"].Value);
                                                    //设定答值
                                                    template.Input = index;
                                                }
                                                //如果是Set标记
                                                else if (innerList[m].Name.ToLower() == "set")
                                                {
                                                    //获取Set属性name,标识位置
                                                    string setName = innerList[m].Attributes["name"].Value;
                                                    //索引号
                                                    string index = innerList[m].Attributes["index"].Value;
                                                    //设定变量
                                                    template.SetVariable.Name = setName;
                                                    //设定取值编号
                                                    template.SetVariable.Value = index;
                                                    //利用Star来记录
                                                    template.Star.Add(int.Parse(index));
                                                }
                                                //如果是Get标记
                                                else if (innerList[m].Name.ToLower() == "get")
                                                {
                                                    //获取get的变量
                                                    string getName = innerList[m].Attributes["name"].Value;
                                                    //变量名
                                                    template.GetVariable.Name = getName;
                                                }
                                                //如果是函数功能标记
                                                else if (innerList[m].Name.ToLower() == "function")
                                                {
                                                    //获取函数名称
                                                    template.Function.Name = innerList[m].Attributes["name"].Value;
                                                    //如果存在参数
                                                    if (innerList[m].Attributes["para"] != null)
                                                    {
                                                        //首先获取参数中的值
                                                        string[] par = innerList[m].Attributes["para"].Value.Split(',');
                                                        //遍历每一个参数值
                                                        foreach (string p in par)
                                                        {
                                                            //首先记录下是哪些参数
                                                            template.Star.Add(int.Parse(p));
                                                            //在函数体中也记录
                                                            template.Function.Parameters.Add(p);
                                                        }
                                                    }
                                                }
                                                //如果是疑问
                                                else if (innerList[m].Name.ToLower() == "question")
                                                {
                                                    string[] questionStrings = innerList[m].InnerText.Split(
                                                        new[] { ';', ';' }, StringSplitOptions.RemoveEmptyEntries);
                                                    foreach (var questionString in questionStrings)
                                                    {
                                                        //[*.0]和谁离婚了?[*.1]
                                                        string[] text = questionString.Split(new[] { '?', '?' },
                                                            StringSplitOptions.RemoveEmptyEntries);
                                                        if (text.Length == 2)
                                                        {
                                                            Template.Question question = new Template.Question
                                                            {
                                                                //Description = text[0],
                                                                //Answer = text[1]
                                                            };
                                                            template.AddQuestion(question);
                                                        }
                                                    }
                                                }
                                            }
                                            //将临时值放回去
                                            template.Value = tempValue.Trim();
                                        }
                                        //将模板赋值给模式
                                        pattern.Template = template;
                                        //将模式添加到模式集合
                                        category.Patterns.Add(pattern);
                                    }
                                }
                                //将类别添加到类别集合
                                Categorys.Add(category);
                            }
                        }
                    }
                }
            }

        }
Example #2
0
        //<pattern>*[地名:北京|上海|天津|-ns]*将*[行为:开盘|发布会]*</pattern>
        //    <template>
        //        <function name="Normal" para="1,2,3"></function>
        //        <question>[0]什么地方[1]将[2][行为][3]?[地名]</question>
        //    </template>

        private void BuildRealCategory()
        {
            for (int i = 0; i < Categorys.Count; i++)
            {
                SortedList<Pattern> realPatterns = new SortedList<Pattern>();
                SortedList<Pattern> patterns = Categorys[i].Patterns;
                foreach (Pattern t in patterns)
                {
                    if (t.Value.Contains("["))
                    {
                        string patternValue = t.Value;
                        List<Pattern> myPatterns = new List<Pattern>();
                        int leftIndex = patternValue.IndexOf('[');
                        int rightIndex = patternValue.IndexOf(']');
                        // string middleValue = string.Empty;
                        while (leftIndex > -1)
                        {
                            string patternString = patternValue.Substring(leftIndex + 1, rightIndex - leftIndex - 1);
                            string[] valueTemplate = patternString.Split(new[] { '|', ':' }, StringSplitOptions.RemoveEmptyEntries);
                            if (myPatterns.Count == 0)
                            {
                                Pattern[] pts = new Pattern[valueTemplate.Count() - 1];
                                string header = patternValue.Substring(0, leftIndex);
                                for (int k = 0; k < pts.Count(); k++)
                                {
                                    pts[k] = new Pattern();
                                    pts[k].Value = header + valueTemplate[k + 1];
                                    Template template = new Template();

                                    Template.Question[] questions =
                                        new Template.Question[t.Template.Questions.Count];
                                    for (int n = 0; n < questions.Count(); n++)
                                    {
                                        //questions[n] = new Template.Question();
                                        //questions[n].Answer =
                                        //    t.Template.Questions[n].Answer.Replace(
                                        //        "[" + valueTemplate[0] + "]", valueTemplate[k + 1]);
                                        //questions[n].Description = t.Template.Questions[n].Description.Replace(
                                        //    "[" + valueTemplate[0] + "]", valueTemplate[k + 1]);
                                    }
                                    template.Questions.AddRange(questions);
                                    template.Function = t.Template.Function;
                                    template.Star = t.Template.Star;
                                    pts[k].Template = template;
                                }
                                myPatterns.AddRange(pts);
                            }
                            else
                            {
                                Pattern[,] pts = new Pattern[myPatterns.Count, valueTemplate.Count() - 1];
                                for (int k = 0; k < myPatterns.Count; k++)
                                {

                                    for (int n = 0; n < valueTemplate.Count() - 1; n++)
                                    {
                                        pts[k, n] = new Pattern();
                                        pts[k, n].Value = myPatterns[k].Value + patternValue.Substring(0, leftIndex) + valueTemplate[n + 1];
                                        List<Template.Question> questions = myPatterns[k].Template.Questions;
                                        Template template = new Template();
                                        for (int m = 0; m < questions.Count; m++)
                                        {
                                            //Template.Question myQuestion = new Template.Question();
                                            //myQuestion.Description = questions[m].Description.Replace(
                                            //    "[" + valueTemplate[0] + "]", valueTemplate[n + 1]);
                                            //myQuestion.Answer = questions[m].Answer.Replace(
                                            //    "[" + valueTemplate[0] + "]", valueTemplate[n + 1]);
                                            //template.AddQuestion(myQuestion);

                                        }
                                        template.Function = myPatterns[k].Template.Function;
                                        template.Star = myPatterns[k].Template.Star;
                                        pts[k, n].Template = template;
                                    }
                                }

                                myPatterns.Clear();
                                foreach (var p in pts)
                                {
                                    myPatterns.Add(p);
                                }
                            }


                            patternValue = patternValue.Substring(rightIndex + 1, patternValue.Length - rightIndex - 1);
                            //  int lastRightIndex = rightIndex;
                            leftIndex = patternValue.IndexOf('[');
                            rightIndex = patternValue.IndexOf(']');
                            if (rightIndex == -1)
                            {
                                foreach (Pattern t1 in myPatterns)
                                {
                                    t1.Value += patternValue;
                                }
                            }
                        }
                        realPatterns.AddRange(myPatterns);
                    }
                    else
                    {
                        //Pattern pattern = new Pattern();
                        realPatterns.Add(t);
                    }
                }
                Categorys[i].Patterns = realPatterns;
            }
        }