예제 #1
0
        public void NestedPatternOrdinalityTests2()
        {
            var engine = new LucyEngine(new LucyDocument()
            {
                Entities = new List <EntityDefinition>()
                {
                    new EntityDefinition()
                    {
                        Name = "@test", Patterns = new List <Pattern>()
                        {
                            "((x) (y))+"
                        }
                    },
                }
            });

            string text    = "x y x y";
            var    results = engine.MatchEntities(text, null);

            Trace.TraceInformation("\n" + LucyEngine.VisualEntities(text, results));
            var entities = results.Where(e => e.Type == "test").ToList();

            Assert.AreEqual(1, entities.Count);

            text    = "x x z y y";
            results = engine.MatchEntities(text, null);
            Trace.TraceInformation("\n" + LucyEngine.VisualEntities(text, results));
            entities = results.Where(e => e.Type == "test").ToList();
            Assert.AreEqual(0, entities.Count);
        }
예제 #2
0
        public void PatternParser_OneOfModifierTests()
        {
            var engine = new LucyEngine(new LucyDocument()
            {
                Entities = new List <EntityDefinition>()
                {
                    new EntityDefinition()
                    {
                        Name     = "@test",
                        Patterns = new List <Pattern>()
                        {
                            "a (dog|cat|test)"
                        }
                    }
                }
            });

            string text    = "this is a test dog frog";
            var    results = engine.MatchEntities(text, null);

            Trace.TraceInformation("\n" + LucyEngine.VisualEntities(text, results));

            var entities = results.Where(e => e.Type == "test").ToList();

            Assert.AreEqual(1, entities.Count);
            Assert.AreEqual("test", entities[0].Type);
            Assert.AreEqual("a test", text.Substring(entities[0].Start, entities[0].End - entities[0].Start));

            text    = "this is a nottest notdog notfrog";
            results = engine.MatchEntities(text, null);
            Trace.TraceInformation("\n" + LucyEngine.VisualEntities(text, results));

            entities = results.Where(e => e.Type == "test").ToList();
            Assert.AreEqual(0, entities.Count);
        }
예제 #3
0
        public void TestLoadYaml()
        {
            LucyDocument lucyModel;

            using (var streamReader = new StreamReader(File.OpenRead(Path.Combine(@"..", "..", "..", "lucy.yaml"))))
            {
                lucyModel = yamlDeserializer.Deserialize <LucyDocument>(streamReader);
            }

            var engine = new LucyEngine(lucyModel);

            string text = "the box is 9 inches by 7.";

            var results = engine.MatchEntities(text);

            Trace.TraceInformation("\n" + LucyEngine.VisualEntities(text, results));

            var entities = results.Where(e => e.Type == "boxSize").ToList();

            Assert.AreEqual(1, entities.Count);
            var entity = entities.Single().Children.First(entity => entity.Type == "twoDimensional");

            Assert.AreEqual("twoDimensional", entity.Type);
            Assert.AreEqual(2, entity.Children.Count);
            Assert.AreEqual(1, entity.Children.Where(e => e.Type == "number").Count());
            Assert.AreEqual(1, entity.Children.Where(e => e.Type == "dimension").Count());
        }
예제 #4
0
        public void PatternParser_MergeContigious()
        {
            var engine = new LucyEngine(new LucyDocument()
            {
                Entities = new List <EntityDefinition>()
                {
                    new EntityDefinition()
                    {
                        Name = "@cold", Patterns = new List <Pattern>()
                        {
                            new string[] { "cold", "ice", "freezing", "frigid" }
                        }
                    },
                    new EntityDefinition()
                    {
                        Name = "@test", Patterns = new List <Pattern>()
                        {
                            "I want (@cold)* beer"
                        }
                    }
                }
            });

            string text    = "I want ice cold beer";
            var    results = engine.MatchEntities(text);

            Trace.TraceInformation("\n" + LucyEngine.VisualEntities(text, results));

            var entities = results.Where(e => e.Type == "test").ToList();

            Assert.AreEqual(1, entities.Count);
            Assert.AreEqual("test", entities[0].Type);
            Assert.AreEqual("I want ice cold beer", text.Substring(entities[0].Start, entities[0].End - entities[0].Start));
            Assert.AreEqual("ice cold", entities[0].Children.First().Text);
        }
예제 #5
0
        public void TestLoadMacroTest()
        {
            LucyDocument lucyModel;

            using (var streamReader = new StreamReader(File.OpenRead(Path.Combine(@"..", "..", "..", "lucy.yaml"))))
            {
                lucyModel = yamlDeserializer.Deserialize <LucyDocument>(streamReader);
            }

            var engine = new LucyEngine(lucyModel);

            string text    = "flight from seattle to chicago.";
            var    results = engine.MatchEntities(text, null);

            Trace.TraceInformation("\n" + LucyEngine.VisualEntities(text, results));

            var trip           = results.Where(e => e.Type == "trip").Single();
            var departure      = trip.Children.Where(e => e.Type == "departure").Single();
            var departurePlace = departure.Children.Where(e => e.Type == "placeAndTime").Single();
            var departureCity  = departurePlace.Children.Where(e => e.Type == "city").Single();

            Assert.AreEqual("seattle", departureCity.Resolution);
            var destination     = trip.Children.Where(e => e.Type == "destination").Single();
            var desinationPlace = destination.Children.Where(e => e.Type == "placeAndTime").Single();
            var destinationCity = desinationPlace.Children.Where(e => e.Type == "city").Single();

            Assert.AreEqual("chicago", destinationCity.Resolution);
        }
예제 #6
0
        public void RegexPatternMatcher()
        {
            var engine = new LucyEngine(new LucyDocument()
            {
                Entities = new List <EntityDefinition>()
                {
                    new EntityDefinition()
                    {
                        Name = "@test", Patterns = new List <Pattern>()
                        {
                            "/N[\\dA-Z]{5}/"
                        }
                    }
                }
            });

            string text    = "I fly N185LM and used to fly N87405.";
            var    results = engine.MatchEntities(text);

            Trace.TraceInformation("\n" + LucyEngine.VisualEntities(text, results));

            var entities = results.Where(e => e.Type == "test").ToList();

            Assert.AreEqual(2, entities.Count);
            Assert.AreEqual("test", entities[0].Type);
            Assert.AreEqual("N185LM", text.Substring(entities[0].Start, entities[0].End - entities[0].Start));
            Assert.AreEqual("N87405", text.Substring(entities[1].Start, entities[1].End - entities[1].Start));
        }
예제 #7
0
        public void WildcardSingleTest()
        {
            var engine = new LucyEngine(new LucyDocument()
            {
                Entities = new List <EntityDefinition>()
                {
                    new EntityDefinition()
                    {
                        Name = "@name", Patterns = new List <Pattern>()
                        {
                            "name is (value:___)"
                        }
                    },
                }
            });

            string text    = "my name is joe smith and I am cool";
            var    results = engine.MatchEntities(text, null);

            Trace.TraceInformation("\n" + LucyEngine.VisualEntities(text, results));

            var entities = results.Where(e => e.Type == "name").ToList();

            Assert.AreEqual(1, entities.Count);
            Assert.AreEqual("name", entities[0].Type);
            Assert.AreEqual("joe", entities[0].Children.First().Resolution);
            Assert.AreEqual("name is joe", text.Substring(entities[0].Start, entities[0].End - entities[0].Start));
        }
예제 #8
0
        public void WildcardSinglePrefixTest()
        {
            var engine = new LucyEngine(new LucyDocument()
            {
                Entities = new List <EntityDefinition>()
                {
                    new EntityDefinition()
                    {
                        Name = "@beer", Patterns = new List <Pattern>()
                        {
                            "(value:___) beer"
                        }
                    },
                }
            });

            string text    = "like coors beer";
            var    results = engine.MatchEntities(text, null);

            Trace.TraceInformation("\n" + LucyEngine.VisualEntities(text, results));

            var entities = results.Where(e => e.Type == "beer").ToList();

            Assert.AreEqual(1, entities.Count);
            Assert.AreEqual("beer", entities[0].Type);
            Assert.AreEqual("coors", entities[0].Children.First().Resolution);
            Assert.AreEqual("coors beer", text.Substring(entities[0].Start, entities[0].End - entities[0].Start));
        }
예제 #9
0
        public void IgnoreTokenTests()
        {
            var engine = new LucyEngine(new LucyDocument()
            {
                Locale   = "en",
                Entities = new List <EntityDefinition>()
                {
                    new EntityDefinition()
                    {
                        Name   = "@test",
                        Ignore = new List <string>()
                        {
                            "is"
                        },
                        Patterns = new List <Pattern>()
                        {
                            new Pattern("name (value:___)")
                        }
                    }
                }
            });

            string text    = "my name is joe";
            var    results = engine.MatchEntities(text, null);

            Trace.TraceInformation("\n" + LucyEngine.VisualEntities(text, results));

            var entities = results.Where(e => e.Type == "test").ToList();

            Assert.AreEqual(1, entities.Count);
            Assert.AreEqual("test", entities[0].Type);
            Assert.AreEqual("name is joe", text.Substring(entities[0].Start, entities[0].End - entities[0].Start));
            Assert.AreEqual("joe", entities[0].Children.First().Resolution);
        }
예제 #10
0
        public void FuzzyTokenPatternMatcherTests()
        {
            var engine = new LucyEngine(new LucyDocument()
            {
                Entities = new List <EntityDefinition>()
                {
                    new EntityDefinition()
                    {
                        Name       = "@test",
                        FuzzyMatch = true,
                        Patterns   = new List <Pattern>()
                        {
                            "test"
                        }
                    }
                }
            });

            string text    = "this is a tesst";
            var    results = engine.MatchEntities(text, null);

            Trace.TraceInformation("\n" + LucyEngine.VisualEntities(text, results));

            var entities = results.Where(e => e.Type == "test").ToList();

            Assert.AreEqual(1, entities.Count);
            Assert.AreEqual("test", entities[0].Type);
            Assert.AreEqual("tesst", text.Substring(entities[0].Start, entities[0].End - entities[0].Start));
        }
예제 #11
0
        public void PatternParser_ZeroOrMoreModifierQuantityTests()
        {
            var engine = new LucyEngine(new LucyDocument()
            {
                Entities = new List <EntityDefinition>()
                {
                    new EntityDefinition()
                    {
                        Name     = "@test",
                        Patterns = new List <Pattern>()
                        {
                            "a (dog|cat|test)3*"
                        }
                    }
                }
            });

            var text    = "this is a dog dog dog test test test";
            var results = engine.MatchEntities(text, null);

            var entities = results.Where(e => e.Type == "test").ToList();

            Assert.AreEqual(1, entities.Count);
            Assert.AreEqual("test", entities[0].Type);
            Assert.AreEqual("a dog dog dog", text.Substring(entities[0].Start, entities[0].End - entities[0].Start));
        }
예제 #12
0
        public void WildcardDoubleInlineOrdinalTest()
        {
            var engine = new LucyEngine(new LucyDocument()
            {
                Entities = new List <EntityDefinition>()
                {
                    new EntityDefinition()
                    {
                        Name = "@name", Patterns = new List <Pattern>()
                        {
                            "name is (value:___)+"
                        }
                    },
                    new EntityDefinition()
                    {
                        Name = "@entity", Patterns = new List <Pattern>()
                        {
                            "end"
                        }
                    },
                }
            });

            // stop on token
            string text    = "my name is joe smith and stuff";
            var    results = engine.MatchEntities(text, null);

            Trace.TraceInformation("\n" + LucyEngine.VisualEntities(text, results));

            var entities = results.Where(e => e.Type == "name").ToList();

            Assert.AreEqual(1, entities.Count);
            Assert.AreEqual("name", entities[0].Type);
            Assert.AreEqual("joe smith and stuff", entities[0].Children.First().Resolution);
            Assert.AreEqual("name is joe smith and stuff", text.Substring(entities[0].Start, entities[0].End - entities[0].Start));

            // stop on entity
            text    = "my name is joe smith end token";
            results = engine.MatchEntities(text, null);
            Trace.TraceInformation("\n" + LucyEngine.VisualEntities(text, results));

            entities = results.Where(e => e.Type == "name").ToList();
            Assert.AreEqual(1, entities.Count);
            Assert.AreEqual("name", entities[0].Type);
            Assert.AreEqual("joe smith", entities[0].Children.First().Resolution);
            Assert.AreEqual("name is joe smith", text.Substring(entities[0].Start, entities[0].End - entities[0].Start));
        }
예제 #13
0
        public void CascadingPatternTests()
        {
            var engine = new LucyEngine(new LucyDocument()
            {
                Entities = new List <EntityDefinition>()
                {
                    new EntityDefinition()
                    {
                        Name = "@boxsize", Patterns = new List <Pattern>()
                        {
                            "box is @twoDimensional"
                        }
                    },
                    new EntityDefinition()
                    {
                        Name = "@height", Patterns = new List <Pattern>()
                        {
                            "(@dimension|@number) (height|tall)"
                        }
                    },
                    new EntityDefinition()
                    {
                        Name = "@width", Patterns = new List <Pattern>()
                        {
                            "(@dimension|@number) (width|wide)"
                        }
                    },
                    new EntityDefinition()
                    {
                        Name     = "@twoDimensional",
                        Patterns = new List <Pattern>()
                        {
                            "(@width|@dimension|@number) (x|by)? (@height|@dimension|@number)",
                            "(@height|@dimension|@number) (x|by)? (@width|@dimension|@number)",
                        }
                    },
                }
            });

            string text    = "the box is 9 inches by 7.";
            var    results = engine.MatchEntities(text, null);

            Trace.TraceInformation("\n" + LucyEngine.VisualEntities(text, results));

            var entities = results.Where(e => e.Type == "boxsize").ToList();

            Assert.AreEqual(1, entities.Count);
            var entity = entities.Single().Children.Single();

            Assert.AreEqual("twoDimensional", entity.Type);
            Assert.AreEqual(2, entity.Children.Count);
            Assert.AreEqual(1, entity.Children.Where(e => e.Type == "number").Count());
            Assert.AreEqual(1, entity.Children.Where(e => e.Type == "dimension").Count());
        }
예제 #14
0
        private void ShowResults()
        {
            try
            {
                if (lucyModel != this.editor.Document.Text)
                {
                    LoadModel();
                }

                var text = this.query?.Text?.Trim() ?? string.Empty;
                if (text.Length > 0)
                {
                    var sw = new System.Diagnostics.Stopwatch();
                    sw.Start();
                    var results = engine.MatchEntities(text, includeInternal: this.showInternal.IsChecked.Value);
                    sw.Stop();

                    this.tabs.SelectedIndex = 2;
                    this.labelBox.Text      = $"{sw.ElapsedMilliseconds} ms\n" + String.Join("\n", results.Select(s => LucyEngine.VisualizeEntity(text, s, showSpans: true, showHierarchy: false)));
                    this.entitiesBox.Text   = String.Join("\n", results.Select(s => LucyEngine.VisualizeEntity(text, s, showSpans: false, showHierarchy: true)));

                    //var activity = new Activity(ActivityTypes.Message) { Text = text };
                    //var tc = new TurnContext(new TestAdapter(), activity);
                    //var dc = new DialogContext(new DialogSet(), tc, new DialogState());
                    //var recognizerResult = recognizer.RecognizeAsync(dc, activity).Result;
                    //// this.recognizerBox.Text = JsonConvert.SerializeObject(recognizerResult, new JsonSerializerSettings() { Formatting = Formatting.Indented, NullValueHandling = NullValueHandling.Ignore });
                    //this.recognizerBox.Text = new Serializer().Serialize(JObject.FromObject(recognizerResult).ToObject<ExpandoObject>());
                }
            }
            catch (SemanticErrorException err)
            {
                this.error.Content    = err.Message;
                this.error.Visibility = Visibility.Visible;
                this.editor.ScrollToLine(err.Start.Line);
                var line = this.editor.Document.GetLineByNumber(err.Start.Line - 1);
                this.editor.Select(line.Offset, line.Length);
            }
            catch (SyntaxErrorException err)
            {
                this.error.Content    = err.Message;
                this.error.Visibility = Visibility.Visible;
                this.editor.ScrollToLine(err.Start.Line);
                var line = this.editor.Document.GetLineByNumber(err.Start.Line - 1);
                this.editor.Select(line.Offset, line.Length);
            }
            catch (Exception err)
            {
                this.error.Content    = err.Message;
                this.error.Visibility = Visibility.Visible;
            }
        }
예제 #15
0
        public void TestNoBuiltinsReferenced()
        {
            var engine = new LucyEngine(new LucyDocument()
            {
                Entities = new List <EntityDefinition>()
                {
                }
            }, useAllBuiltIns: false);

            string text    = "this is a http://foo.com?x=13&y=132123 cheese";
            var    results = engine.MatchEntities(text, null);

            Trace.TraceInformation("\n" + LucyEngine.VisualEntities(text, results));
            Assert.AreEqual(0, results.Count());
        }
예제 #16
0
        public void CreatesTextTokens()
        {
            var engine = new LucyEngine(new LucyDocument());

            string text    = "this is a test";
            var    results = engine.MatchEntities(text, includeInternal: true);

            Trace.TraceInformation("\n" + LucyEngine.VisualEntities(text, results));

            var entities = results.Where(e => e.Type == TokenPatternMatcher.ENTITYTYPE).ToList();

            Assert.AreEqual(4, entities.Count);
            Assert.AreEqual("this", entities[0].Text);
            Assert.AreEqual("is", entities[1].Text);
            Assert.AreEqual("a", entities[2].Text);
            Assert.AreEqual("test", entities[3].Text);
        }
예제 #17
0
        public void TestAllBuiltIns()
        {
            var engine = new LucyEngine(new LucyDocument()
            {
                Entities = new List <EntityDefinition>()
                {
                    //                    new EntityDefinition() { Name = "@test", Patterns = new List<Pattern>(){ "@url" } },
                }
            }, useAllBuiltIns: true);

            string text    = "this is a http://foo.com?x=13&y=132123 cheese";
            var    results = engine.MatchEntities(text, null);

            Trace.TraceInformation("\n" + LucyEngine.VisualEntities(text, results));
            Assert.AreEqual(1, results.Count());
            Assert.AreEqual("http://foo.com?x=13&y=132123", results[0].Text);
        }
예제 #18
0
        public void MergeNestedChildren()
        {
            var engine = new LucyEngine(new LucyDocument()
            {
                Entities = new List <EntityDefinition>()
                {
                    new EntityDefinition()
                    {
                        Name = "@PizzaOrder", Patterns = new List <Pattern>()
                        {
                            "(@Topping)* (@AddToppings)* "
                        }
                    },
                    new EntityDefinition()
                    {
                        Name = "@AddToppings", Patterns = new List <Pattern>()
                        {
                            "(@ToppingQuantifier)* (@Topping)+"
                        }
                    },
                    new EntityDefinition()
                    {
                        Name = "@ToppingQuantifier", Patterns = new List <Pattern>()
                        {
                            "extra"
                        }
                    },
                    new EntityDefinition()
                    {
                        Name = "@Topping", Patterns = new List <Pattern>()
                        {
                            "Cheese"
                        }
                    },
                }
            });

            string text    = "extra cheese";
            var    results = engine.MatchEntities(text, null);

            Trace.TraceInformation("\n" + LucyEngine.VisualEntities(text, results));
            Assert.AreEqual(1, results[0].Children.Count());
        }
예제 #19
0
        public void TestExternalEntities()
        {
            var engine = new LucyEngine(new LucyDocument()
            {
                ExternalEntities = new List <string>()
                {
                    "url"
                },
                Entities = new List <EntityDefinition>()
                {
                }
            }, useAllBuiltIns: false);

            string text    = "this is a http://foo.com?x=13&y=132123 cheese";
            var    results = engine.MatchEntities(text, null);

            Assert.AreEqual(1, results.Count());
            Assert.AreEqual("http://foo.com?x=13&y=132123", results[0].Text);
        }
예제 #20
0
        public void WildcardMatcherWithOptionalTokenTests()
        {
            var engine = new LucyEngine(new LucyDocument()
            {
                Entities = new List <EntityDefinition>()
                {
                    new EntityDefinition()
                    {
                        Name = "@test1", Patterns = new List <Pattern>()
                        {
                            "test1"
                        }
                    },
                    new EntityDefinition()
                    {
                        Name = "@test2", Patterns = new List <Pattern>()
                        {
                            "test2"
                        }
                    },
                    new EntityDefinition()
                    {
                        Name = "@test3", Patterns = new List <Pattern>()
                        {
                            "start (@test1|@test2|label:___)* end (label:___)* "
                        }
                    },
                }
            });

            string text    = "start test1 cool end more stuff";
            var    results = engine.MatchEntities(text, null);

            Trace.TraceInformation("\n" + LucyEngine.VisualEntities(text, results));

            var entities = results.Where(e => e.Type == "test3").ToList();

            Assert.AreEqual(1, entities.Count);
            Assert.AreEqual("test1", entities.First().Children.First().Text);
            Assert.AreEqual("cool", entities.First().Children.Skip(1).First().Text);
            Assert.AreEqual("more stuff", entities.First().Children.Skip(2).First().Text);
        }
예제 #21
0
        public void WildcardNamedTests()
        {
            var engine = new LucyEngine(new LucyDocument()
            {
                Macros = new Dictionary <string, string>()
                {
                    { "$is", "(is|equals)" },
                },
                Entities = new List <EntityDefinition>()
                {
                    new EntityDefinition()
                    {
                        Name = "@size", Patterns = new List <Pattern>()
                        {
                            "small"
                        }
                    },
                    new EntityDefinition()
                    {
                        Name     = "@drink",
                        Patterns = new List <Pattern>()
                        {
                            "a (@size)? (label:___)* cocktail"
                        }
                    },
                }
            });

            string text    = "a clyde mills cocktail.";
            var    results = engine.MatchEntities(text, null);

            Trace.TraceInformation("\n" + LucyEngine.VisualEntities(text, results));

            var entities = results.Where(e => e.Type == "drink").ToList();

            Assert.AreEqual(1, entities.Count);
            var entity = entities.Single().Children.Single();

            Assert.AreEqual("label", entity.Type);
            Assert.AreEqual("clyde mills", entity.Resolution);
        }
예제 #22
0
        public void TokenPatternMatcherWithEntityTests()
        {
            var engine = new LucyEngine(new LucyDocument()
            {
                Entities = new List <EntityDefinition>()
                {
                    new EntityDefinition()
                    {
                        Name = "@test1", Patterns = new List <Pattern>()
                        {
                            "test1"
                        }
                    },
                    new EntityDefinition()
                    {
                        Name = "@test2", Patterns = new List <Pattern>()
                        {
                            "test2"
                        }
                    },
                    new EntityDefinition()
                    {
                        Name = "@test3", Patterns = new List <Pattern>()
                        {
                            "@test1 @test2"
                        }
                    },
                }
            });

            string text    = "nomatch test1 test2 nomatch";
            var    results = engine.MatchEntities(text, null);

            Trace.TraceInformation("\n" + LucyEngine.VisualEntities(text, results));

            var entities = results.Where(e => e.Type == "test3").ToList();

            Assert.AreEqual(1, entities.Count);
            Assert.AreEqual("test1 test2", text.Substring(entities[0].Start, entities[0].End - entities[0].Start));
        }
예제 #23
0
        public void CanonicalValuesTest()
        {
            var engine = new LucyEngine(new LucyDocument()
            {
                Entities = new List <EntityDefinition>()
                {
                    new EntityDefinition()
                    {
                        Name     = "@test",
                        Patterns = new List <Pattern>()
                        {
                            new string[] { "LAX", "los angeles" },
                            new string[] { "DSM", "(des moines)~" },
                            new string[] { "SEA", "seattle" },
                            new string[] { "OHR", "o'hare", "ohare" },
                            new string[] { "MID", "midway" },
                        }
                    }
                }
            });

            string text    = "flight from seattle to dez moiynes";
            var    results = engine.MatchEntities(text, null);

            Trace.TraceInformation("\n" + LucyEngine.VisualEntities(text, results));

            var entities = results.Where(e => e.Type == "test").ToList();

            Assert.AreEqual(2, entities.Count);
            Assert.AreEqual("test", entities[0].Type);
            Assert.AreEqual("DSM", entities[0].Resolution);
            Assert.AreEqual("dez moiynes", text.Substring(entities[0].Start, entities[0].End - entities[0].Start));

            Assert.AreEqual("test", entities[1].Type);
            Assert.AreEqual("SEA", entities[1].Resolution);
            Assert.AreEqual("seattle", text.Substring(entities[1].Start, entities[1].End - entities[1].Start));
        }
예제 #24
0
        public void RunPerfTests()
        {
            StringBuilder sb    = new StringBuilder();
            var           model = new LucyDocument()
            {
                Macros = new Dictionary <string, string>()
                {
                    { "$name", "(name|nom de plum|handle)" },
                    { "$is", "(is|equals)?" }
                },
                Entities = new List <EntityDefinition>()
                {
                    new EntityDefinition()
                    {
                        Name = "@name", Patterns = new List <Pattern>()
                        {
                            "$name $is ___"
                        }
                    },
                    new EntityDefinition()
                    {
                        Name = "@boxsize", Patterns = new List <Pattern>()
                        {
                            "box $is @twoDimensions"
                        }
                    },
                    new EntityDefinition()
                    {
                        Name = "@height", Patterns = new List <Pattern>()
                        {
                            "(@dimension|@number) (height|tall)"
                        }
                    },
                    new EntityDefinition()
                    {
                        Name = "@width", Patterns = new List <Pattern>()
                        {
                            "(@dimension|@number) (width|wide)"
                        }
                    },
                    new EntityDefinition()
                    {
                        Name     = "@twoDimensions",
                        Patterns = new List <Pattern>()
                        {
                            "(@width|@dimension|@number) (x|by)? (@height|@dimension|@number)",
                            "(@height|@dimension|@number) (x|by)? (@width|@dimension|@number)",
                        }
                    },
                }
            };

            Stopwatch sw = new Stopwatch();

            sw.Start();
            var engine = new LucyEngine(model);

            sw.Stop();
            sb.AppendLine($"loading: {sw.Elapsed}");
            sw.Reset();

            string text = "the box is 9 inches by 7.";

            sw.Restart();
            var results = engine.MatchEntities(text);

            sw.Stop();
            sb.AppendLine($"single cold match: {sw.Elapsed}");
            sw.Reset();

            sw.Restart();
            results = engine.MatchEntities(text, null);
            sw.Stop();
            sb.AppendLine($"single warm match: {sw.Elapsed}");
            sw.Reset();

            sw.Restart();
            var count = 1000;

            for (int i = 0; i < count; i++)
            {
                results = engine.MatchEntities(text);
            }
            sw.Stop();
            sb.AppendLine($"{count} utterances: {sw.Elapsed} {(float)sw.ElapsedMilliseconds/count} ms per match ");
            sw.Reset();
            Trace.TraceInformation(sb.ToString());
            //File.WriteAllText(@"c:\scratch\timing.txt", sb.ToString());
        }
예제 #25
0
        public override async Task <RecognizerResult> RecognizeAsync(DialogContext dialogContext, Activity activity, CancellationToken cancellationToken = default, Dictionary <string, string> telemetryProperties = null, Dictionary <string, double> telemetryMetrics = null)
        {
            if (this._engine == null)
            {
                if (this.Model == null)
                {
                    var resourceExplorer = dialogContext.Context.TurnState.Get <ResourceExplorer>() ?? throw new ArgumentException("No resource Explorer was found in dialog context");
                    resourceExplorer.AddResourceType("yaml");
                    var modelId       = ResourceId.GetValue(dialogContext.State);
                    var modelResource = resourceExplorer.GetResource(modelId) ?? throw new ArgumentException($"{modelId} not found");
                    var yamlOrJson    = await modelResource.ReadTextAsync();

                    this._engine = new LucyEngine(yamlOrJson);
                }
                else
                {
                    this._engine = new LucyEngine(this.Model);
                }
            }

            List <LucyEntity> externalEntities = new List <LucyEntity>();

            if (ExternalEntityRecognizer != null)
            {
                var results = await ExternalEntityRecognizer.RecognizeAsync(dialogContext, activity, cancellationToken, telemetryProperties, telemetryMetrics).ConfigureAwait(false);

                externalEntities = GetEntitiesFromObject(activity, results.Entities).ToList();
            }

            var recognizerResult = new RecognizerResult();
            var lucyEntities     = _engine.MatchEntities(activity.Text ?? string.Empty, externalEntities);

            recognizerResult.Entities = GetRecognizerEntities(lucyEntities);

            var intents = this.Intents.GetValue(dialogContext.State) ?? new List <string>();

            if (intents.Any())
            {
                foreach (var lucyEntity in lucyEntities.Where(entity => intents.Contains(entity.Type)))
                {
                    recognizerResult.Intents.Add(lucyEntity.Type, new IntentScore()
                    {
                        Score = lucyEntity.Score
                    });
                }
            }
            else if (recognizerResult.Entities.Count > externalEntities.Count + 1)
            {
                recognizerResult.Intents.Add(MatchedIntent, new IntentScore()
                {
                    Score = lucyEntities.Max(e => e.Score)
                });
            }

            if (!recognizerResult.Intents.Any())
            {
                recognizerResult.Intents.Add(NoneIntent, new IntentScore {
                    Score = 1.0f
                });
            }

            await dialogContext.Context.TraceActivityAsync(nameof(LucyRecognizer), JObject.FromObject(recognizerResult), "RecognizerResult", "Lucy RecognizerResult", cancellationToken).ConfigureAwait(false);

            this.TrackRecognizerResult(dialogContext, "LucyRecognizerResult", this.FillRecognizerResultTelemetryProperties(recognizerResult, telemetryProperties), telemetryMetrics);

            return(recognizerResult);
        }
예제 #26
0
        async Task OnTextChanged(string value)
        {
            try
            {
                var yaml = await yamlEditor.GetValue();

                var text = value.Trim() ?? string.Empty;
                IEnumerable <LucyEntity> results = null;
                if (text.Length == 0)
                {
                    return;
                }
#if embedded
                if (lucyModel != yaml)
                {
                    LoadModel(yaml);
                }

                var sw = new System.Diagnostics.Stopwatch();
                sw.Start();
                results = engine.MatchEntities(text);
                sw.Stop();
                this.Elapsed = $"{sw.Elapsed.TotalMilliseconds} ms";
#else
                var sw = new System.Diagnostics.Stopwatch();
                sw.Start();
                var result = await Http.PostAsJsonAsync("entities", new EntitiesRequest
                {
                    yaml = yaml,
                    text = text
                });

                sw.Stop();
                // this.Elapsed = $"Network: {sw.Elapsed.TotalMilliseconds} ms";
                var entityResponse = JsonConvert.DeserializeObject <EntitiesResponse>(await result.Content.ReadAsStringAsync());

                this.Elapsed = $"{entityResponse.elapsed} ms";

                if (!String.IsNullOrEmpty(entityResponse.message))
                {
                    this.Error = entityResponse.message;
                    this.alertBox.Show();
                }
                else
                {
                    this.alertBox.Hide();
                }
                results = entityResponse.entities;
#endif

                this.TopResultVisible  = true;
                this.AllResultsVisible = false;
                this.TopResult         = LucyEngine.VisualEntities(text, results);
                this.EntityResults     = String.Join("\n\n", results.Select(entity => LucyEngine.VisualizeEntity(text, entity)));
            }
            catch (SemanticErrorException err)
            {
                this.Error = err.Message;
                this.alertBox.Show();
                //this.editor.ScrollToLine(err.Start.Line);
                //var line = this.editor.Document.GetLineByNumber(err.Start.Line - 1);
                //this.editor.Select(line.Offset, line.Length);
            }
            catch (SyntaxErrorException err)
            {
                this.Error = err.Message;
                this.alertBox.Show();
                //this.error.Visibility = Visibility.Visible;
                //this.editor.ScrollToLine(err.Start.Line);
                //var line = this.editor.Document.GetLineByNumber(err.Start.Line - 1);
                //this.editor.Select(line.Offset, line.Length);
            }
            catch (Exception err)
            {
                this.Error = err.Message;
                this.alertBox.Show();
                //this.error.Content = err.Message;
                //this.error.Visibility = Visibility.Visible;
            }
        }