Ejemplo n.º 1
0
        public string Process(Areas.Chat.Models.UserSession userSession, string input, Extracting.ValidInfo info)
        {
            //用户希望系统根据当前句的语义和之前的收集的信息立即推荐一款手机
            if (Regex.IsMatch(input, @"推荐"))
            {
                userSession.liveTable.Candidates = Inquiry.Screening(userSession.liveTable.Parameter, info);
                if (userSession.liveTable.Candidates.Count == 0)
                {
                    return(Answering.NotFound(userSession, info));
                }
                else
                {
                    // 目前能对多个值已定的属性进行手机推荐
                    userSession.liveTable.TalkingAbout = userSession.liveTable.Candidates[0];
                    userSession.liveTable.Candidates.Remove(userSession.liveTable.TalkingAbout);
                    userSession.liveTable.CurrentMode = Areas.Chat.Models.LiveTable.ModeType.RECOMMEND;
                    return(userSession.liveTable.TalkingAbout.Brand + userSession.liveTable.TalkingAbout.Model + "这款不错,你可以了解一下。");
                }
            }

            /* 从live-table的当前谈论机中,选取符合最合适的手机参数值进行回答
             * 这里提取到的信息并不需要更新到live-table里
             * */

            if (userSession.liveTable.CurrentMode != Areas.Chat.Models.LiveTable.ModeType.DEBUGGING &&
                userSession.liveTable.CurrentMode != Areas.Chat.Models.LiveTable.ModeType.LEARNING &&
                userSession.liveTable.CurrentMode != Areas.Chat.Models.LiveTable.ModeType.START &&
                userSession.liveTable.CurrentMode != Areas.Chat.Models.LiveTable.ModeType.END)
            {
                /* 可能用户会说:这款手机是水货还是行货?|这个价位是高还是低?.....
                 * 这可以从TalkingAbout找相应的描述返回
                 * */
                bool isDirect = false;
                foreach (var it in info.items)
                {
                    if (String.IsNullOrEmpty(info.conflictFeedback) && it.name.Equals("型号"))
                    {
                        if (it.items.Count > 0)
                        {
                            isDirect = true;
                        }
                        break;
                    }
                }
                if (!isDirect)
                {
                    if (info.items[0].items.Count > 0)
                    {
                        if (info.items.Count >= 1)
                        {
                            // 小米2s的系统是Androd 4.0吗?
                            Areas.Chat.Models.LiveTable liveTableTemp = new Areas.Chat.Models.LiveTable();
                            List <string>           ps        = new List <string>();
                            List <Models.CellPhone> phonelist = Inquiry.Screening(liveTableTemp.Parameter, info);
                            string answer = "";
                            if (phonelist.Count > 0)
                            {
                                answer = "是的,";
                            }
                            else
                            {
                                answer = "不好意思," + "没有" + info.items[1].items[0];
                                Extracting.ValidInfo infoTemp = new Extracting.ValidInfo();
                                liveTableTemp.Parameter[info.items[0].name] = info.items[0].items[0];
                                phonelist = Inquiry.Screening(liveTableTemp.Parameter, infoTemp);
                            }
                            for (int i = 0; i < info.items.Count; i++)
                            {
                                ps.Add(info.items[i].name);
                            }
                            answer += Answering.Statement(phonelist[0], ps);
                            return(answer);
                        }
                    }
                    else
                    {
                        // 针对某一款手机
                        if (userSession.liveTable.CurrentMode != Areas.Chat.Models.LiveTable.ModeType.DEBUGGING &&
                            userSession.liveTable.CurrentMode != Areas.Chat.Models.LiveTable.ModeType.LEARNING &&
                            userSession.liveTable.CurrentMode != Areas.Chat.Models.LiveTable.ModeType.START &&
                            userSession.liveTable.CurrentMode != Areas.Chat.Models.LiveTable.ModeType.END)
                        {
                            if (userSession.liveTable.TalkingAbout != null)
                            {
                                userSession.liveTable.CurrentMode = Areas.Chat.Models.LiveTable.ModeType.DETAIL;
                                string answer = "这手机";
                                for (int i = 0; i < info.items.Count; i++)
                                {
                                    string value = userSession.liveTable.TalkingAbout.GetType().GetProperty
                                                       (Code.GlobalHash.SemanticToEN[info.items[i].name].ToString()).GetValue(userSession.liveTable.TalkingAbout, null).ToString();
                                    if (Regex.IsMatch(info.items[i].items[0].normalData, @"\d+\.*\d+,\d+\.*\d+"))
                                    {
                                        string[] bounds = info.items[i].items[0].normalData.Split(new char[] { ',' });
                                        if (Convert.ToDouble(bounds[0]) <= Convert.ToDouble(value) &&
                                            Convert.ToDouble(value) <= Convert.ToDouble(bounds[1]))
                                        {
                                            answer += Code.Answering.getAnswerStatusFromSentence(userSession, true) + info.items[i].items[0].rawData;
                                        }
                                        else
                                        {
                                            answer += Code.Answering.getAnswerStatusFromSentence(userSession, false) + info.items[i].items[0].rawData;
                                        }
                                    }
                                    else
                                    {
                                        if (value.IndexOf(info.items[i].items[0].normalData) != -1)
                                        {
                                            answer += Code.Answering.getAnswerStatusFromSentence(userSession, true) + info.items[i].items[0].rawData;
                                        }
                                        else
                                        {
                                            answer += Code.Answering.getAnswerStatusFromSentence(userSession, false) + info.items[i].items[0].rawData;
                                        }
                                    }
                                }
                                if (answer[answer.Length - 1] == '|')
                                {
                                    answer = answer.Substring(0, answer.Length - 1) + "。";
                                }
                                else
                                {
                                    answer = answer.Substring(0, answer.Length) + "。";
                                }
                                return(answer);
                            }
                        }
                    }

                    if (userSession.liveTable.TalkingAbout.Model != null)
                    {
                        List <string> ps = new List <string>();
                        for (int i = 0; i < info.items.Count; i++)
                        {
                            ps.Add(info.items[i].name);
                        }

                        userSession.liveTable.CurrentMode = Areas.Chat.Models.LiveTable.ModeType.DETAIL;

                        string answer = "这款手机";

                        for (int i = 0; i < info.items.Count; i++)
                        {
                            string value = userSession.liveTable.TalkingAbout.GetType().GetProperty
                                               (Code.GlobalHash.SemanticToEN[info.items[i].name].ToString()).GetValue
                                               (userSession.liveTable.TalkingAbout, null).ToString();

                            if (Regex.IsMatch(info.items[i].items[0].normalData, @"\d+\.*\d+,\d+\.*\d+"))
                            {
                                string[] bounds = info.items[i].items[0].normalData.Split(new char[] { ',' });
                                if (Convert.ToDouble(bounds[0]) <= Convert.ToDouble(value) &&
                                    Convert.ToDouble(value) <= Convert.ToDouble(bounds[1]))
                                {
                                    answer += Code.Answering.getAnswerStatusFromSentence(userSession, true) + info.items[i].items[0].rawData;
                                }
                                else
                                {
                                    answer += Code.Answering.getAnswerStatusFromSentence(userSession, false) + info.items[i].items[0].rawData;
                                }
                            }
                            else
                            {
                                if (value.IndexOf(info.items[i].items[0].normalData) != -1)
                                {
                                    answer += Code.Answering.getAnswerStatusFromSentence(userSession, true) + info.items[i].items[0].rawData;
                                }
                                else
                                {
                                    answer += Code.Answering.getAnswerStatusFromSentence(userSession, false) + info.items[i].items[0].rawData;
                                }
                            }
                        }

                        return(answer);
                    }
                }
                else
                {
                    string answer = "";
                    List <Models.CellPhone> list = new List <Models.CellPhone>();
                    List <string>           ps   = new List <string>();
                    list = Inquiry.Screening(userSession.liveTable.Parameter, info);
                    if (list.Count <= 0)
                    {
                        if (info.items.Count < 2)
                        {
                            answer = "亲,不好意思," + "没有" + info.items[0].items[0].rawData;
                            return(answer);
                        }
                        else
                        {
                            answer = "亲,不好意思," + "我们还没收录您提到的这个型号,我们正在努力更新数据~~";
                            return(answer);
                        }
                    }
                    else
                    {
                        for (int i = 0; i < info.items.Count; i++)
                        {
                            ps.Add(info.items[i].name);
                        }
                        return(Answering.Statement(list[0], ps));
                    }
                }
            }
            return("");
        }
Ejemplo n.º 2
0
        public string Process(Areas.Chat.Models.UserSession userSession, string input, Extracting.ValidInfo info)
        {
            //用户希望系统根据当前上下文推荐一个符合其他要求的基础上的手机属性 eg:能不能推荐一种颜色给我?
            if (Regex.IsMatch(input, @"推荐"))
            {
                if (userSession.liveTable.Candidates.Count == 0)
                {
                    userSession.liveTable.CurrentMode = Areas.Chat.Models.LiveTable.ModeType.NOTFOUND;
                    return("不好意思,目前没有符合您要求的手机, 所以没有可以推荐的内容。我们会尽快收录。麻烦您改一下之前提出的条件吧。");
                }
                else
                {
                    // 目前推荐属性只支持单个属性的推荐
                    Models.CellPhone phone    = userSession.liveTable.Candidates[0];
                    string           retValue = "";
                    Type             type     = phone.GetType();
                    PropertyInfo[]   props    = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);
                    foreach (PropertyInfo pi in props)
                    {
                        string value1 = Convert.ToString(pi.GetValue(phone, null));
                        string name   = pi.Name;
                        if (GlobalHash.SemanticToCN[name].Equals(info.items[0].name))
                        {
                            retValue = value1;
                            break;
                        }
                    }
                    if (Regex.IsMatch(retValue, @"^\d+$") && !info.items[0].name.Equals("型号"))
                    {
                        List <Code.Extracting.InfoUnit> temp = new List <Extracting.InfoUnit>();
                        temp.Add(new Code.Extracting.InfoUnit(retValue, string.Format("{0},{1}", Convert.ToDouble(retValue) * 0.99, Convert.ToDouble(retValue) * 1.01)));
                        Code.Extracting.InfoBlock oneblock = new Extracting.InfoBlock(info.items[0].name, "or", temp);
                        userSession.liveTable.Parameter[info.items[0].name] = oneblock;
                    }
                    else
                    {
                        if (retValue.IndexOf("|") >= 0)
                        {
                            retValue = retValue.Split(new char[] { '|' })[0];
                        }
                        List <Code.Extracting.InfoUnit> temp = new List <Extracting.InfoUnit>();
                        temp.Add(new Code.Extracting.InfoUnit(retValue, retValue));
                        Code.Extracting.InfoBlock oneblock = new Extracting.InfoBlock(info.items[0].name, "or", temp);
                        userSession.liveTable.Parameter[info.items[0].name] = oneblock;
                    }
                    return(retValue + "是个不错的选择。");
                }
            }

            if (info.items.Count > 1)
            {
                // 诺基亚1200有什么颜色的?
                Areas.Chat.Models.LiveTable liveTableTemp = new Areas.Chat.Models.LiveTable();
                List <string>           ps        = new List <string>();
                List <Models.CellPhone> phonelist = Inquiry.Screening(liveTableTemp.Parameter, info);
                for (int i = 0; i < info.items.Count; i++)
                {
                    ps.Add(info.items[i].name);
                }
                string answer = Answering.Statement(phonelist[0], ps);
                if (input.IndexOf("有") != -1)
                {
                    answer = answer.Replace("是", "有");
                }
                return(answer);
            }
            else
            {
                // 已经推荐了一款手机,用户问“有什么颜色”
                if (userSession.liveTable.CurrentMode == Areas.Chat.Models.LiveTable.ModeType.RECOMMEND ||
                    userSession.liveTable.CurrentMode == Areas.Chat.Models.LiveTable.ModeType.DETAIL)
                {
                    if (userSession.liveTable.TalkingAbout != null)
                    {
                        List <string> ps = new List <string>();
                        for (int i = 0; i < info.items.Count; i++)
                        {
                            ps.Add(info.items[i].name);
                        }
                        userSession.liveTable.CurrentMode = Areas.Chat.Models.LiveTable.ModeType.DETAIL;
                        string answer = Answering.Statement(userSession.liveTable.TalkingAbout, ps);
                        if (input.IndexOf("有") != -1)
                        {
                            answer = answer.Replace("是", "有");
                        }
                        return(answer);
                    }
                }
                else
                {
                    // 查询数据库,返回手机列表list
                    List <Models.CellPhone> list = Inquiry.Screening(userSession.liveTable.Parameter, info);
                    userSession.liveTable.Candidates = list;
                    if (list.Count > 3)
                    {
                        /* 如果筛选结果大于三款(且重要属性只有4个以下被确认),则进行主动引导
                         * 首先要先确定要引导的参数
                         * 然后还要记录当前状态变成主动引导
                         * 以及记录相关参数到live-table的RelativeParameter
                         * */
                        string answear = "符合您要求的手机有以下几款:";
                        for (int i = 0; i < 2; ++i)
                        {
                            answear = answear + list[i].Brand + list[i].Model + "、";
                        }
                        answear = answear + list[2].Brand + list[2].Model + "等。";
                        int recordedImportantParameter = 0;  //如果重要属性已有4个以上被确认,直接进行推荐,不继续引导
                        foreach (string s in Code.GlobalHash.ImportantParameter)
                        {
                            if (recordedImportantParameter >= 4)
                            {
                                userSession.liveTable.CurrentMode  = Areas.Chat.Models.LiveTable.ModeType.RECOMMEND;
                                userSession.liveTable.TalkingAbout = list[0];
                                return(Answering.Recommand(list[0]));
                            }

                            if (!userSession.liveTable.Parameter.ContainsKey(s))
                            {
                                userSession.liveTable.RelatedParameter = s;
                                userSession.liveTable.CurrentMode      = Areas.Chat.Models.LiveTable.ModeType.ACTIVE;
                                return(answear + Answering.ActiveLeading(s));
                            }
                            else
                            {
                                recordedImportantParameter++;
                            }
                        }
                    }
                    else if (list.Count <= 0)
                    {
                        return(Answering.NotFound(userSession, info));  // 状态CurrentMode在该方法中变更
                    }
                    else
                    {
                        userSession.liveTable.CurrentMode  = Areas.Chat.Models.LiveTable.ModeType.RECOMMEND;
                        userSession.liveTable.TalkingAbout = list[0];
                        return(Answering.Recommand(list[0]));
                    }
                }
            }


            return("");
        }