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