Exemplo n.º 1
0
        public static QueryDataContainer SortKB(QueryContainer <CMFAQ> faq, QueryContainer <CMFAQ_NET> faq_net, Dictionary <string, QueryContainer <CMKArea> > nav, ClientInfo cinfo)
        {
            double             coefficient = 0.85;
            QueryDataContainer qdc         = new QueryDataContainer()
            {
                MetaList    = new List <CMBase>(),
                ElapsedList = new List <FuncElapsed>()
            };

            qdc.ErrorMsg = "";
            var IDs = new List <string>();

            ConvertFAQ(faq, coefficient, qdc, IDs);
            ConvetFAQ_NET(faq_net, coefficient, qdc, IDs);
            ConvertNavi(nav, coefficient, qdc, IDs);
            qdc.Total = qdc.MetaList.Count;

            var sortlist = (from qd in qdc.MetaList
                            orderby qd.OrderBy descending
                            select qd).ToList();

            qdc.MetaList = sortlist;
            qdc.Total    = sortlist.Count;

            return(qdc);
        }
Exemplo n.º 2
0
        public static QueryDataContainer SortSenGroup(QueryContainer <CMAnswer> qcAnswer, ClientInfo cinfo)
        {
            int                maxScore    = 85;
            double             coefficient = 0.85;
            QueryDataContainer qdc         = new QueryDataContainer()
            {
                MetaList    = new List <CMBase>(),
                ElapsedList = new List <FuncElapsed>()
            };

            qdc.ErrorMsg = "";
            var IDs = new List <string>();

            ConvertAnswer(qcAnswer, cinfo, maxScore, coefficient, qdc, IDs);
            qdc.Total = qdc.MetaList.Count;
            AddScoreByEvaluate(cinfo, coefficient, qdc, IDs);

            var sortlist = (from qd in qdc.MetaList
                            orderby qd.OrderBy descending
                            select qd).ToList();

            qdc.MetaList = sortlist;
            qdc.Total    = sortlist.Count;

            return(qdc);
        }
Exemplo n.º 3
0
        /// <param name="q"></param>
        /// <param name="cp">第几页</param>
        /// <param name="c">页大小</param>
        /// <param name="navc"></param>
        /// <returns></returns>
        //[System.Web.Http.HttpGet]
        //[ValidateInput(false)]
        //[System.Web.Http.Route("GetSGData")]
        private Object GetSGData(string q, string domain = null, string cp = null, string c = null, string navc = null)
        {
            try
            {
                List <FuncElapsed>     listElaps = new List <FuncElapsed>();
                CBase.Log.TimeWatchLog tlogTotal = new CBase.Log.TimeWatchLog();
                CBase.Log.TimeWatchLog tlog_temp = new CBase.Log.TimeWatchLog();

                if (string.IsNullOrEmpty(q))
                {
                    return(null);
                }

                int recStart = 0;
                int recCount = 0;

                InitPageParam(cp, c, out recStart, out recCount);

                //调用句群接口,返回内容
                QueryContainer <CMAnswer> qcAnswer = null;

                ClientInfo cinfo = new ClientInfo()
                {
                    UserName = CommonHelper.GetUserName(),
                    IP       = CommonHelper.GetClientIP()
                };
                tlog_temp.Start();
                cinfo.Type = ContentLogType.句群超时;
                qcAnswer   = TimedTask.CallActionWithTimeoutSync(timeout, () => new Answer(domain).Get(q, recStart, recCount, domain), q, cinfo);
                listElaps.Add(new FuncElapsed("SenGroup", tlog_temp.Debug()));

                tlog_temp.Start();
                cinfo.Type = ContentLogType.问题排序超时;
                QueryDataContainer SortData = DataSort.SortSenGroup(qcAnswer, cinfo);
                listElaps.Add(new FuncElapsed("SortSG", tlog_temp.Debug()));

                AnswerResultSG result = new Models.AnswerResultSG()
                {
                    SortData = SortData
                };
                result.timeSpan = tlogTotal.Debug();
                SortData.ElapsedList.AddRange(listElaps);

                if (SortData.MetaList.Count == 0)
                {
                    return(new { result = false, msg = "未找到查询结果!" });
                }
                return(new { result = true, SortData.MetaList });
            }
            catch (System.Exception ex)
            {
                CBase.Log.Logger.Error(ex);
                return(new { result = false, msg = ex.ToString() });
            }
        }
Exemplo n.º 4
0
        //[System.Web.Http.HttpGet]
        //[ValidateInput(false)]
        //[System.Web.Http.Route("GetFAQData")]
        private async Task <Object> GetFAQData(string q, string domain = null)
        {
            try
            {
                List <FuncElapsed>     listElaps = new List <FuncElapsed>();
                CBase.Log.TimeWatchLog tlogTotal = new CBase.Log.TimeWatchLog();
                CBase.Log.TimeWatchLog tlog_temp = new CBase.Log.TimeWatchLog();
                if (string.IsNullOrEmpty(q))
                {
                    return(null);
                }
                QueryContainer <CMFAQ>                 faq      = null;
                QueryContainer <CMFAQ_NET>             faq_net  = null;
                List <Task <QueryContainer <CMFAQ> > > tFaqList = null;
                Task <QueryContainer <CMFAQ_NET> >     tFaq_net = null;

                //获取意图识别
                tlog_temp.Start();
                var tasks = new List <Task>();
                tFaqList = GetFAQTask(q, timeout, domain);
                tFaq_net = TimedTask.CallWithTimeoutAsync(timeout, () => new Faq_net(domain).Get(q, domain), q, null);
                tasks.AddRange(tFaqList);
                tasks.Add(tFaq_net);
                await Task.WhenAll(tasks.ToArray());

                faq     = GetFAQAll(tFaqList);
                faq_net = tFaq_net == null ? null : tFaq_net.Result;
                tlog_temp.Start();
                QueryDataContainer SortData = DataSort.SortKB(faq, faq_net, null, null);

                SortData.ElapsedList.AddRange(listElaps);
                if (SortData.MetaList.Count == 0)
                {
                    return(new { result = false, msg = "未找到查询结果!" });
                }
                return(new { result = true, SortData.MetaList });
            }
            catch (System.Exception ex)
            {
                CBase.Log.Logger.Error(ex);
                return(new { result = false, msg = ex.ToString() });
            }
        }
Exemplo n.º 5
0
        /// <summary>
        /// 获取点赞评价修改排序得分
        /// </summary>
        /// <param name="cinfo"></param>
        /// <param name="coefficient"></param>
        /// <param name="qdc"></param>
        /// <param name="IDs"></param>
        private static void AddScoreByEvaluate(ClientInfo cinfo, double coefficient, QueryDataContainer qdc, List <string> IDs)
        {
            try
            {
                Respond rspdata = null;
                double  et;
                rspdata = CBase.Log.FuncCatch.Catch <Respond>(delegate
                {
                    return(TimedTask.CallActionWithTimeoutSync(200, delegate
                    {
                        var client = new FeedbackServiceInterfaceClient();
                        //Task.Delay(2000).Wait();
                        return client.GetEvaluate(IDs);
                    }, "FeedbackService", cinfo));
                }, out et);

                qdc.ElapsedList.Add(new FuncElapsed("FeedbackService", et));
                if (rspdata == null)
                {
                    return;
                }

                var data = rspdata.Data;
                int max  = rspdata.MaxCount;
                if (data != null && max > 10)
                {
                    foreach (var d in data)
                    {
                        var count = d.count;
                        var id    = d.ahash;
                        var qdata = qdc.MetaList.Where(p => p.ID == id).FirstOrDefault();
                        if (qdata != null)
                        {
                            qdata.OrderBy = qdata.OrderBy + (1 - coefficient) * (Math.Log(count + 1, Math.E) / Math.Log(max + 1, Math.E));
                            //qdata.OrderBy = qdata.OrderBy + (1 - coefficient) * Math.Log(count + 1, Math.E);
                        }
                    }
                }
            }
            catch { }
        }
Exemplo n.º 6
0
        //[System.Web.Http.HttpGet]
        //[ValidateInput(false)]
        //[System.Web.Http.Route("GetKBData")]
        private async Task <Object> GetKBData(string q, string domain = null)
        {
            try
            {
                List <FuncElapsed>     listElaps = new List <FuncElapsed>();
                CBase.Log.TimeWatchLog tlogTotal = new CBase.Log.TimeWatchLog();
                CBase.Log.TimeWatchLog tlog_temp = new CBase.Log.TimeWatchLog();
                if (string.IsNullOrEmpty(q))
                {
                    return(null);
                }
                //根据意图分析结果,提供准确答案与资源导航、问答对
                Dictionary <string, QueryContainer <CMKArea> >         navContent = null;
                Task <Dictionary <string, QueryContainer <CMKArea> > > tNavi      = null;
                ClientInfo cinfo = new ClientInfo()
                {
                    UserName = CommonHelper.GetUserName(),
                    IP       = CommonHelper.GetClientIP()
                };
                //获取意图识别
                tlog_temp.Start();
                Domain.Intent intent = new Answer(domain).GetIntent(q, domain);
                listElaps.Add(new FuncElapsed("GetIntent", tlog_temp.Debug()));

                //内容收集 意图是否识别收集用于数据分析 1未识别 2已识别
                ContentLogType collectType = ContentLogType.已识别;
                if (intent != null && intent.qt_parsed_rst == null)
                {
                    collectType = ContentLogType.未识别;
                }
                var client = new CollectorInterfaceClient();
                Task.Run <bool>(() =>
                {
                    return(client.SetConfused(new CollectorEntity()
                    {
                        Content = intent.RawInput,
                        Type = (int)collectType,
                        IP = cinfo.IP,
                        UserID = cinfo.UserName
                    }));
                });

                cinfo.Type = ContentLogType.知识库超时;
                tNavi      = TimedTask.CallWithTimeoutAsync(timeout, () => new KB(domain).Get(intent), q, cinfo);
                await Task.WhenAll(tNavi);

                navContent = tNavi == null ? null : tNavi.Result;
                tlog_temp.Start();
                cinfo.Type = ContentLogType.问题排序超时;
                QueryDataContainer SortData = DataSort.SortKB(null, null, navContent, cinfo);
                listElaps.Add(new FuncElapsed("SortKB", tlog_temp.Debug()));
                AnswerResultKB result = new Models.AnswerResultKB()
                {
                    intent   = intent,
                    SortData = SortData
                };
                result.timeSpan = tlogTotal.Debug();
                SortData.ElapsedList.AddRange(listElaps);
                if (SortData.MetaList.Count == 0)
                {
                    return(new { result = false, msg = "未找到查询结果!" });
                }
                for (int i = 0; i < SortData.MetaList.Count; i++)
                {
                    SortData.MetaList[i].QExp = null;
                }
                return(new { result = true, SortData.MetaList });
            }
            catch (System.Exception ex)
            {
                CBase.Log.Logger.Error(ex);
                return(new { result = false, msg = ex.ToString() });
            }
        }
Exemplo n.º 7
0
        public async Task <Object> GetAnswer(string q, string appid, string aid)
        {
            try
            {
                CBase.Log.TimeWatchLog twTotal = new CBase.Log.TimeWatchLog();
                if (string.IsNullOrEmpty(q))
                {
                    return new { result = false, msg = "问题不能为空!" }
                }
                ;

                //根据意图分析结果,提供准确答案与资源导航、问答对
                Dictionary <string, QueryContainer <CMKArea> > navContent = null;
                QueryContainer <CMFAQ>     faq     = null;
                QueryContainer <CMFAQ_NET> faq_net = null;

                Task <Dictionary <string, QueryContainer <CMKArea> > > tNavi = null;
                List <Task <QueryContainer <CMFAQ> > > tFaqList = null;
                Task <QueryContainer <CMFAQ_NET> >     tFaq_net = null;

                ClientInfo cinfo = new ClientInfo()
                {
                    UserName = CommonHelper.GetUserName(),
                    IP       = CommonHelper.GetClientIP()
                };

                //获取意图识别
                Domain.Intent intent = new Answer().GetIntent(q);

                //内容收集 意图是否识别收集用于数据分析 1未识别 2已识别
                ContentLogType collectType = ContentLogType.已识别;
                if (intent != null && intent.qt_parsed_rst == null)
                {
                    collectType = ContentLogType.未识别;
                }
                var client = new CollectorInterfaceClient();
                Task.Run <bool>(() =>
                {
                    return(client.SetConfused(new CollectorEntity()
                    {
                        Content = intent.RawInput,
                        Type = (int)collectType,
                        IP = cinfo.IP,
                        UserID = cinfo.UserName
                    }));
                });
                List <string> filterDomain = new List <string>();
                QueryConfig   qconfig      = new QueryConfig().GetQueryConfig();
                if (qconfig != null && qconfig.DomainMap.ContainsKey("default"))
                {
                    filterDomain = qconfig.DomainMap["default"].FAQ;
                }

                var tasks = new List <Task>();
                cinfo.Type = ContentLogType.知识库超时;
                tNavi      = TimedTask.CallWithTimeoutAsync(timeout, () => new KB().Get(intent), q, cinfo);

                cinfo.Type = ContentLogType.问答集超时;
                tFaqList   = GetFAQTask(q, timeout, filterDomain);

                cinfo.Type = ContentLogType.用户问答集超时;
                tFaq_net   = TimedTask.CallWithTimeoutAsync(timeout, () => new Faq_net().Get(q), q, cinfo);
                tasks.Add(tNavi);

                tasks.AddRange(tFaqList);

                tasks.Add(tFaq_net);
                await Task.WhenAll(tasks.ToArray());

                navContent = tNavi == null ? null : tNavi.Result;

                faq = GetFAQAll(tFaqList);

                //如果faq和faqnet有内容就不返回知识库内容
                faq_net = tFaq_net == null ? null : tFaq_net.Result;
                if ((faq != null && faq.Total > 0) || (faq_net != null && faq_net.Total > 0))
                {
                    navContent = null;
                }

                cinfo.Type = ContentLogType.问题排序超时;
                QueryDataContainer SortData = DataSort.SortKB(faq, faq_net, navContent, cinfo);
                twTotal.Write("GetAnswer");
                if (SortData.MetaList.Count == 0)
                {
                    return(new { result = false, msg = "未找到查询结果!" });
                }
                return(new { result = true, SortData.MetaList });
            }
            catch (System.Exception ex)
            {
                CBase.Log.Logger.Error(ex);
                return(new { result = false, msg = ex.ToString() });
            }
        }
Exemplo n.º 8
0
 /// <summary>
 /// 转换领域问答对
 /// </summary>
 /// <param name="faq"></param>
 /// <param name="coefficient"></param>
 /// <param name="qdc"></param>
 /// <param name="IDs"></param>
 private static void ConvertFAQ(QueryContainer <CMFAQ> faq, double coefficient, QueryDataContainer qdc, List <string> IDs)
 {
     if (faq != null)
     {
         if (faq.MetaList != null)
         {
             foreach (var f in faq.MetaList)
             {
                 CMBase cb        = new CMBase();
                 var    faqAnswer = new FaqAnswer()
                 {
                     Domain = f.DOMAIN, Question = f.QUESTION, Answer = f.PREPARED_ANSWER
                 };
                 if (f.ADDITIONAL_INFO != null)
                 {
                     faqAnswer.Extra = f.ADDITIONAL_INFO;
                 }
                 cb.Data     = faqAnswer;
                 cb.QExp     = faq.QExp;
                 cb.DataType = DataType.CMFAQ;
                 string id = f.QUESTION.ToString().GetHashCode() + "_" + f.PREPARED_ANSWER.GetHashCode();
                 cb.ID = id;
                 qdc.MetaList.Add(cb);
                 cb.Weight  = 0.9;
                 cb.OrderBy = coefficient * cb.Weight;
                 IDs.Add(id);
             }
             qdc.HaveAccurate = true;
         }
         if (!string.IsNullOrEmpty(faq.ErrorMsg))
         {
             qdc.ErrorMsg += string.Format("faq:{0};", faq.ErrorMsg);
         }
         qdc.Elapsed += faq.Elapsed;
         qdc.ElapsedList.Add(new FuncElapsed("faq", faq.Elapsed));
     }
 }
Exemplo n.º 9
0
 /// <summary>
 /// 转换社区问答对
 /// </summary>
 /// <param name="faq_net"></param>
 /// <param name="coefficient"></param>
 /// <param name="qdc"></param>
 /// <param name="IDs"></param>
 private static void ConvetFAQ_NET(QueryContainer <CMFAQ_NET> faq_net, double coefficient, QueryDataContainer qdc, List <string> IDs)
 {
     if (faq_net != null)
     {
         if (faq_net.MetaList != null)
         {
             foreach (var f in faq_net.MetaList)
             {
                 CMBase cb     = new CMBase();
                 var    faqnet = new FaqNETAnswer()
                 {
                     Question = f.QUESTION, Answer = f.PREPARED_ANSWER, Time = f.TIME, UserName = f.USER_NAME, AnswerID = f.ANSWER_ID
                 };
                 cb.Data     = faqnet;
                 cb.QExp     = faq_net.QExp;
                 cb.DataType = DataType.CMFAQ_NET;
                 string id = f.QUESTION.ToString().GetHashCode() + "_" + f.PREPARED_ANSWER.GetHashCode();
                 cb.ID      = id;
                 cb.Weight  = 0.95;
                 cb.OrderBy = coefficient * cb.Weight;
                 qdc.MetaList.Add(cb);
                 IDs.Add(id);
             }
             qdc.HaveAccurate = true;
         }
         if (!string.IsNullOrEmpty(faq_net.ErrorMsg))
         {
             qdc.ErrorMsg += string.Format("faq_net:{0};", faq_net.ErrorMsg);
         }
         qdc.Elapsed += faq_net.Elapsed;
         qdc.ElapsedList.Add(new FuncElapsed("faq_net", faq_net.Elapsed));
     }
 }
Exemplo n.º 10
0
        /// <summary>
        /// 转换知识库
        /// </summary>
        /// <param name="nav"></param>
        /// <param name="coefficient"></param>
        /// <param name="qdc"></param>
        /// <param name="IDs"></param>
        private static void ConvertNavi(Dictionary <string, QueryContainer <CMKArea> > nav, double coefficient, QueryDataContainer qdc, List <string> IDs)
        {
            if (nav != null)
            {
                try
                {
                    foreach (var nvadata in nav.Values)
                    {
                        string naviDomain = string.Empty;
                        var    navQC      = nvadata;
                        if (navQC.Total > 0)
                        {
                            foreach (var f in navQC.MetaList)
                            {
                                CMBase cb = new CMBase();
                                cb.Data = f;
                                cb.QExp = navQC.QExp;
                                string id = f.Domain + "_" + f.Title.GetHashCode();
                                cb.ID       = id;
                                cb.DataType = DataType.CMNav;
                                cb.Weight   = 1;
                                cb.OrderBy  = coefficient * cb.Weight;
                                qdc.MetaList.Add(cb);
                                IDs.Add(id);
                                naviDomain = f.qt_domain;
                            }
                            qdc.HaveAccurate = true;
                        }
                        if (!string.IsNullOrEmpty(navQC.ErrorMsg))
                        {
                            qdc.ErrorMsg += string.Format("Navi:{0};", navQC.ErrorMsg);
                        }

                        qdc.Elapsed += navQC.Elapsed;
                        qdc.ElapsedList.Add(new FuncElapsed("Navi_" + naviDomain, navQC.Elapsed));
                    }
                }
                catch
                {
                    return;
                }
            }
        }
Exemplo n.º 11
0
        /// <summary>
        /// 转换句群
        /// </summary>
        /// <param name="qcAnswer"></param>
        /// <param name="cinfo"></param>
        /// <param name="maxScore"></param>
        /// <param name="coefficient"></param>
        /// <param name="qdc"></param>
        /// <param name="IDs"></param>
        private static void ConvertAnswer(QueryContainer <CMAnswer> qcAnswer, ClientInfo cinfo, int maxScore, double coefficient, QueryDataContainer qdc, List <string> IDs)
        {
            if (qcAnswer != null)
            {
                if (qcAnswer.MetaList != null)
                {
                    int max = 0;
                    foreach (var f in qcAnswer.MetaList)
                    {
                        CMBase cb = new CMBase();
                        cb.Data     = f;
                        cb.QExp     = qcAnswer.QExp;
                        cb.DataType = DataType.CMAnswer;
                        string id = f.SourceKB + "_" + f.ShortMsg.GetHashCode();
                        cb.ID = id;
                        int score = TextConvert.StringToInt(f.Score, 0);
                        cb.Weight  = score / 100.00 * 0.6;
                        cb.OrderBy = coefficient * cb.Weight;

                        if (f.STRATEGY == "QueryLiter")
                        {
                            f.ShortMsg = f.ShortMsg + "...";
                        }

                        qdc.MetaList.Add(cb);
                        IDs.Add(id);
                        if (score > max)
                        {
                            max = score;
                        }
                    }
                    //得分低
                    int type = 3;
                    if (max > maxScore && qcAnswer.MetaList.Count > 0)
                    {   //得分高
                        type = 5;
                    }
                    //收集
                    if (qcAnswer.QExp != null)
                    {
                        Task.Run <bool>(() =>
                        {
                            return(new CollectorInterfaceClient().SetConfused(new CollectorEntity()
                            {
                                Content = qcAnswer.QExp.InputText,
                                Type = type,
                                IP = cinfo.IP,
                                UserID = cinfo.UserName
                            }));
                        });
                    }

                    qdc.QT_Type = qcAnswer.QType;
                }
                if (!string.IsNullOrEmpty(qcAnswer.ErrorMsg))
                {
                    qdc.ErrorMsg += string.Format("SentenceGroup:{0};", qcAnswer.ErrorMsg);
                }
                qdc.Elapsed += qcAnswer.Elapsed;
                qdc.ElapsedList.Add(new FuncElapsed("SentenceGroup", qcAnswer.Elapsed));
            }
        }