public void ShouldBeAbleToMatchMultipleIntentPatterns()
        {
            //GIVEN
            var model = new RecognitionModel();

            model.AddEntity("YES", "yes");
            model.AddEntity("NO", "no");
            model.AddEntity("START_OVER", "start over");
            model.AddEntity("GAME_OVER", "game over");
            model.AddIntent("INTENT", new[] { "YES" });
            model.AddIntent("INTENT", new[] { "NO" });
            model.AddIntent("INTENT", new[] { "START_OVER" });
            model.AddIntent("INTENT_GAME_OVER", new[] { "GAME_OVER" });

            //WHEN
            var recognitionResult1 = model.Recognize("yes, please");
            var recognitionResult2 = model.Recognize("no, thank you");
            var recognitionResult3 = model.Recognize("game over, amigo");
            var recognitionResult4 = model.Recognize("shall we start over?");

            //THEN
            recognitionResult1.TopIntent.Should().Be("INTENT");
            recognitionResult2.TopIntent.Should().Be("INTENT");
            recognitionResult3.TopIntent.Should().Be("INTENT_GAME_OVER");
            recognitionResult4.TopIntent.Should().Be("INTENT");
        }
예제 #2
0
        public void ShouldBeAbleToRecognizeTheDifferentEntities2()
        {
            var model = new RecognitionModel();

            model.AddEntity("DRIVER_LICENSE", "driver license");
            model.AddEntity("nato", "alpha");
            model.AddEntity("nato", "bravo");
            model.AddEntity("nato", "charlie");
            model.AddEntity("digit", "1");
            model.AddEntity("digit", "2");
            model.AddEntity("digit", "3");
            model.AddEntity("digit", "4");
            model.AddEntity("digit", "5");
            model.AddEntity("digit", "6");
            model.AddEntity("digit", "7");
            model.AddEntity("digit", "8");
            model.AddEntity("digit", "9");
            model.AddEntity("digit", "0");
            model.AddEntity("state", "New York");

            var result = model.Recognize("Check driver license New York 1 2 alpha bravo 5 6");

            result.Entities.Should().Equal(
                RecognizedEntity.ByCanonicalForm(EntityName.Value("DRIVER_LICENSE"), EntityForm.Value("driver license")),
                RecognizedEntity.ByCanonicalForm(EntityName.Value("state"), EntityForm.Value("New York")),
                RecognizedEntity.ByCanonicalForm(EntityName.Value("digit"), EntityForm.Value("1")),
                RecognizedEntity.ByCanonicalForm(EntityName.Value("digit"), EntityForm.Value("2")),
                RecognizedEntity.ByCanonicalForm(EntityName.Value("nato"), EntityForm.Value("alpha")),
                RecognizedEntity.ByCanonicalForm(EntityName.Value("nato"), EntityForm.Value("bravo")),
                RecognizedEntity.ByCanonicalForm(EntityName.Value("digit"), EntityForm.Value("5")),
                RecognizedEntity.ByCanonicalForm(EntityName.Value("digit"), EntityForm.Value("6")));
        }
예제 #3
0
        public ActionResult Create([Bind(Include = "recognitionId,recognizerId,recognizedId,coreValue,comments,createDate")] RecognitionModel recognitionModel, string recognizedId)
        {
            if (Convert.ToInt32(recognizedId) == AuthorizeLoggedInUser())
            {
                // Throw to the error page, user cannot create for themselves
                return(RedirectToAction("Index", "Error"));
            }
            string email = TempData["email"].ToString();

            if (ModelState.IsValid)
            {
                recognitionModel.recognizerId = AuthorizeLoggedInUser();
                recognitionModel.recognizedId = Convert.ToInt32(recognizedId);
                recognitionModel.createDate   = DateTime.Now;
                db.RecognitionModels.Add(recognitionModel);
                db.SaveChanges();
                // send the email to notify
                try
                {
                    SendEmailAlert(Convert.ToInt32(recognizedId), recognitionModel.recognizerId, email);
                }
                catch (Exception)
                {
                    //throw;
                }

                return(Redirect("~/ProfileDetails/Index"));
            }

            ViewBag.recognizedId = new SelectList(db.ProfileDetails, "id", "firstName", recognitionModel.recognizedId);
            ViewBag.recognizerId = new SelectList(db.ProfileDetails, "id", "firstName", recognitionModel.recognizerId);
            return(View(recognitionModel));
        }
예제 #4
0
        /// <summary>
        /// Take letters saved as grapic files and add them to the database. One image per letter.
        /// </summary>
        /// <param name="directory">Directory with images. Should be named as the font is meant to be.</param>
        public void ReadLettersFromDirectory(string directory, RecognitionModel model)
        {
            var files    = Directory.GetFiles(directory);
            var matrices = files.Select(f =>
            {
                var m        = new ImageMatrix(new Bitmap(Image.FromFile(f)));
                var fileName = f.Substring(f.LastIndexOf(Path.DirectorySeparatorChar));
                if (fileName.Contains("dot"))
                {
                    m.Character = '.';
                }
                else if (fileName.Contains("coma"))
                {
                    m.Character = ',';
                }
                else
                {
                    m.Character = fileName.First();
                }
                return(MatrixTools.Scale(m.CopyMatrix(new MatrixTools(m).TrimWhiteAreaAround())));
            });
            var placeInDB = DataCollector.GenerateFontFolder(directory, model);

            SaveMatricesToDirectory(placeInDB, matrices);
        }
예제 #5
0
        /// <summary>
        /// Learn new style based on a clear page with separated letters from whole alphabet. Letters as on keyboard.
        /// Last 2 letters are dot and comma
        /// </summary>
        /// <param name="file">Path to file with letters.</param>
        public void AcknowledgeNewStyle(string file, RecognitionModel model)
        {
            List <ImageMatrix> letters = null;

            if (model == RecognitionModel.FixedSize)
            {
                letters = new MatrixSplitter(file).Letters;
            }
            else if (model == RecognitionModel.Resizing)
            {
                ImageMatrix main = new ImageMatrix(new Bitmap(Image.FromFile(file)));
                SubMatrix   sub  = new SubMatrix(main.Matrix, new Rectangle {
                    X = 0, Y = 0, Height = main.Height, Width = main.Width
                });
                var letterSplitter = new LetterSplitter(sub);
                letters = GetLines(sub).SelectMany(line => GetLetters(line, letterSplitter)).Select(s => s.ToFullMatrix()).ToList();
            }
            var fileName    = file.Substring(file.LastIndexOf(Path.DirectorySeparatorChar) + 1);
            var woExtension = fileName.Substring(0, fileName.IndexOf('.'));
            var placeInDB   = DataCollector.GenerateFontFolder(woExtension, model);
            int i           = 0;

            foreach (var l in letters.Take(letters.Count - 2))
            {
                l.Character = NextChar(i++);
            }
            SaveMatricesToDirectory(placeInDB, letters);
        }
예제 #6
0
        public void ShouldReturnEmptyListWhenNoEntitiesWereDefined()
        {
            var model = new RecognitionModel();

            var result1 = model.Recognize("driver license");

            result1.Entities.Should().BeEmpty();
        }
        public void ShouldBeAbleToMatchMultipleIntentPatterns2()
        {
            //GIVEN
            var model = new RecognitionModel();

            var borrowEntity = "Borrow";
            var returnEntity = "Return";
            var bookEntity   = "Book";
            var filmEntity   = "Film";

            model.AddEntity(borrowEntity, "borrow");
            model.AddEntity(returnEntity, "return", new [] { "returning" });
            model.AddEntity(bookEntity, "book");
            model.AddEntity(filmEntity, "film", new [] { "movie" });

            model.AddIntent("BORROW_BOOK", new[] { borrowEntity, bookEntity });
            model.AddIntent("RETURN_BOOK", new[] { returnEntity, bookEntity });
            model.AddIntent("BORROW_FILM", new[] { borrowEntity, filmEntity });
            model.AddIntent("RETURN_FILM", new[] { returnEntity, filmEntity });

            //WHEN
            var recognitionResult1 = model.Recognize("I'd like to borrow a book");
            var recognitionResult2 = model.Recognize("I want to return this book");
            var recognitionResult3 = model.Recognize("Can I borrow a film?");
            var recognitionResult4 = model.Recognize("Here, I'm returning the movie");

            //THEN
            recognitionResult1.TopIntent.Should().Be("BORROW_BOOK");
            recognitionResult1.Entities.Should().Equal(new []
            {
                RecognizedEntity.ByCanonicalForm(EntityName.Value(borrowEntity), EntityForm.Value("borrow")),
                RecognizedEntity.ByCanonicalForm(EntityName.Value(bookEntity), EntityForm.Value("book")),
            });

            recognitionResult2.TopIntent.Should().Be("RETURN_BOOK");
            recognitionResult2.Entities.Should().Equal(new []
            {
                RecognizedEntity.ByCanonicalForm(EntityName.Value(returnEntity), EntityForm.Value("return")),
                RecognizedEntity.ByCanonicalForm(EntityName.Value(bookEntity), EntityForm.Value("book")),
            });
            recognitionResult3.TopIntent.Should().Be("BORROW_FILM");
            recognitionResult3.Entities.Should().Equal(new []
            {
                RecognizedEntity.ByCanonicalForm(EntityName.Value(borrowEntity), EntityForm.Value("borrow")),
                RecognizedEntity.ByCanonicalForm(EntityName.Value(filmEntity), EntityForm.Value("film")),
            });

            recognitionResult4.TopIntent.Should().Be("RETURN_FILM");
            recognitionResult4.Entities.Should().Equal(
                RecognizedEntity.Value(
                    EntityName.Value(returnEntity),
                    EntityForm.Value("returning"),
                    EntityForm.Value("return")),
                RecognizedEntity.Value(
                    EntityName.Value(filmEntity),
                    EntityForm.Value("movie"),
                    EntityForm.Value("film")));
        }
예제 #8
0
        private void SetRecognitionModel(RecognitionModel model)
        {
            switch (model)
            {
            case RecognitionModel.FixedSize: recognitionModel = new FixedSizeRecognition(); break;

            case RecognitionModel.Resizing: recognitionModel = new ScalingRecognition(); break;
            }
        }
        // GET: RecognitionModels
        public async Task <ActionResult> Index([Bind(Include = "Id,Key,ImageUpload")] RecognitionModel recognitionModel)
        {
            ViewBag.Message = "Result will show here.";
            Trace.WriteLine("Starting Prediction...");

            if (recognitionModel.ImageUpload != null)
            {
                // Create image.
                Guid projectid = new Guid("57471653-6e79-455f-b874-ee00d1014c37");

                // Create a prediction endpoint, passing in a prediction credentials object that contains the obtained prediction key

                PredictionEndpointCredentials predictionEndpointCredentials = new PredictionEndpointCredentials(recognitionModel.Key);
                PredictionEndpoint            endpoint = new PredictionEndpoint(predictionEndpointCredentials);

                if (recognitionModel.ImageUpload != null && recognitionModel.ImageUpload.ContentLength > 0)
                {
                    //var uploadDir = "~/uploads";
                    //var imagePath = Path.Combine(Server.MapPath(uploadDir), recognitionModel.ImageUpload.FileName);
                    //var imageUrl = Path.Combine(uploadDir, recognitionModel.ImageUpload.FileName);
                    //Trace.WriteLine("ImageUrl:" + imageUrl);
                    //Trace.WriteLine("Image path:" + imagePath);
                    //recognitionModel.ImageUpload.SaveAs(imagePath);

                    Trace.WriteLine("createing memory stream");
                    //MemoryStream memStream = new MemoryStream(System.IO.File.ReadAllBytes(imagePath));

                    MemoryStream memStream = new MemoryStream();
                    recognitionModel.ImageUpload.InputStream.Position = 0;
                    recognitionModel.ImageUpload.InputStream.CopyTo(memStream);
                    memStream.Position = 0;

                    // Make a prediction against the new project
                    Trace.WriteLine("Making a prediction:");
                    try
                    {
                        var result = endpoint.PredictImage(projectid, memStream);

                        // Loop over each prediction and write out the results
                        var predicition = result.Predictions.FirstOrDefault(P => P.Probability >= 0.8);
                        if (predicition == null)
                        {
                            ViewBag.Message = "Could not find a good match for the uploaded image. Please try again.";
                        }
                        else
                        {
                            ViewBag.Message = "Your image is of type " + predicition.Tag + " with the probability of " + predicition.Probability;
                        }
                    }
                    catch (Exception e)
                    {
                        ViewBag.Message = "Could not make a predicition of image " + recognitionModel.ImageUpload.FileName + "! Error message: " + e.Message;
                    }
                }
            }
            return(View(recognitionModel));
        }
예제 #10
0
        [InlineData("LICENSE_PLATE", "license plate", "license plate, will ya?")] //works for suffixed values?
        public void ShouldBeAbleToRecognizeSingleEntity(string entityName, string entityValue, string text)
        {
            var model = new RecognitionModel();

            model.AddEntity(entityName, entityValue);

            var result = model.Recognize(text);

            result.ShouldContainOnly(entityName, entityValue);
        }
예제 #11
0
        public void ShouldReturnEmptyListWhenNoTextDoesNotMatch()
        {
            var model = new RecognitionModel();

            model.AddEntity("DRIVER_LICENSE", "driver license");

            var result = model.Recognize("Trolololo");

            result.Entities.Should().BeEmpty();
        }
        public void ShouldRecognizeNoIntentWhenNothingHasBeenConfigured()
        {
            //GIVEN
            var model = new RecognitionModel();

            //WHEN
            var recognitionResult = model.Recognize("Trolololo");

            //THEN
            recognitionResult.TopIntent.Should().Be("None");
        }
        public void ShouldAllowAddingWiderMatchingIntentAfterMoreNarrowMatching()
        {
            //GIVEN
            var model = new RecognitionModel();

            model.AddEntity("YES", "yes");
            model.AddEntity("PLEASE", "please");
            model.AddIntent("INTENT1", new[] { "YES", "PLEASE" });

            //WHEN - THEN
            model.Invoking(m => m.AddIntent("INTENT2", new[] { "YES" })).Should().NotThrow();
        }
예제 #14
0
        public void ShouldRecognizeEntitiesWithSynonyms()
        {
            //GIVEN
            var model = new RecognitionModel();

            model.AddEntity("PLATE", "plate", new [] { "steel" });

            //WHEN
            var result1 = model.Recognize("steel");

            //THEN
            result1.ShouldContainOnly("PLATE", "steel", "plate");
        }
예제 #15
0
        public void ShouldThrowExceptionWhenAddingEntityWithAlreadyExistingSynonym()
        {
            //GIVEN
            var model = new RecognitionModel();

            model.AddEntity("YES", "yes");

            //WHEN - THEN
            model.Invoking(m => m.AddEntity("YES_PLEASE", "yes, please", new [] { "YES" }))
            .Should().Throw <ConflictingEntityException>()
            .WithMessage("The phrase 'yes' cannot be added for the entity 'YES_PLEASE', " +
                         "because it is already present for entity 'YES', which would be matched earlier");
        }
예제 #16
0
        public void ShouldBeAbleToRecognizeTheSameEntityMultipleTimes()
        {
            var model = new RecognitionModel();

            model.AddEntity("DRIVER_LICENSE", "driver license");

            var result = model.Recognize("driver license driver license");

            result.Entities.Should().Equal(new[]
            {
                RecognizedEntity.ByCanonicalForm(EntityName.Value("DRIVER_LICENSE"), EntityForm.Value("driver license")),
                RecognizedEntity.ByCanonicalForm(EntityName.Value("DRIVER_LICENSE"), EntityForm.Value("driver license")),
            });
        }
예제 #17
0
 public ActionResult Edit([Bind(Include = "recognitionId,recognizerId,recognizedId,coreValue,comments,createDate")] RecognitionModel recognitionModel)
 {
     // Users are not allowed to edit a recognition
     return(RedirectToAction("Index", "Error"));
     //if (ModelState.IsValid)
     //{
     //    db.Entry(recognitionModel).State = EntityState.Modified;
     //    db.SaveChanges();
     //    return RedirectToAction("Index");
     //}
     //ViewBag.recognizedId = new SelectList(db.ProfileDetails, "id", "firstName", recognitionModel.recognizedId);
     //ViewBag.recognizerId = new SelectList(db.ProfileDetails, "id", "firstName", recognitionModel.recognizerId);
     //return View(recognitionModel);
 }
        public void ShouldThrowWhenAddingIntentWithTheSameEntities()
        {
            //GIVEN
            var model = new RecognitionModel();

            model.AddEntity("YES", "yes");
            model.AddEntity("PLEASE", "please");
            model.AddIntent("INTENT1", new[] { "YES", "PLEASE" });

            //WHEN - THEN
            model.Invoking(m => m.AddIntent("INTENT2", new[] { "YES", "PLEASE" }))
            .Should().Throw <ConflictingIntentException>()
            .WithMessage("All the phrases matched by 'INTENT2' will be matched by earlier by 'INTENT1'");
        }
        public void ShouldRecognizeNoIntentWhenTextDoesNotContainAnyOfIntentEntities()
        {
            //GIVEN
            var model = new RecognitionModel();

            model.AddEntity("NO", "no");
            model.AddIntent("INTENT_REFUSE", new [] { "NO" });

            //WHEN
            var recognitionResult = model.Recognize("Trolololo");

            //THEN
            recognitionResult.TopIntent.Should().Be("None");
        }
예제 #20
0
        public void ShouldRecognizeMoreNarrowIntentIfItIsTheFirstOne()
        {
            //GIVEN
            var model = new RecognitionModel();

            model.AddEntity("YES SIR", "yes sir");
            model.AddEntity("YES", "yes");

            //WHEN
            var recognitionResult = model.Recognize("Yes sir");

            //THEN
            recognitionResult.Entities.First().Entity.Should().Be(EntityName.Value("YES SIR"));
        }
예제 #21
0
        // GET: RecognitionModels/Details/5
        public ActionResult Details(int?id)
        {
            if (id == null)
            {
                return(RedirectToAction("Index", "Error"));
            }
            RecognitionModel recognitionModel = db.RecognitionModels.Find(id);
            ProfileDetails   profileDetails   = db.ProfileDetails.Find(id);

            if (recognitionModel == null)
            {
                return(RedirectToAction("Index", "Error"));
            }
            return(View(Tuple.Create(recognitionModel, profileDetails)));
        }
예제 #22
0
        public void ShouldNotRecognizeEntitiesInCenterOfOtherWords()
        {
            //GIVEN
            var model = new RecognitionModel();

            model.AddEntity("PLATE", "plate");

            //WHEN
            var result1 = model.Recognize("plateau");
            var result2 = model.Recognize("unplated");

            //THEN
            result1.Entities.Should().BeEmpty();
            result2.Entities.Should().BeEmpty();
        }
        public void ShouldRecognizeIntentWithMultipleEntitiesMatchingExactlyTheOnesRecognized()
        {
            //GIVEN
            var model = new RecognitionModel();

            model.AddEntity("YES", "yes");
            model.AddEntity("PLEASE", "please");
            model.AddIntent("INTENT_YES", new[] { "YES", "PLEASE" });

            //WHEN
            var recognitionResult = model.Recognize("yes, please");

            //THEN
            recognitionResult.TopIntent.Should().Be("INTENT_YES");
        }
예제 #24
0
        public void ShouldSeparateDigitsWhenDetectingEntities()
        {
            var model = new RecognitionModel();

            model.AddEntity("digit", "1");
            model.AddEntity("digit", "2");
            model.AddEntity("digit", "3");

            var result = model.Recognize("123");

            result.Entities.Should().BeEquivalentTo(
                RecognizedEntity.ByCanonicalForm(EntityName.Value("digit"), EntityForm.Value("1")),
                RecognizedEntity.ByCanonicalForm(EntityName.Value("digit"), EntityForm.Value("2")),
                RecognizedEntity.ByCanonicalForm(EntityName.Value("digit"), EntityForm.Value("3")));
        }
예제 #25
0
        public static string GenerateFontFolder(string name, RecognitionModel model)
        {
            string modelFolder = string.Empty;

            switch (model)
            {
            case RecognitionModel.FixedSize: modelFolder = DATA.fixedSizeFolderNode; break;

            case RecognitionModel.Resizing: modelFolder = DATA.varyingSizeFolderNode; break;
            }
            var fontFolder = Path.Combine(DATA.mainFolder, modelFolder, name);

            Directory.CreateDirectory(fontFolder);
            Directory.CreateDirectory(Path.Combine(fontFolder, DATA.capitalsFolderNode));
            Directory.CreateDirectory(Path.Combine(fontFolder, DATA.normalsFolderNode));
            return(fontFolder);
        }
        [InlineData("no yes")] //does it work when the defining entity is not the first one?
        public void ShouldRecognizeIntentWithSingleEntity(string text)
        {
            //GIVEN
            var model = new RecognitionModel();

            model.AddEntity("YES", "yes");
            model.AddEntity("NO", "no");
            var entityNames = new [] { "YES" };

            model.AddIntent("INTENT_YES", entityNames);

            //WHEN
            var recognitionResult = model.Recognize(text);

            //THEN
            recognitionResult.TopIntent.Should().Be("INTENT_YES");
        }
예제 #27
0
        /// <summary>
        /// Main recognition tool. Uses first page as a sample for building recognition mechanism.
        /// </summary>
        /// <param name="files"></param>
        /// <returns></returns>
        public List <char> ProcessBook(List <string> files, RecognitionModel model)
        {
            var sample        = files.First();
            var mainMatrix    = new ImageMatrix(new Bitmap(Image.FromFile(sample)));
            var sampleLetters = FindLettersToLines(mainMatrix);

            SetRecognitionModel(model);
            recognitionModel.AcknowledgeStyle(sampleLetters);

            List <char> toRet = new List <char>();

            toRet.AddRange(recognitionModel.ProcessPage(sampleLetters));
            foreach (var file in files.Skip(1))
            {
                toRet.AddRange(ProcessPage(file));
            }
            return(toRet);
        }
예제 #28
0
        public void ShouldBeAbleToRecognizeSingleEntityWithDifferentPatterns()
        {
            //GIVEN
            var model = new RecognitionModel();

            model.AddEntity("DRIVER_LICENSE", "driver license");
            model.AddEntity("DRIVER_LICENSE", "driver licence");
            model.AddEntity("DRIVER_LICENSE", "driving license");

            //WHEN
            var result1 = model.Recognize("driver license");
            var result2 = model.Recognize("driver licence");
            var result3 = model.Recognize("driving license");

            //THEN
            result1.ShouldContainOnly("DRIVER_LICENSE", "driver license");
            result2.ShouldContainOnly("DRIVER_LICENSE", "driver licence");
            result3.ShouldContainOnly("DRIVER_LICENSE", "driving license");
        }
        [Authorize] // Only the logged in user can view thier details
        // GET: ProfileDetails/Details/5
        public ActionResult Details(int?id)
        {
            if (id != AuthorizeLoggedInUser())
            {
                // User is attempting access to another account.
                // Send them to error page
                return(RedirectToAction("Index", "Error"));
            }
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            ProfileDetails   profileDetails    = db.ProfileDetails.Find(id);
            RecognitionModel recognitionModels = db.RecognitionModels.Find(id);

            if (profileDetails == null)
            {
                return(RedirectToAction("Index", "Error"));
                //return HttpNotFound();
            }
            return(View(Tuple.Create(profileDetails, recognitionModels)));
        }