예제 #1
0
        private static ModelResult <FoundValue> MatchValue(List <Token> tokens, int maxDistance, FindValuesOptions options, int index, string value, List <Token> vTokens, int startPos)
        {
            // Match value to utterance and calculate total deviation.
            // - The tokens are matched in order so "second last" will match in
            //   "the second from last one" but not in "the last from the second one".
            // - The total deviation is a count of the number of tokens skipped in the
            //   match so for the example above the number of tokens matched would be
            //   2 and the total deviation would be 1.
            var matched        = 0;
            var totalDeviation = 0;
            var start          = -1;
            var end            = -1;

            foreach (var token in vTokens)
            {
                // Find the position of the token in the utterance.
                var pos = IndexOfToken(tokens, token, startPos);
                if (pos >= 0)
                {
                    // Calculate the distance between the current tokens position and the previous tokens distance.
                    var distance = matched > 0 ? pos - startPos : 0;
                    if (distance <= maxDistance)
                    {
                        // Update count of tokens matched and move start pointer to search for next token after
                        // the current token.
                        matched++;
                        totalDeviation += distance;
                        startPos        = pos + 1;

                        // Update start & end position that will track the span of the utterance that's matched.
                        if (start < 0)
                        {
                            start = pos;
                        }
                        end = pos;
                    }
                }
            }

            // Calculate score and format result
            // - The start & end positions and the results text field will be corrected by the caller.
            ModelResult <FoundValue> result = null;

            if (matched > 0 && (matched == vTokens.Count || options.AllowPartialMatches))
            {
                // Percentage of tokens matched. If matching "second last" in
                // "the second from last one" the completeness would be 1.0 since
                // all tokens were found.
                var completeness = matched / vTokens.Count;

                // Accuracy of the match. The accuracy is reduced by additional tokens
                // occurring in the value that weren't in the utterance. So an utterance
                // of "second last" matched against a value of "second from last" would
                // result in an accuracy of 0.5.
                var accuracy = (matched / (matched + totalDeviation));

                // The final score is simply the completeness multiplied by the accuracy.
                var score = completeness * accuracy;

                // Format result
                result = new ModelResult <FoundValue>
                {
                    Start      = start,
                    End        = end,
                    TypeName   = "value",
                    Resolution = new FoundValue
                    {
                        Value = value,
                        Index = index,
                        Score = score
                    }
                };
            }
            return(result);
        }
        private static void MatchChoiceByIndex(IList <Choice> list, List <ModelResult <FoundChoice> > matched, ModelResult <FoundChoice> match)
        {
            try
            {
                // converts Resolution Values containing "end" (e.g. utterance "last") in numeric values.
                var value = match.Resolution.Value.Replace("end", list.Count.ToString(CultureInfo.InvariantCulture));
                using (var dt = new DataTable())
                {
                    var result = (int)dt.Compute(value, string.Empty);

                    var index = result - 1;
                    if (index >= 0 && index < list.Count)
                    {
                        var choice = list[index];
                        matched.Add(new ModelResult <FoundChoice>
                        {
                            Start      = match.Start,
                            End        = match.End,
                            TypeName   = "choice",
                            Text       = match.Text,
                            Resolution = new FoundChoice
                            {
                                Value = choice.Value,
                                Index = index,
                                Score = 1.0f,
                            },
                        });
                    }
                }
            }
#pragma warning disable CA1031 // Do not catch general exception types (we shouldn't do this but it is hard to tell what the original dev had in mind for this case, ignoring for now)
            catch (Exception)
#pragma warning restore CA1031 // Do not catch general exception types
            {
            }
        }
예제 #3
0
 private static void MatchChoiceByIndex(IList <Choice> list, List <ModelResult <FoundChoice> > matched, ModelResult <FoundChoice> match)
 {
     try
     {
         var index = int.Parse(match.Resolution.Value) - 1;
         if (index >= 0 && index < list.Count)
         {
             var choice = list[index];
             matched.Add(new ModelResult <FoundChoice>
             {
                 Start      = match.Start,
                 End        = match.End,
                 TypeName   = "choice",
                 Text       = match.Text,
                 Resolution = new FoundChoice
                 {
                     Value = choice.Value,
                     Index = index,
                     Score = 1.0f,
                 },
             });
         }
     }
     catch (Exception)
     {
     }
 }
예제 #4
0
        private static void MatchChoiceByIndex(IList <Choice> list, List <ModelResult <FoundChoice> > matched, ModelResult <FoundChoice> match)
        {
            try
            {
                // converts Resolution Values containing "end" (e.g. utterance "last") in numeric values.
                var value  = match.Resolution.Value.Replace("end", list.Count.ToString());
                var dt     = new DataTable();
                var result = (int)dt.Compute(value, string.Empty);

                var index = result - 1;
                if (index >= 0 && index < list.Count)
                {
                    var choice = list[index];
                    matched.Add(new ModelResult <FoundChoice>
                    {
                        Start      = match.Start,
                        End        = match.End,
                        TypeName   = "choice",
                        Text       = match.Text,
                        Resolution = new FoundChoice
                        {
                            Value = choice.Value,
                            Index = index,
                            Score = 1.0f,
                        },
                    });
                }
            }
            catch (Exception)
            {
            }
        }