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); }
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); }
/// <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() }); } }
//[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() }); } }
/// <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 { } }
//[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() }); } }
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() }); } }
/// <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)); } }
/// <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)); } }
/// <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; } } }
/// <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)); } }