Exemplo n.º 1
0
        /// <summary>
        /// Match entities in given text
        /// </summary>
        /// <param name="text">text to match against.</param>
        /// <param name="culture">culture</param>
        /// <param name="externalEntities">externally provided entities</param>
        /// <param name="includeInternal">include tokens in results</param>
        /// <returns>entities</returns>
        public IList <LucyEntity> MatchEntities(string text, IEnumerable <LucyEntity> externalEntities = null, bool includeInternal = false)
        {
            var context = new MatchContext()
            {
                Text = text,
            };

            if (externalEntities != null)
            {
                foreach (var externalEntity in externalEntities)
                {
                    context.AddNewEntity(externalEntity);
                }
                context.ProcessNewEntities();
            }

            if (this.BuiltinEntities.Any())
            {
                AddBuiltInEntities(context, text, Locale);
                context.ProcessNewEntities();
            }

            // Add regex pattern entities
            if (this.RegexEntityPatterns.Any())
            {
                foreach (var regex in this.RegexEntityPatterns)
                {
                    foreach (var entity in regex.Matches(text))
                    {
                        context.NewEntities.Add(entity);
                    }
                }
                context.ProcessNewEntities();
            }

            // add all @Token entities
            context.TokenEntities.AddRange(Tokenize(text));

            int count = 0;

            do
            {
                count = context.Entities.Count;

                // foreach text token
                foreach (var tokenEntity in context.TokenEntities)
                {
                    // foreach entity pattern
                    foreach (var entityPattern in EntityPatterns)
                    {
                        ProcessEntityPattern(context, tokenEntity, entityPattern);
                    }
                }

                context.ProcessNewEntities();

                // if entities were added we need to run wildcard matchers
                if (count == context.Entities.Count && WildcardEntityPatterns.Any())
                {
                    // process wildcard patterns
                    foreach (var textEntity in context.TokenEntities)
                    {
                        foreach (var entityPattern in WildcardEntityPatterns)
                        {
                            ProcessEntityPattern(context, textEntity, entityPattern);
                        }
                    }
                    context.ProcessNewEntities();
                }
            } while (count != context.Entities.Count);

            context.MergeEntities(context.Entities);
            context.ResolveEntities(context.Entities);

            // only include tokenEntities if they ask for them
            if (includeInternal)
            {
                var merged = new List <LucyEntity>(context.TokenEntities);
                merged.AddRange(context.Entities);
                return(merged);
            }

            return(context.Entities.OrderByDescending(e => e.Score).ToList());
        }