public static Phrase Parse(IFuzzyState state, Phrase phrase) {
            Match regexMatch = TimeVariableTemporalPrimitiveToken.RegexMatch.Match(phrase.Text);

            if (regexMatch.Success == true) {
                int? hours = regexMatch.Groups["hours"].Value.Length > 0 ? int.Parse(regexMatch.Groups["hours"].Value) : 0;
                int? minutes = regexMatch.Groups["minutes"].Value.Length > 0 ? int.Parse(regexMatch.Groups["minutes"].Value) : 0;
                int? seconds = regexMatch.Groups["seconds"].Value.Length > 0 ? int.Parse(regexMatch.Groups["seconds"].Value) : 0;

                if (String.Compare(regexMatch.Groups["meridiem"].Value, "pm", StringComparison.OrdinalIgnoreCase) == 0 && hours < 12) {
                    hours += 12;
                }
                else if (String.Compare(regexMatch.Groups["meridiem"].Value, "am", StringComparison.OrdinalIgnoreCase) == 0) {
                    if (hours == 12) {
                        hours = 0;
                    }
                }

                hours %= 24;

                phrase.Add(new TimeVariableTemporalPrimitiveToken() {
                    Pattern = new FuzzyDateTimePattern() {
                        Rule = TimeType.Definitive,
                        Hour = (regexMatch.Groups["hours"].Value.Length > 0 ? hours : null),
                        Minute = (regexMatch.Groups["minutes"].Value.Length > 0 ? minutes : null),
                        Second = (regexMatch.Groups["seconds"].Value.Length > 0 ? seconds : null)
                    },
                    Text = phrase.Text,
                    Similarity = 100.0F
                });
            }

            return phrase;
        }
        public static Phrase ReduceDividendForwardSlashDivisor(IFuzzyState state, Dictionary<String, Token> parameters) {
            FloatNumericPrimitiveToken dividend = (FloatNumericPrimitiveToken) parameters["dividend"];
            ForwardSlashPunctuationSyntaxToken forwardSlash = (ForwardSlashPunctuationSyntaxToken) parameters["forwardSlash"];
            FloatNumericPrimitiveToken divisor = (FloatNumericPrimitiveToken) parameters["divisor"];

            Phrase phrase = null;

            if (divisor.ToFloat() != 0.0F) {
                phrase = new Phrase() {
                    new FloatNumericPrimitiveToken() {
                        Value = dividend.ToFloat() / divisor.ToFloat(),
                        Text = String.Format("{0} {1} {2}", dividend.Text, forwardSlash.Text, divisor.Text),
                        Similarity = (dividend.Similarity + forwardSlash.Similarity + divisor.Similarity) / 3.0F
                    }
                };
            }
            else {
                // TODO: Create new token for exceptions
                phrase = new Phrase() {
                    new FloatNumericPrimitiveToken() {
                        Value = 0.0F,
                        Text = String.Format("{0} {1} {2}", dividend.Text, forwardSlash.Text, divisor.Text),
                        Similarity = (dividend.Similarity + forwardSlash.Similarity + divisor.Similarity) / 3.0F
                    }
                };
            }

            return phrase;
        }
Пример #3
0
        public static Phrase Parse(IFuzzyState state, Phrase phrase) {
            if (phrase.Text.Length > 0 && phrase.Text.First() == '"' && phrase.Text.Last() == '"' && phrase.Refactoring == false) {
                phrase.Add(new StringPrimitiveToken() {
                    Text = phrase.Text.Trim('"'),
                    Similarity = 80,
                    Value = phrase.Text.Trim('"')
                });
            }

            return phrase;
        }
        public static Phrase ReduceDateDate(IFuzzyState state, Dictionary<String, Token> parameters) {
            DateVariableTemporalPrimitiveToken dateA = (DateVariableTemporalPrimitiveToken) parameters["dateA"];
            DateVariableTemporalPrimitiveToken dateB = (DateVariableTemporalPrimitiveToken) parameters["dateB"];

            return new Phrase() {
                new DateVariableTemporalPrimitiveToken() {
                    Pattern = dateA.Pattern + dateB.Pattern,
                    Text = String.Format("{0} {1}", dateA.Text, dateB.Text),
                    Similarity = (dateA.Similarity + dateB.Similarity) / 2.0F
                }
            };
        }
Пример #5
0
        public static Phrase ReduceNumberNumber(IFuzzyState state, Dictionary<String, Token> parameters) {
            FloatNumericPrimitiveToken addend1 = (FloatNumericPrimitiveToken) parameters["addend1"];
            FloatNumericPrimitiveToken addend2 = (FloatNumericPrimitiveToken) parameters["addend2"];

            return new Phrase() {
                new FloatNumericPrimitiveToken() {
                    Value = addend1.ToFloat() + addend2.ToFloat(),
                    Text = String.Format("{0} {1}", addend1.Text, addend2.Text),
                    Similarity = (addend1.Similarity + addend2.Similarity) / 2.0F
                }
            };
        }
Пример #6
0
        public static Phrase CombineThingThing(IFuzzyState state, Dictionary<String, Token> parameters) {
            ThingObjectToken thing1 = (ThingObjectToken)parameters["thing1"];
            ThingObjectToken thing2 = (ThingObjectToken)parameters["thing2"];

            return new Phrase() {
                new ThingObjectToken() {
                    Reference = thing1.Reference.Union(thing2.Reference),
                    Text = String.Format("{0} {1}", thing1.Text, thing2.Text),
                    Similarity = (thing1.Similarity + thing2.Similarity) / 2.0F
                }
            };
        }
        public new static Phrase Parse(IFuzzyState state, Phrase phrase) {
            List<SelfReflectionThingObjectToken> createdTokens = null;
            TokenReflection.CreateDescendants(state, phrase, out createdTokens);

            if (createdTokens != null && createdTokens.Count > 0) {
                foreach (SelfReflectionThingObjectToken self in createdTokens) {
                    state.ParseSelfReflectionThing(state, self);
                }
            }

            return phrase;
        }
Пример #8
0
        public static Phrase ReduceMultiplierMultiplicand(IFuzzyState state, Dictionary<String, Token> parameters) {
            FloatNumericPrimitiveToken multiplier = (FloatNumericPrimitiveToken) parameters["multiplier"];
            MultiplicandCardinalNumericPrimitiveToken multiplicand = (MultiplicandCardinalNumericPrimitiveToken) parameters["multiplicand"];

            return new Phrase() {
                new FloatNumericPrimitiveToken() {
                    Value = multiplier.ToFloat() * multiplicand.ToFloat(),
                    Text = String.Format("{0} {1}", multiplier.Text, multiplicand.Text),
                    Similarity = (multiplier.Similarity + multiplicand.Similarity) / 2.0F
                }
            };
        }
        public static Phrase ReduceTimeTime(IFuzzyState state, Dictionary<String, Token> parameters) {
            TimeVariableTemporalPrimitiveToken timeA = (TimeVariableTemporalPrimitiveToken) parameters["timeA"];
            TimeVariableTemporalPrimitiveToken timeB = (TimeVariableTemporalPrimitiveToken) parameters["timeB"];

            return new Phrase() {
                new TimeVariableTemporalPrimitiveToken() {
                    Pattern = timeA.Pattern + timeB.Pattern,
                    Text = String.Format("{0} {1}", timeA.Text, timeB.Text),
                    Similarity = (timeA.Similarity + timeB.Similarity) / 2.0F
                }
            };
        }
        public static Phrase ReduceNumberPlusNumber(IFuzzyState state, Dictionary<String, Token> parameters) {
            FloatNumericPrimitiveToken addend1 = (FloatNumericPrimitiveToken) parameters["addend1"];
            PlusTypographySyntaxToken plus = (PlusTypographySyntaxToken) parameters["plus"];
            FloatNumericPrimitiveToken addend2 = (FloatNumericPrimitiveToken) parameters["addend2"];

            return new Phrase() {
                new FloatNumericPrimitiveToken() {
                    Value = addend1.ToFloat() + addend2.ToFloat(),
                    Text = String.Format("{0} {1} {2}", addend1.Text, plus.Text, addend2.Text),
                    Similarity = (addend1.Similarity + plus.Similarity + addend2.Similarity) / 3.0F
                }
            };
        }
Пример #11
0
        public static Phrase ReduceOpenParenthesesNumberClosedParentheses(IFuzzyState state, Dictionary<String, Token> parameters) {
            OpenParenthesesPunctuationSyntaxToken open = (OpenParenthesesPunctuationSyntaxToken) parameters["open"];
            FloatNumericPrimitiveToken number = (FloatNumericPrimitiveToken) parameters["number"];
            ClosedParenthesesPunctuationSyntaxToken closed = (ClosedParenthesesPunctuationSyntaxToken) parameters["closed"];

            return new Phrase() {
                new FloatNumericPrimitiveToken() {
                    Value = number.ToFloat(),
                    Text = String.Format("{0} {1} {2}", open.Text, number.Text, closed.Text),
                    Similarity = (open.Similarity + number.Similarity + closed.Similarity) / 3.0F
                }
            };
        }
        public static Phrase ReduceMultiplierAsteriskMultiplicand(IFuzzyState state, Dictionary<String, Token> parameters) {
            FloatNumericPrimitiveToken multiplier = (FloatNumericPrimitiveToken) parameters["multiplier"];
            AsteriskTypographySyntaxToken asterisk = (AsteriskTypographySyntaxToken) parameters["asterisk"];
            FloatNumericPrimitiveToken multiplicand = (FloatNumericPrimitiveToken) parameters["multiplicand"];

            return new Phrase() {
                new FloatNumericPrimitiveToken() {
                    Value = multiplier.ToFloat() * multiplicand.ToFloat(),
                    Text = String.Format("{0} {1} {2}", multiplier.Text, asterisk.Text, multiplicand.Text),
                    Similarity = (multiplier.Similarity + asterisk.Similarity + multiplicand.Similarity) / 3.0F
                }
            };
        }
Пример #13
0
        public static Phrase CombineThingAndThing(IFuzzyState state, Dictionary<String, Token> parameters) {
            ThingObjectToken thing1 = (ThingObjectToken)parameters["thing1"];
            AndLogicalOperatorToken and = (AndLogicalOperatorToken)parameters["and"];
            ThingObjectToken thing2 = (ThingObjectToken)parameters["thing2"];

            return new Phrase() {
                new ThingObjectToken() {
                    Reference = thing1.Reference.Union(thing2.Reference),
                    Text = String.Format("{0} {1} {2}", thing1.Text, and.Text, thing2.Text),
                    Similarity = (thing1.Similarity + and.Similarity + thing2.Similarity) / 3.0F
                }
            };
        }
        public static Phrase ReduceMultiplierCaretMultiplicand(IFuzzyState state, Dictionary<String, Token> parameters) {
            FloatNumericPrimitiveToken multiplier = (FloatNumericPrimitiveToken) parameters["multiplier"];
            CaretTypographySyntaxToken caret = (CaretTypographySyntaxToken) parameters["caret"];
            FloatNumericPrimitiveToken multiplicand = (FloatNumericPrimitiveToken) parameters["multiplicand"];

            return new Phrase() {
                new FloatNumericPrimitiveToken() {
                    Value = (float) Math.Pow(multiplier.ToFloat(), multiplicand.ToFloat()),
                    Text = String.Format("{0} {1} {2}", multiplier.Text, caret.Text, multiplicand.Text),
                    Similarity = (multiplier.Similarity + caret.Similarity + multiplicand.Similarity) / 3.0F
                }
            };
        }
        public static Phrase ReduceNumberHyphenNumber(IFuzzyState state, Dictionary<String, Token> parameters) {
            FloatNumericPrimitiveToken minuend = (FloatNumericPrimitiveToken) parameters["minuend"];
            HyphenPunctuationSyntaxToken hyphen = (HyphenPunctuationSyntaxToken) parameters["hyphen"];
            FloatNumericPrimitiveToken subtrahend = (FloatNumericPrimitiveToken) parameters["subtrahend"];

            return new Phrase() {
                new FloatNumericPrimitiveToken() {
                    Value = minuend.ToFloat() - subtrahend.ToFloat(),
                    Text = String.Format("{0} {1} {2}", minuend.Text, hyphen.Text, subtrahend.Text),
                    Similarity = (minuend.Similarity + hyphen.Similarity + subtrahend.Similarity) / 3.0F
                }
            };
        }
        public static Phrase ReduceOnDate(IFuzzyState state, Dictionary<String, Token> parameters) {
            OnPrepositionsSyntaxToken on = (OnPrepositionsSyntaxToken) parameters["on"];
            DateVariableTemporalPrimitiveToken date = (DateVariableTemporalPrimitiveToken) parameters["date"];

            FuzzyDateTimePattern pattern = date.Pattern;
            pattern.Modifier = TimeModifier.Delay;

            return new Phrase() {
                new DateVariableTemporalPrimitiveToken() {
                    Pattern = pattern,
                    Text = String.Format("{0} {1}", on.Text, date.Text),
                    Similarity = (on.Similarity + date.Similarity) / 2.0F
                }
            };
        }
        public static Phrase ReduceOrdinalMonths(IFuzzyState state, Dictionary<String, Token> parameters) {
            OrdinalNumericPrimitiveToken ordinal = (OrdinalNumericPrimitiveToken) parameters["ordinal"];
            MonthMonthsVariableTemporalPrimitiveToken months = (MonthMonthsVariableTemporalPrimitiveToken) parameters["months"];

            FuzzyDateTimePattern pattern = months.Pattern;
            pattern.Day = (int) ordinal.ToFloat().ConvertTo(typeof (int));

            return new Phrase() {
                new MonthVariableTemporalPrimitiveToken() {
                    Pattern = pattern,
                    Text = String.Format("{0} {1}", ordinal.Text, months.Text),
                    Similarity = (months.Similarity + ordinal.Similarity) / 2.0F
                }
            };
        }
        public static Phrase ReduceNextMonths(IFuzzyState state, Dictionary<String, Token> parameters) {
            NextAdjectiveSyntaxToken next = (NextAdjectiveSyntaxToken) parameters["next"];
            MonthsUnitTemporalPrimitiveToken months = (MonthsUnitTemporalPrimitiveToken) parameters["months"];

            return new Phrase() {
                new MonthVariableTemporalPrimitiveToken() {
                    Pattern = new FuzzyDateTimePattern() {
                        Rule = TimeType.Relative,
                        Month = 1
                    },
                    Text = String.Format("{0} {1}", next.Text, months.Text),
                    Similarity = (months.Similarity + next.Similarity) / 2.0F
                }
            };
        }
        public static Phrase ReduceNumberHours(IFuzzyState state, Dictionary<String, Token> parameters) {
            FloatNumericPrimitiveToken number = (FloatNumericPrimitiveToken) parameters["number"];
            HoursUnitTemporalPrimitiveToken hours = (HoursUnitTemporalPrimitiveToken) parameters["hours"];

            return new Phrase() {
                new HourVariableTemporalPrimitiveToken() {
                    Pattern = new FuzzyDateTimePattern() {
                        Rule = TimeType.Relative,
                        Hour = (int) number.ToFloat().ConvertTo(typeof (int))
                    },
                    Text = String.Format("{0} {1}", number.Text, hours.Text),
                    Similarity = (hours.Similarity + number.Similarity) / 2.0F
                }
            };
        }
        public static Phrase ReduceArticleHours(IFuzzyState state, Dictionary<String, Token> parameters) {
            IndefiniteArticlesSyntaxToken article = (IndefiniteArticlesSyntaxToken) parameters["article"];
            HoursUnitTemporalPrimitiveToken hours = (HoursUnitTemporalPrimitiveToken) parameters["hours"];

            return new Phrase() {
                new HourVariableTemporalPrimitiveToken() {
                    Pattern = new FuzzyDateTimePattern() {
                        Rule = TimeType.Relative,
                        Hour = 1
                    },
                    Text = String.Format("{0} {1}", article.Text, hours.Text),
                    Similarity = (hours.Similarity + article.Similarity) / 2.0F
                }
            };
        }
        public static Phrase ReduceNumberMonths(IFuzzyState state, Dictionary<String, Token> parameters) {
            FloatNumericPrimitiveToken number = (FloatNumericPrimitiveToken) parameters["number"];
            MonthsUnitTemporalPrimitiveToken months = (MonthsUnitTemporalPrimitiveToken) parameters["months"];

            return new Phrase() {
                new MonthVariableTemporalPrimitiveToken() {
                    Pattern = new FuzzyDateTimePattern() {
                        Rule = TimeType.Relative, // Rule = TimeType.Definitive,
                        Month = (int) number.ToFloat().ConvertTo(typeof (int))
                    },
                    Text = String.Format("{0} {1}", number.Text, months.Text),
                    Similarity = (months.Similarity + number.Similarity) / 2.0F
                }
            };
        }
        public static Phrase ReduceArticleWeeks(IFuzzyState state, Dictionary<String, Token> parameters) {
            IndefiniteArticlesSyntaxToken article = (IndefiniteArticlesSyntaxToken) parameters["article"];
            WeeksUnitTemporalPrimitiveToken weeks = (WeeksUnitTemporalPrimitiveToken) parameters["weeks"];

            return new Phrase() {
                new DayVariableTemporalPrimitiveToken() {
                    Pattern = new FuzzyDateTimePattern() {
                        Rule = TimeType.Relative,
                        Day = 7
                    },
                    Text = String.Format("{0} {1}", article.Text, weeks.Text),
                    Similarity = (weeks.Similarity + article.Similarity) / 2.0F
                }
            };
        }
        public static Phrase ReduceEveryHours(IFuzzyState state, Dictionary<String, Token> parameters) {
            EveryAdjectiveSyntaxToken every = (EveryAdjectiveSyntaxToken) parameters["every"];
            HoursUnitTemporalPrimitiveToken hours = (HoursUnitTemporalPrimitiveToken) parameters["hours"];

            return new Phrase() {
                new HourVariableTemporalPrimitiveToken() {
                    Pattern = new FuzzyDateTimePattern() {
                        Rule = TimeType.Relative,
                        Modifier = TimeModifier.Interval,
                        Hour = 1
                    },
                    Text = String.Format("{0} {1}", every.Text, hours.Text),
                    Similarity = (hours.Similarity + every.Similarity) / 2.0F
                }
            };
        }
        public static Phrase ReduceEverySeconds(IFuzzyState state, Dictionary<String, Token> parameters) {
            EveryAdjectiveSyntaxToken every = (EveryAdjectiveSyntaxToken) parameters["every"];
            SecondsUnitTemporalPrimitiveToken seconds = (SecondsUnitTemporalPrimitiveToken) parameters["seconds"];

            return new Phrase() {
                new SecondsUnitTemporalPrimitiveToken() {
                    Pattern = new FuzzyDateTimePattern() {
                        Rule = TimeType.Relative,
                        Modifier = TimeModifier.Interval,
                        Second = 1
                    },
                    Text = String.Format("{0} {1}", every.Text, seconds.Text),
                    Similarity = (seconds.Similarity + every.Similarity) / 2.0F
                }
            };
        }
        public static Phrase ReduceDateTimeAdditionDateTime(IFuzzyState state, Dictionary<String, Token> parameters) {
            DateTimeTemporalPrimitiveToken dateTimeA = (DateTimeTemporalPrimitiveToken) parameters["dateTimeA"];
            AdditionThirdOrderArithmeticOperatorToken addition = (AdditionThirdOrderArithmeticOperatorToken) parameters["addition"];
            DateTimeTemporalPrimitiveToken dateTimeB = (DateTimeTemporalPrimitiveToken) parameters["dateTimeB"];

            AndLogicalOperatorToken and = new AndLogicalOperatorToken() {
                Text = addition.Text,
                Similarity = addition.Similarity
            };

            return DateTimeTemporalPrimitiveToken.ReduceDateTimeAndDateTime(state, new Dictionary<String, Token>() {
                {"dateTimeA", dateTimeA},
                {"and", and},
                {"dateTimeB", dateTimeB}
            });
        }
Пример #26
0
        public static Phrase CombineThingPropertyEqualityNumber(IFuzzyState state, Dictionary<String, Token> parameters) {
            ThingObjectToken thing = (ThingObjectToken)parameters["thing"];
            NumericPropertyObjectToken property = (NumericPropertyObjectToken)parameters["property"];
            EqualityLogicalOperatorToken equality = (EqualityLogicalOperatorToken)parameters["equality"];
            FloatNumericPrimitiveToken number = (FloatNumericPrimitiveToken)parameters["number"];

            property.Reference.RemoveAll(thing.Reference, equality, number);

            return new Phrase() {
                new ThingObjectToken() {
                    Reference = thing.Reference,
                    Text = String.Format("{0} {1} {2} {3}", thing.Text, property.Text, equality.Text, number.Text),
                    Similarity = (thing.Similarity + property.Similarity + equality.Similarity + number.Similarity) / 4.0F
                }
            };
        }
        public static Phrase ReduceMultiplierMultiplyMultiplicand(IFuzzyState state, Dictionary<String, Token> parameters) {
            FloatNumericPrimitiveToken multiplier = (FloatNumericPrimitiveToken) parameters["multiplier"];
            MultiplicationSecondOrderArithmeticToken multiply = (MultiplicationSecondOrderArithmeticToken) parameters["multiply"];
            FloatNumericPrimitiveToken multiplicand = (FloatNumericPrimitiveToken) parameters["multiplicand"];

            AsteriskTypographySyntaxToken asterisk = new AsteriskTypographySyntaxToken() {
                Text = multiply.Text,
                Similarity = multiply.Similarity
            };

            return MultiplicationSecondOrderArithmeticToken.ReduceMultiplierAsteriskMultiplicand(state, new Dictionary<String, Token>() {
                {"multiplier", multiplier},
                {"asterisk", asterisk},
                {"multiplicand", multiplicand}
            });
        }
        public static Phrase ReduceDividendDivideDivisor(IFuzzyState state, Dictionary<String, Token> parameters) {
            FloatNumericPrimitiveToken dividend = (FloatNumericPrimitiveToken) parameters["dividend"];
            DivisionSecondOrderArithmeticToken divide = (DivisionSecondOrderArithmeticToken) parameters["divide"];
            FloatNumericPrimitiveToken divisor = (FloatNumericPrimitiveToken) parameters["divisor"];

            ForwardSlashPunctuationSyntaxToken forwardSlash = new ForwardSlashPunctuationSyntaxToken() {
                Text = divide.Text,
                Similarity = divide.Similarity
            };

            return DivisionSecondOrderArithmeticToken.ReduceDividendForwardSlashDivisor(state, new Dictionary<String, Token>() {
                {"dividend", dividend},
                {"forwardSlash", forwardSlash},
                {"divisor", divisor}
            });
        }
        public static Phrase ReduceNumberSubtractionNumber(IFuzzyState state, Dictionary<String, Token> parameters) {
            FloatNumericPrimitiveToken minuend = (FloatNumericPrimitiveToken) parameters["minuend"];
            SubtractionThirdOrderArithmeticOperatorToken subtraction = (SubtractionThirdOrderArithmeticOperatorToken) parameters["subtraction"];
            FloatNumericPrimitiveToken subtrahend = (FloatNumericPrimitiveToken) parameters["subtrahend"];

            HyphenPunctuationSyntaxToken hyphen = new HyphenPunctuationSyntaxToken() {
                Text = subtraction.Text,
                Similarity = subtraction.Similarity
            };

            return SubtractionThirdOrderArithmeticOperatorToken.ReduceNumberHyphenNumber(state, new Dictionary<String, Token>() {
                {"minuend", minuend},
                {"hyphen", hyphen},
                {"subtrahend", subtrahend}
            });
        }
        public static Phrase ReduceNumberAdditionNumber(IFuzzyState state, Dictionary<String, Token> parameters) {
            FloatNumericPrimitiveToken addend1 = (FloatNumericPrimitiveToken) parameters["addend1"];
            AdditionThirdOrderArithmeticOperatorToken addition = (AdditionThirdOrderArithmeticOperatorToken) parameters["addition"];
            FloatNumericPrimitiveToken addend2 = (FloatNumericPrimitiveToken) parameters["addend2"];

            PlusTypographySyntaxToken plus = new PlusTypographySyntaxToken() {
                Text = addition.Text,
                Similarity = addition.Similarity
            };

            return AdditionThirdOrderArithmeticOperatorToken.ReduceNumberPlusNumber(state, new Dictionary<String, Token>() {
                {"addend1", addend1},
                {"plus", plus},
                {"addend2", addend2}
            });
        }