Beispiel #1
0
        private string AskBack(ref ExamSuitContext context)
        {
            context.AskBackTime++;

            if (context.AskBackTime > ConfigurationData.ASKBACKLIMITTIME)
            {
                context.status = ESStatus.Paused;

                string result = "";
                if (context.currentIndex > 0)
                {
                    result += "中途退出将无法获得测试结果,你之前的测试结果将被保留8小时,下次输入“" + KEYWORD + "”可继续进行测试。\r\n8小时后";
                }
                else //context.currentIndex == 0
                {
                    context.status = ESStatus.Aborded;
                    result        += "你已经放弃本次测试。\r\n";
                }

                result += "再输入“" + KEYWORD + "”将重新开始测试";
                return(result);
            }

            return("请输入对应选项序号,不要有其他字符\r\n" + GetNextText(ref context) + "如想退出测试,请输入任何字母或汉字");
        }
Beispiel #2
0
        public void StoreESContext(ExamSuitContext esContext, string userId)
        {
            //throw new NotImplementedException();
            ContextInfo ci = Wrap(esContext);

            cStore.SetContextInfo(StoreType.ESOnly, ci, userId);
        }
Beispiel #3
0
        private ExamSuitContext InitESContext(string userId, ExamLUInfo currentLUInfo)
        {
            ExamSuitContext esContext = new ExamSuitContext(userId);

            esContext.Intent       = currentLUInfo.Intent.intent;
            esContext.currentIndex = 0;

            return(esContext);
        }
Beispiel #4
0
        private string GenerateResult(ref ExamSuitContext context)
        {
            Dictionary <char, int> answerDict = new Dictionary <char, int>();

            foreach (TestItem item in context.taskItems)
            {
                int seqNo = item.index + 1;

                int userAnswer = int.Parse(item.userAnswer);

                char userInputFeature = context.FeatureOptionConvertor[seqNo][userAnswer];

                if (answerDict.Keys.Contains(userInputFeature))
                {
                    answerDict[userInputFeature]++;
                }
                else
                {
                    answerDict.Add(userInputFeature, 1);
                }
            }

            List <char> dominatedFeatures = new List <char>();

            int averageNumber = context.taskItems.Count / answerDict.Count;

            string result = "你的选择结果是:";

            foreach (char feature in answerDict.Keys)
            {
                if (answerDict[feature] > averageNumber)
                {
                    dominatedFeatures.Add(feature);
                }

                result += feature + " " + answerDict[feature] + ", ";
            }

            result += "\r\n";

            if (dominatedFeatures.Count == 1)
            {
                result += "你是一个典型的" + GetReviewContent(context.ReviewDict[dominatedFeatures[0]]);
            }
            else
            {
                result += "你在" + dominatedFeatures.Count.ToString() + "个选项上都有超过" + averageNumber + "个的选项,所以你具备下列两项特征:\r\n";
                foreach (char feature in dominatedFeatures)
                {
                    result += GetReviewContent(context.ReviewDict[feature]);
                }
            }

            context.status = ESStatus.Finished;
            return(result);
        }
Beispiel #5
0
        public string ContinueOrRefresh(ref ExamSuitContext context, string userAnswer)
        {
            bool askBack = false;

            if (string.IsNullOrWhiteSpace(userAnswer))
            {
                askBack = true;
            }
            else
            {
                string answer      = userAnswer.Trim().ToLower();
                string matchedRule = context.ynItem.answerMatchRule;

                Regex regex = new Regex(matchedRule);
                Match match = regex.Match(answer);

                if (match.Success)
                {
                    string matchedValue = match.Value;
                    bool   IsUseStore   = context.ynItem.answerMap[matchedValue.ToLower()];

                    string result = "";
                    if (!IsUseStore)
                    {
                        result += "现在重新开始一轮测试\r\n";
                        Init(ref context);
                    }
                    else
                    {
                        result += "现在测试继续\r\n";
                    }

                    context.status      = ESStatus.OnGoing;
                    context.AskBackTime = 0;

                    result += this.GetNextText(ref context);


                    return(result);
                }
                else
                {
                    askBack = true;
                }
            }
            if (askBack)
            {
                return(this.AskBack(ref context));
            }

            return(null);
        }
Beispiel #6
0
        public string ReceiveUserAnswer(ref ExamSuitContext context, string userAnswer)
        {
            bool askBack = false;

            if (string.IsNullOrWhiteSpace(userAnswer))
            {
                askBack = true;
            }
            else
            {
                userAnswer = userAnswer.Trim();

                string answer = userAnswer;

                if (!string.IsNullOrWhiteSpace(answer))
                {
                    answer = answer.Trim().ToLower();
                }

                string matchedRule = context.taskItems[context.currentIndex].answerMatchRule;

                Regex regex = new Regex(matchedRule);
                Match match = regex.Match(answer);

                if (match.Success)
                {
                    context.taskItems.ElementAt(context.currentIndex++).userAnswer = answer;

                    if (context.currentIndex == context.taskItems.Count)
                    {
                        context.status = ESStatus.Finished;
                    }
                    return(this.GetNextText(ref context));
                }
                else
                {
                    askBack = true;
                }
            }

            if (askBack)
            {
                return(this.AskBack(ref context));
            }

            return(null);
        }
Beispiel #7
0
        private BotContext GetValidContext(string userId)
        {
            ContextInfo ci = cManager.GetContext(userId);

            if (ci == null)
            {
                return(null);
            }

            DateTime currentTime = DateTime.Now;

            if (currentTime.Subtract(ci.lastUpdatedTime).TotalMinutes > 480) // 8 hours
            {
                return(null);
            }
            else
            {
                if (ci.type == ContextType.PSAContext)
                {
                    PSAContext psaContext = JsonConvert.DeserializeObject <PSAContext>(ci.jsonString);

                    if (IsValid(psaContext))
                    {
                        return(psaContext);
                    }
                    else
                    {
                        return(null);
                    }
                }
                else if (ci.type == ContextType.ExamSuitContext)
                {
                    ExamSuitContext esContext = JsonConvert.DeserializeObject <ExamSuitContext>(ci.jsonString);
                    return(esContext);
                }
                else if (ci.type == ContextType.ScoreContext)
                {
                    ScoreContext scContext = JsonConvert.DeserializeObject <ScoreContext>(ci.jsonString);
                    return(scContext);
                }
                else
                {
                    TaskFlowContext tfContext = JsonConvert.DeserializeObject <TaskFlowContext>(ci.jsonString);
                    return(tfContext);
                }
            }
        }
Beispiel #8
0
        public string StartTest(ref ExamSuitContext context, ExamSuitContext cachedContext)
        {
            string firstText = "";

            if (cachedContext != null)
            {
                firstText     += context.ynItem.question;
                context        = cachedContext;
                context.status = ESStatus.Restarted;
            }
            else
            {
                Init(ref context);
                context.status = ESStatus.OnGoing;
                firstText     += "下面我们就要开始答题了,本次测试一共40题,每一道题目显示出来以后,请直接输入你所选择选项的序号。\r\n";
                firstText     += this.GetNextText(ref context);
            }

            return(firstText);
        }
Beispiel #9
0
        //public bool IsTesting(ref ExamSuitContext context)
        //{
        //   return context.IsInTesting;
        //}

        private void GenerateExamInfo(ref ExamSuitContext context)
        {
            context.FeatureOptionConvertor = new Dictionary <int, Dictionary <int, char> >();
            context.taskItems = new List <TestItem>();

            string   resFileContent = Utility.ReadEmbeddedResourceFile("PSAssitant.Engine.Res.dics.json");
            DISCInfo info           = JsonConvert.DeserializeObject <DISCInfo>(resFileContent);

            context.headline = info.HeadLine;


            string commonQuestion = info.Questions.CommonQuestion;
            string commonRegex    = info.Questions.CommonAnswerRegex;

            foreach (DiscQuestionInfo aQues in info.Questions.QuestionOptions)
            {
                int seqNo = aQues.QuestionSeqNo;

                string questionStr = "第" + seqNo.ToString() + "题," + commonQuestion + "\r\n";
                Dictionary <int, char> featureDict = new Dictionary <int, char>();
                foreach (OptionInfo opt in aQues.options)
                {
                    questionStr += opt.OptionSeqNo + "、" + opt.OptionContent + "\r\n";
                    featureDict.Add(opt.OptionSeqNo, opt.OptionFeature);
                }

                context.FeatureOptionConvertor.Add(seqNo, featureDict);
                TestItem item = new TestItem();
                item.index           = seqNo - 1;
                item.question        = questionStr;
                item.answerMatchRule = commonRegex;

                context.taskItems.Add(item);
            }

            context.ReviewDict = new Dictionary <char, ReviewInfo>();
            foreach (ReviewInfo rInfo in info.Reviews)
            {
                context.ReviewDict.Add(rInfo.FeatureChar, rInfo);
            }
        }
Beispiel #10
0
        public void StoreESContext(ExamSuitContext esContext, string userId)
        {
            string json = JsonConvert.SerializeObject(esContext);

            DateTime now     = DateTime.Now;
            string   dateStr = now.ToString("yyyy-MM-dd");

            string[]     columns = { "UserId", "Timestamp", "JsonObject" };
            ColumnType[] types   = { ColumnType.String, ColumnType.DateTime, ColumnType.String };

            List <string[]> values = new List <string[]>();

            string[] aValue = new string[columns.Length];
            aValue[0] = userId;
            aValue[1] = now.ToString("yyyy-MM-dd HH:mm:ss");
            aValue[2] = json;

            values.Add(aValue);

            dbChecker.InserTable(cacheTableName, columns, types, values);
        }
Beispiel #11
0
        private ExamSuitContext GetCachedESContext(string userId)
        {
            ContextInfo ci = cManager.GetAndRemoveESContext(userId);

            if (ci == null)
            {
                return(null);
            }

            DateTime currentTime = DateTime.Now;

            if (currentTime.Subtract(ci.lastUpdatedTime).TotalMinutes > 480) //8 hours
            {
                return(null);
            }
            else
            {
                ExamSuitContext esContext = JsonConvert.DeserializeObject <ExamSuitContext>(ci.jsonString);
                return(esContext);
            }
        }
Beispiel #12
0
        private string GetNextText(ref ExamSuitContext context)
        {
            if (context.status == ESStatus.OnGoing)
            {
                return(GetQuestion(ref context));
            }
            else
            {
                string result = "";

                if (context.status == ESStatus.Finished)
                {
                    result += GenerateResult(ref context);
                }
                else if (context.status == ESStatus.Paused)
                {
                    result += "中途退出将无法获得测试结果,你之前的测试结果将被保留8小时,下次输入“" + KEYWORD + "”可继续进行测试。\r\n8小时后";
                }

                result += "再输入“" + KEYWORD + "”将重新开始测试";
                return(result);
            }
        }
Beispiel #13
0
        public string Answer(string userId, string utterance)
        {
            BotContext context = this.GetValidContext(userId);

            bool isSingleContact = this.IsSingleContact(ref utterance);

            if (context == null)
            {
                LUInfo luInfo = Understand(utterance, isSingleContact);
                if (luInfo.GetType() == typeof(TestLUInfo))
                {
                    context = InitTFContext(userId, (TestLUInfo)luInfo);
                }
                else if (luInfo.GetType() == typeof(ExamLUInfo))
                {
                    context = InitESContext(userId, (ExamLUInfo)luInfo);
                }
                else
                {
                    context = initPSAContext(userId, luInfo);
                }

                cManager.CreateContext(context, userId);
            }
            else
            {
                if (context.type == ContextType.TaskFlowContext && isSingleContact)
                {
                    TaskFlowContext tfContext = (TaskFlowContext)context;
                    context = updateTFContext(ref tfContext, utterance);
                }
                else if (context.type == ContextType.ExamSuitContext && isSingleContact)
                {
                    ExamSuitContext esContext = (ExamSuitContext)context;
                    context = updateESContext(ref esContext, utterance);
                }
                else
                {
                    LUInfo luInfo = Understand(utterance, isSingleContact);

                    if (context.type == ContextType.PSAContext)
                    {
                        PSAContext psacontext = (PSAContext)context;
                        context = updatePSAContext(ref psacontext, luInfo);
                    }
                    else
                    {
                        return("[Error]: Unknown Context Type.");
                    }
                }
            }

            string answer = null;

            switch (context.type)
            {
            case ContextType.PSAContext:
                ChatTableEngine engine     = new ChatTableEngine();
                PSAContext      psacontext = (PSAContext)context;

                answer = engine.Answer(userId, ref psacontext);

                cManager.UpdateContext(psacontext, userId);
                break;

            case ContextType.TaskFlowContext:
                TestEngine      engineT   = new TestEngine();
                TaskFlowContext tfContext = (TaskFlowContext)context;

                answer = engineT.Answer(userId, ref tfContext);

                if (tfContext.IsInTesting)
                {
                    cManager.UpdateContext(tfContext, userId);
                }
                else
                {
                    cManager.RemoveContext(userId);
                }
                break;

            case ContextType.ExamSuitContext:

                ExamSuitContext esContext = (ExamSuitContext)context;
                DICSExamSrv     taskSrv   = new DICSExamSrv();

                string userInput = esContext.UserInput;

                switch (esContext.status)
                {
                case ESStatus.Started:
                    ExamSuitContext cachedContext = this.GetCachedESContext(userId);
                    answer = taskSrv.StartTest(ref esContext, cachedContext);
                    break;

                case ESStatus.Restarted:
                    answer = taskSrv.ContinueOrRefresh(ref esContext, userInput);
                    break;

                case ESStatus.OnGoing:
                    answer = taskSrv.ReceiveUserAnswer(ref esContext, userInput);
                    break;
                }

                if (esContext.status == ESStatus.Finished || esContext.status == ESStatus.Aborded)
                {
                    cManager.RemoveContext(userId);
                }
                else if (esContext.status == ESStatus.Paused)
                {
                    cManager.StoreESContext(esContext, userId);
                    cManager.RemoveContext(userId);
                }
                else
                {
                    cManager.UpdateContext(esContext, userId);
                }

                break;
            }

            return(answer);
        }
Beispiel #14
0
        private string GetQuestion(ref ExamSuitContext context)
        {
            string formula = context.taskItems.ElementAt(context.currentIndex).question;

            return(formula);
        }
Beispiel #15
0
        private ExamSuitContext updateESContext(ref ExamSuitContext context, string utterance)
        {
            context.UserInput = utterance;

            return(context);
        }
Beispiel #16
0
 private void Init(ref ExamSuitContext context)
 {
     GenerateExamInfo(ref context);
     context.currentIndex = 0;
 }
Beispiel #17
0
 private void SetTestResult(ref ExamSuitContext context, string result)
 {
     context.taskItems.ElementAt(context.currentIndex++).userAnswer = result;
 }