Пример #1
0
        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"));
        }
Пример #2
0
        /// <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));
        }