public async Task <IActionResult> OnPostAsync()
        {
            if (await _context.AccountClassifiers.FirstOrDefaultAsync(x => x.ClassifierId == ClassifierId && x.AccountId == HttpContext.Session.GetInt32("id")) == null)
            {
                return(RedirectToPage("Error"));
            }

            Models.Classifier classifier = await _context.Classifiers.FirstOrDefaultAsync(x => x.Id == ClassifierId);

            Models.Account account = await _context.Accounts.FirstOrDefaultAsync(x => x.Email == Email && !x.IsAdmin);

            if (account == null)
            {
                ModelState.AddModelError("Email", "No account with this email address exists.");
            }
            else if (await _context.Classifiers.FirstOrDefaultAsync(x => x.Name == classifier.Name && (x.AccountClassifiers.FirstOrDefault(y => y.AccountId == account.Id) != null)) != null)
            {
                ModelState.AddModelError("ClassifierId", "User already has a classifier with this name.");
            }

            if (!ModelState.IsValid)
            {
                Classifiers = await _context.Classifiers.Where(x => x.AccountClassifiers.Any(y => y.ClassifierId == x.Id && y.AccountId == HttpContext.Session.GetInt32("id"))).ToListAsync();

                return(Page());
            }

            _context.AccountClassifiers.Add(new Models.AccountClassifier()
            {
                Account = account, Classifier = classifier
            });
            await _context.SaveChangesAsync();

            return(RedirectToPage("Classifiers"));
        }
        public async Task <IActionResult> OnPostAsync(int?id)
        {
            if (id == null)
            {
                return(RedirectToPage("Classifiers"));
            }

            Models.Classifier classifier = await _context.Classifiers.FirstOrDefaultAsync(x => x.Id == id);

            if (await _context.Classifiers.FirstOrDefaultAsync(x => x.Name == Name && (x.AccountClassifiers.FirstOrDefault(y => y.AccountId == HttpContext.Session.GetInt32("id")) != null)) != null)
            {
                ModelState.AddModelError("Name", "You already have a classifier with this name.");
                Classifier = await _context.Classifiers.FirstOrDefaultAsync(x => x.Id == id);

                Name = Classifier.Name;
                return(Page());
            }

            if (classifier != null && await _context.AccountClassifiers.FirstOrDefaultAsync(x => x.ClassifierId == classifier.Id && x.AccountId == HttpContext.Session.GetInt32("id")) != null)
            {
                _context.Attach(classifier).State = EntityState.Modified;
                classifier.Name = Name;
                await _context.SaveChangesAsync();
            }

            return(RedirectToPage("Classifiers"));
        }
        public async Task <IActionResult> OnGetAsync(int?id)
        {
            if (HttpContext.Session.GetInt32("id") == null || (HttpContext.Session.Get("isAdmin") != null && BitConverter.ToBoolean(HttpContext.Session.Get("isAdmin"))))
            {
                return(RedirectToPage("Error"));
            }

            if (id == null)
            {
                return(RedirectToPage("Error"));
            }

            Classifier = await _context.Classifiers.FirstOrDefaultAsync(x => x.Id == id);

            if (Classifier == null || await _context.AccountClassifiers.FirstOrDefaultAsync(x => x.ClassifierId == Classifier.Id && x.AccountId == HttpContext.Session.GetInt32("id")) == null)
            {
                return(RedirectToPage("Error"));
            }

            Name = Classifier.Name;
            return(Page());
        }
Ejemplo n.º 4
0
        public async Task <IActionResult> OnPostAsync(int?id)
        {
            if (id == null)
            {
                return(RedirectToPage("Classifiers"));
            }

            Models.Classifier classifier = await _context.Classifiers.FindAsync(id);

            if (classifier != null && await _context.AccountClassifiers.FirstOrDefaultAsync(x => x.ClassifierId == classifier.Id && x.AccountId == HttpContext.Session.GetInt32("id")) != null)
            {
                var path = Path.Combine(_environment.WebRootPath, "classifiers", $"{classifier.Model}.zip");

                if (System.IO.File.Exists(path))
                {
                    System.IO.File.Delete(path);
                }

                _context.Classifiers.Remove(classifier);
                await _context.SaveChangesAsync();
            }

            return(RedirectToPage("Classifiers"));
        }
        public async Task <IActionResult> OnPostAsync()
        {
            if (await _context.AccountDatasets.FirstOrDefaultAsync(x => x.DatasetId == DatasetId && x.AccountId == HttpContext.Session.GetInt32("id")) == null)
            {
                return(RedirectToPage("Error"));
            }

            Models.Dataset dataset = await _context.Datasets.FirstOrDefaultAsync(x => x.Id == DatasetId);

            List <Models.Article> articles = await _context.Articles.Where(x => x.DatasetId == dataset.Id).ToListAsync();

            if (articles.Count(x => x.Classification) < 5 || articles.Count(x => !x.Classification) < 5)
            {
                ModelState.AddModelError("DatasetId", "Dataset must have at least 5 articles of each classification.");
            }

            if (!ModelState.IsValid)
            {
                Datasets = await _context.Datasets.Where(x => x.AccountDatasets.Any(y => y.DatasetId == x.Id && y.AccountId == HttpContext.Session.GetInt32("id"))).ToListAsync();

                return(Page());
            }

            List <ArticleData> data = articles.Select(x => new ArticleData()
            {
                Text = x.Title + " " + x.Abstract, Classification = x.Classification
            }).ToList();
            MLContext     mlContext     = new MLContext();
            IDataView     dataView      = mlContext.Data.LoadFromEnumerable(data);
            TrainTestData splitDataView = mlContext.Data.TrainTestSplit(dataView, 0.2);
            var           estimator     = mlContext.Transforms.Text.FeaturizeText(outputColumnName: "Features", inputColumnName: nameof(ArticleData.Text))
                                          .Append(mlContext.BinaryClassification.Trainers.SdcaLogisticRegression(labelColumnName: "Label", featureColumnName: "Features"));
            ITransformer model       = estimator.Fit(splitDataView.TrainSet);
            IDataView    predictions = model.Transform(splitDataView.TestSet);
            CalibratedBinaryClassificationMetrics metrics = mlContext.BinaryClassification.Evaluate(predictions, "Label");
            var guid = Guid.NewGuid().ToString();
            var path = Path.Combine(_environment.WebRootPath, "classifiers", $"{guid}.zip");

            mlContext.Model.Save(model, dataView.Schema, path);

            Models.Classifier classifier = new Models.Classifier()
            {
                Name      = Name,
                Accuracy  = metrics.Accuracy,
                Precision = metrics.PositivePrecision,
                Recall    = metrics.PositiveRecall,
                Date      = DateTime.Now,
                Model     = guid
            };

            Models.Account account = await _context.Accounts.FirstOrDefaultAsync(x => x.Id == HttpContext.Session.GetInt32("id"));

            _context.Classifiers.Add(classifier);
            _context.AccountClassifiers.Add(new Models.AccountClassifier()
            {
                Account = account, Classifier = classifier
            });
            await _context.SaveChangesAsync();

            return(RedirectToPage("Classifiers"));
        }