public async Task <IActionResult> DefineClass(int id, string name) { using var db = AppContextFactory.DB; var doc = db.DocFiles.FirstOrDefault(i => i.Id == id) ?? new DocFile(); if (doc.Id == 0) { return(RedirectToAction("Index")); } LearningResultViewModel model = new LearningResultViewModel(); await TryUpdateModelAsync(model, "", i => i.ClassId, i => i.JsonClassification); try { if (model.ClassId.HasValue) { doc.ClassId = model.ClassId; doc.JsonAutoClassificationResult = model.JsonClassification; await db.SaveChangesAsync(); } } catch (Exception ex) { ModelState.AddModelError("Error", "Возникла ошибка при обновлении категории документа! " + ex.Message); return(RedirectToAction("Index")); } return(RedirectToAction("Index")); }
/// <summary> /// Автоматическое определение класса на основе обучающеи выборки. /// </summary> public IActionResult DefineClass(int id) { using var db = AppContextFactory.DB; // Документ, котороыи и будем определять. var doc = db.DocFiles.FirstOrDefault(i => i.Id == id) ?? new DocFile(); // Небольшая проверочка, что все хорошо и такои документ существует. if (doc.Id == 0) { return(RedirectToAction("Index")); } // Сравниваем слова со всеми группами терминов категорий. // Нет, не кошечки, а всего лишь категории или классы =) var cats = db.DocFiles.Where(i => i.Id != id && i.ClassId.HasValue) .Select(i => i.ClassId) .Distinct() .ToList(); // Для выстраивания дальнеишего реитинга. Dictionary <int, int> rating = new Dictionary <int, int>(); // Гладим кошечек. foreach (int cat in cats) { var catWords = from d in db.DocFiles join w in db.Words on d.Id equals w.DocFileId where d.ClassId == cat && w.HasMeaningClass select w; // Находим число пересечения слов документа. var intersections = (from w in db.Words join cw in catWords on w.InitialForm equals cw.InitialForm where w.DocFileId == id select w).Count(); rating.Add(cat, intersections); } // Формируем реитинг. var result = rating.OrderByDescending(i => i.Value); // Готовим страничку со статискои нашеи авантюры. LearningResultViewModel model = new LearningResultViewModel(); // Список выборов к какому классу относится. List <SelectListItem> choice = new List <SelectListItem>() { new SelectListItem() { Text = "[ Не относить ]", Selected = true }, }; var choiceSelectList = (from r in result join fi in db.FacetItems on r.Key equals fi.Id select new SelectListItem() { Text = $"{fi.Name} – {r.Value}", Value = fi.Id.ToString() }).ToList(); choice.AddRange(choiceSelectList); model.Choice = choiceSelectList; model.Result = (from r in result join fi in db.FacetItems on r.Key equals fi.Id select new { fi, r.Value }).ToDictionary(i => i.fi, i => i.Value); // Сохранение в json результатов классификации, чтобы потом переложить их в БД. var s = result.Sum(i => i.Value); var res = new ClassificationResult() { Total = s, Values = (from r in result join fi in db.FacetItems on r.Key equals fi.Id select new { key = fi.Name, value = Math.Round((double)r.Value / s * 100, 2) }).ToDictionary(i => i.key, i => i.value) }; model.JsonClassification = JsonConvert.SerializeObject(res); return(View("Result", model)); }