Esempio n. 1
0
        public bool GetMatchedTimeRange(string text, out string timex, out int beginHour, out int endHour, out int endMin)
        {
            var trimmedText = text.Trim();
            var pluralMatch = PluralTokenRegex.MatchBegin(trimmedText, trim: true);

            if (pluralMatch.Success)
            {
                trimmedText = trimmedText.Substring(pluralMatch.Length).Trim();
            }

            beginHour = 0;
            endHour   = 0;
            endMin    = 0;

            var timeOfDay = string.Empty;

            if (DateTimeDefinitions.MorningTermList.Any(o => trimmedText.StartsWith(o, StringComparison.InvariantCulture)))
            {
                timeOfDay = Constants.Morning;
            }
            else if (DateTimeDefinitions.AfternoonTermList.Any(o => trimmedText.StartsWith(o, StringComparison.InvariantCulture)))
            {
                timeOfDay = Constants.Afternoon;
            }
            else if (DateTimeDefinitions.EveningTermList.Any(o => trimmedText.StartsWith(o, StringComparison.InvariantCulture)))
            {
                timeOfDay = Constants.Evening;
            }
            else if (DateTimeDefinitions.DaytimeTermList.Any(o => trimmedText.Equals(o, StringComparison.InvariantCulture)))
            {
                timeOfDay = Constants.Daytime;
            }
            else if (DateTimeDefinitions.NightTermList.Any(o => trimmedText.StartsWith(o, StringComparison.InvariantCulture)))
            {
                timeOfDay = Constants.Night;
            }
            else if (DateTimeDefinitions.BusinessHourSplitStrings.Any(o => trimmedText.Contains(o)))
            {
                timeOfDay = Constants.BusinessHour;
            }
            else
            {
                timex = null;
                return(false);
            }

            var parseResult = TimexUtility.ResolveTimeOfDay(timeOfDay);

            timex     = parseResult.Timex;
            beginHour = parseResult.BeginHour;
            endHour   = parseResult.EndHour;
            endMin    = parseResult.EndMin;

            return(true);
        }
Esempio n. 2
0
        public bool GetMatchedTimexRange(string text, out string timex, out int beginHour, out int endHour, out int endMin)
        {
            var trimmedText = text.Trim().ToLowerInvariant();

            if (trimmedText.EndsWith("s"))
            {
                trimmedText = trimmedText.Substring(0, trimmedText.Length - 1);
            }

            beginHour = 0;
            endHour   = 0;
            endMin    = 0;

            var timeOfDay = "";

            if (trimmedText.EndsWith(DateTimeDefinitions.Morning))
            {
                timeOfDay = Constants.Morning;
            }
            else if (trimmedText.EndsWith(DateTimeDefinitions.Afternoon))
            {
                timeOfDay = Constants.Afternoon;
            }
            else if (trimmedText.EndsWith(DateTimeDefinitions.Evening))
            {
                timeOfDay = Constants.Evening;
            }
            else if (trimmedText.Equals(DateTimeDefinitions.Daytime))
            {
                timeOfDay = Constants.Daytime;
            }
            else if (trimmedText.EndsWith(DateTimeDefinitions.Night))
            {
                timeOfDay = Constants.Night;
            }
            else if (DateTimeDefinitions.BusinessHourSplitStrings.All(o => trimmedText.Contains(o)))
            {
                timeOfDay = Constants.BusinessHour;
            }
            else
            {
                timex = null;
                return(false);
            }

            var parseResult = TimexUtility.ParseTimeOfDay(timeOfDay);

            timex     = parseResult.Timex;
            beginHour = parseResult.BeginHour;
            endHour   = parseResult.EndHour;
            endMin    = parseResult.EndMin;

            return(true);
        }
        public bool GetMatchedDailyTimex(string text, out string timex)
        {
            var trimmedText = text.Trim().Normalized(DateTimeDefinitions.SpecialCharactersEquivalent);

            float  durationLength = 1; // Default value
            float  multiplier     = 1;
            string durationType;

            if (DayTypeRegex.IsMatch(trimmedText))
            {
                durationType = Constants.TimexDay;
            }
            else if (WeekTypeRegex.IsMatch(trimmedText))
            {
                durationType = Constants.TimexWeek;
            }
            else if (BiWeekTypeRegex.IsMatch(trimmedText))
            {
                durationType = Constants.TimexWeek;
                multiplier   = 2;
            }
            else if (MonthTypeRegex.IsMatch(trimmedText))
            {
                durationType = Constants.TimexMonth;
            }
            else if (BiMonthTypeRegex.IsMatch(trimmedText))
            {
                durationType = Constants.TimexMonth;
                multiplier   = 2;
            }
            else if (QuarterTypeRegex.IsMatch(trimmedText))
            {
                durationType = Constants.TimexMonth;
                multiplier   = 3;
            }
            else if (SemiAnnualTypeRegex.IsMatch(trimmedText))
            {
                durationType = Constants.TimexYear;
                multiplier   = 0.5f;
            }
            else if (YearTypeRegex.IsMatch(trimmedText))
            {
                durationType = Constants.TimexYear;
            }
            else
            {
                timex = null;
                return(false);
            }

            timex = TimexUtility.GenerateSetTimex(durationType, durationLength, multiplier);

            return(true);
        }
        public bool GetMatchedTimexRange(string text, out string timex, out int beginHour, out int endHour, out int endMin)
        {
            var trimmedText = text.Trim();

            if (PluralTokenRegex.IsMatch(trimmedText))
            {
                trimmedText = trimmedText.Substring(0, trimmedText.Length - 4);
            }

            beginHour = 0;
            endHour   = 0;
            endMin    = 0;

            var timeOfDay = string.Empty;

            if (DateTimeDefinitions.MorningTermList.Any(o => trimmedText.EndsWith(o)))
            {
                timeOfDay = Constants.Morning;
            }
            else if (DateTimeDefinitions.AfternoonTermList.Any(o => trimmedText.EndsWith(o)))
            {
                timeOfDay = Constants.Afternoon;
            }
            else if (DateTimeDefinitions.EveningTermList.Any(o => trimmedText.EndsWith(o)))
            {
                timeOfDay = Constants.Evening;
            }
            else if (DateTimeDefinitions.DaytimeTermList.Any(o => trimmedText.Equals(o)))
            {
                timeOfDay = Constants.Daytime;
            }
            else if (DateTimeDefinitions.NightTermList.Any(o => trimmedText.EndsWith(o)))
            {
                timeOfDay = Constants.Night;
            }
            else if (DateTimeDefinitions.BusinessHourSplitStrings.All(o => trimmedText.Contains(o)))
            {
                timeOfDay = Constants.BusinessHour;
            }
            else
            {
                timex = null;
                return(false);
            }

            var parseResult = TimexUtility.ParseTimeOfDay(timeOfDay);

            timex     = parseResult.Timex;
            beginHour = parseResult.BeginHour;
            endHour   = parseResult.EndHour;
            endMin    = parseResult.EndMin;

            return(true);
        }
Esempio n. 5
0
        public bool GetMatchedDailyTimex(string text, out string timex)
        {
            var trimmedText = text.Trim();

            float  durationLength = 1; // Default value
            float  multiplier     = 1;
            string durationType;

            if (DoubleMultiplierRegex.IsMatch(trimmedText))
            {
                multiplier = 2;
            }
            else if (HalfMultiplierRegex.IsMatch(trimmedText))
            {
                multiplier = 0.5f;
            }

            if (DayTypeRegex.IsMatch(trimmedText))
            {
                durationType = "D";
            }
            else if (WeekTypeRegex.IsMatch(trimmedText))
            {
                durationType = "W";
            }
            else if (WeekendTypeRegex.IsMatch(trimmedText))
            {
                durationType = "WE";
            }
            else if (MonthTypeRegex.IsMatch(trimmedText))
            {
                durationType = "M";
            }
            else if (QuarterTypeRegex.IsMatch(trimmedText))
            {
                durationLength = 3;
                durationType   = "M";
            }
            else if (YearTypeRegex.IsMatch(trimmedText))
            {
                durationType = "Y";
            }
            else
            {
                timex = null;
                return(false);
            }

            timex = TimexUtility.GenerateSetTimex(durationType, durationLength, multiplier);

            return(true);
        }
        public DateTimeParseResult Parse(ExtractResult er, DateObject refDate)
        {
            var referenceTime = refDate;

            var dateTimeParseResult = ParseMergedDuration(er.Text, referenceTime);

            if (!dateTimeParseResult.Success)
            {
                var parseResult = InternalParser.Parse(er);
                var unitResult  = parseResult.Value as UnitValue;

                if (unitResult == null)
                {
                    return(null);
                }

                var unitStr = unitResult.Unit;
                var numStr  = unitResult.Number;

                dateTimeParseResult.Timex       = TimexUtility.GenerateDurationTimex(double.Parse(numStr), unitStr, BaseDurationParser.IsLessThanDay(unitStr));
                dateTimeParseResult.FutureValue = dateTimeParseResult.PastValue = double.Parse(numStr) * UnitValueMap[unitStr];
                dateTimeParseResult.Success     = true;
            }

            if (dateTimeParseResult.Success)
            {
                dateTimeParseResult.FutureResolution = new Dictionary <string, string>
                {
                    { TimeTypeConstants.DURATION, dateTimeParseResult.FutureValue.ToString() },
                };

                dateTimeParseResult.PastResolution = new Dictionary <string, string>
                {
                    { TimeTypeConstants.DURATION, dateTimeParseResult.PastValue.ToString() },
                };
            }

            var ret = new DateTimeParseResult
            {
                Text          = er.Text,
                Start         = er.Start,
                Length        = er.Length,
                Type          = er.Type,
                Data          = er.Data,
                Value         = dateTimeParseResult,
                TimexStr      = dateTimeParseResult.Timex,
                ResolutionStr = string.Empty,
            };

            return(ret);
        }
Esempio n. 7
0
        public bool GetMatchedTimexRange(string text, out string timex, out int beginHour, out int endHour, out int endMin)
        {
            var trimmedText = text.Trim();

            if (trimmedText.EndsWith("s", StringComparison.Ordinal))
            {
                trimmedText = trimmedText.Substring(0, trimmedText.Length - 1);
            }

            beginHour = 0;
            endHour   = 0;
            endMin    = 0;

            var timeOfDay = string.Empty;

            if (DateTimeDefinitions.MorningTermList.Any(o => trimmedText.EndsWith(o, StringComparison.Ordinal)))
            {
                timeOfDay = Constants.Morning;
            }
            else if (DateTimeDefinitions.AfternoonTermList.Any(o => trimmedText.EndsWith(o, StringComparison.Ordinal)))
            {
                timeOfDay = Constants.Afternoon;
            }
            else if (DateTimeDefinitions.EveningTermList.Any(o => trimmedText.EndsWith(o, StringComparison.Ordinal)))
            {
                timeOfDay = Constants.Evening;
            }
            else if (DateTimeDefinitions.DaytimeTermList.Any(o => trimmedText.Equals(o, StringComparison.Ordinal)))
            {
                timeOfDay = Constants.Daytime;
            }
            else if (DateTimeDefinitions.NightTermList.Any(o => trimmedText.EndsWith(o, StringComparison.Ordinal)))
            {
                timeOfDay = Constants.Night;
            }
            else
            {
                timex = null;
                return(false);
            }

            var parseResult = TimexUtility.ParseTimeOfDay(timeOfDay);

            timex     = parseResult.Timex;
            beginHour = parseResult.BeginHour;
            endHour   = parseResult.EndHour;
            endMin    = parseResult.EndMin;

            return(true);
        }
Esempio n. 8
0
        private bool GetMatchedTimexRange(string text, out string timex, out int beginHour, out int endHour, out int endMin)
        {
            var trimmedText = text.Trim();

            beginHour = 0;
            endHour   = 0;
            endMin    = 0;

            var timeOfDay = "";

            if (DateTimeDefinitions.MorningTermList.Any(o => trimmedText.EndsWith(o)))
            {
                timeOfDay = Constants.Morning;
            }
            else if (DateTimeDefinitions.AfternoonTermList.Any(o => trimmedText.EndsWith(o)))
            {
                timeOfDay = Constants.Afternoon;
            }
            else if (DateTimeDefinitions.EveningTermList.Any(o => trimmedText.EndsWith(o)))
            {
                timeOfDay = Constants.Evening;
            }
            else if (DateTimeDefinitions.DaytimeTermList.Any(o => trimmedText.Equals(o)))
            {
                timeOfDay = Constants.Daytime;
            }
            else if (DateTimeDefinitions.NightTermList.Any(o => trimmedText.EndsWith(o)))
            {
                timeOfDay = Constants.Night;
            }
            else
            {
                timex = null;
                return(false);
            }

            var parseResult = TimexUtility.ParseTimeOfDay(timeOfDay);

            timex     = parseResult.Timex;
            beginHour = parseResult.BeginHour;
            endHour   = parseResult.EndHour;
            endMin    = parseResult.EndMin;

            return(true);
        }
        public bool GetMatchedTimeRange(string text, out string todSymbol, out int beginHour, out int endHour, out int endMin)
        {
            var trimmedText = text.Trim().Normalized(DateTimeDefinitions.SpecialCharactersEquivalent);

            beginHour = 0;
            endHour   = 0;
            endMin    = 0;

            // @TODO move hardcoded values to resources file
            if (trimmedText.EndsWith("madrugada", StringComparison.Ordinal))
            {
                todSymbol = Constants.EarlyMorning;
            }
            else if (trimmedText.EndsWith("manha", StringComparison.Ordinal))
            {
                todSymbol = Constants.Morning;
            }
            else if (trimmedText.Contains("passado o meio dia") || trimmedText.Contains("depois do meio dia"))
            {
                todSymbol = Constants.Afternoon;
            }
            else if (trimmedText.EndsWith("tarde", StringComparison.Ordinal))
            {
                todSymbol = Constants.Evening;
            }
            else if (trimmedText.EndsWith("noite", StringComparison.Ordinal))
            {
                todSymbol = Constants.Night;
            }
            else
            {
                todSymbol = null;
                return(false);
            }

            var parseResult = TimexUtility.ResolveTimeOfDay(todSymbol);

            todSymbol = parseResult.Timex;
            beginHour = parseResult.BeginHour;
            endHour   = parseResult.EndHour;
            endMin    = parseResult.EndMin;

            return(true);
        }
        public bool GetMatchedTimeRange(string text, out string todSymbol, out int beginHour, out int endHour, out int endMin)
        {
            var trimmedText = text.Trim();

            beginHour = 0;
            endHour   = 0;
            endMin    = 0;

            if (EarlyMorningStartEndRegex.IsMatch(trimmedText))
            {
                todSymbol = Constants.EarlyMorning;
            }
            else if (AfternoonStartEndRegex.IsMatch(trimmedText))
            {
                todSymbol = Constants.Afternoon;
            }
            else if (EveningStartEndRegex.IsMatch(trimmedText))
            {
                todSymbol = Constants.Evening;
            }
            else if (NightStartEndRegex.IsMatch(trimmedText))
            {
                todSymbol = Constants.Night;
            }
            else if (MorningStartEndRegex.IsMatch(trimmedText))
            {
                todSymbol = Constants.Morning;
            }
            else
            {
                todSymbol = null;
                return(false);
            }

            var parseResult = TimexUtility.ResolveTimeOfDay(todSymbol);

            todSymbol = parseResult.Timex;
            beginHour = parseResult.BeginHour;
            endHour   = parseResult.EndHour;
            endMin    = parseResult.EndMin;

            return(true);
        }
        public bool GetMatchedTimeRangeAndSwift(string text, out string todSymbol, out int beginHour, out int endHour, out int endMinute, out int swift)
        {
            var trimmedText = text.Trim();

            // @TODO move hardcoded values to resources file
            beginHour = 0;
            endHour   = 0;
            endMinute = 0;
            swift     = 0;

            var tod = string.Empty;

            switch (trimmedText)
            {
            case "今晚":
                swift = 0;
                tod   = Constants.Evening;
                break;

            case "今早":
            case "今晨":
                swift = 0;
                tod   = Constants.Morning;
                break;

            case "明晚":
                swift = 1;
                tod   = Constants.Evening;
                break;

            case "明早":
            case "明晨":
                swift = 1;
                tod   = Constants.Morning;
                break;

            case "昨晚":
                swift = -1;
                tod   = Constants.Evening;
                break;
            }

            if (MORegex.IsMatch(trimmedText))
            {
                tod = Constants.Morning;
            }
            else if (MIRegex.IsMatch(trimmedText))
            {
                tod = Constants.MidDay;
            }
            else if (AFRegex.IsMatch(trimmedText))
            {
                tod = Constants.Afternoon;
            }
            else if (EVRegex.IsMatch(trimmedText))
            {
                tod = Constants.Evening;
            }
            else if (NIRegex.IsMatch(trimmedText))
            {
                tod = Constants.Night;
            }
            else if (string.IsNullOrEmpty(tod))
            {
                todSymbol = null;
                return(false);
            }

            var parseResult = TimexUtility.ResolveTimeOfDay(tod);

            todSymbol = parseResult.Timex;
            beginHour = parseResult.BeginHour;
            endHour   = parseResult.EndHour;
            endMinute = parseResult.EndMin;

            return(true);
        }
        private DateTimeResolutionResult ParseMergedDuration(string text, DateObject referenceTime)
        {
            var ret = new DateTimeResolutionResult();
            var durationExtractor = DurationExtractor;

            // DurationExtractor without parameter will not extract merged duration
            var ers = durationExtractor.Extract(text, referenceTime);

            // only handle merged duration cases like "1 month 21 days"
            if (ers.Count <= 1)
            {
                ret.Success = false;
                return(ret);
            }

            var start = ers[0].Start ?? 0;

            if (start != 0)
            {
                var beforeStr = text.Substring(0, start - 1);
                if (!string.IsNullOrWhiteSpace(beforeStr))
                {
                    return(ret);
                }
            }

            var end = ers[ers.Count - 1].Start + ers[ers.Count - 1].Length ?? 0;

            if (end != text.Length)
            {
                var afterStr = text.Substring(end);
                if (!string.IsNullOrWhiteSpace(afterStr))
                {
                    return(ret);
                }
            }

            var prs       = new List <DateTimeParseResult>();
            var timexDict = new Dictionary <string, string>();

            // insert timex into a dictionary
            foreach (var er in ers)
            {
                var unitRegex = DurationUnitRegex;
                var unitMatch = unitRegex.Match(er.Text);
                if (unitMatch.Success)
                {
                    var pr = (DateTimeParseResult)Parse(er);
                    if (pr.Value != null)
                    {
                        timexDict.Add(UnitMap[unitMatch.Groups["unit"].Value], pr.TimexStr);
                        prs.Add(pr);
                    }
                }
            }

            // sort the timex using the granularity of the duration, "P1M23D" for "1 month 23 days" and "23 days 1 month"
            if (prs.Count == ers.Count)
            {
                ret.Timex = TimexUtility.GenerateCompoundDurationTimex(timexDict, UnitValueMap);

                double value = 0;
                foreach (var pr in prs)
                {
                    value += double.Parse(((DateTimeResolutionResult)pr.Value).FutureValue.ToString(), CultureInfo.InvariantCulture);
                }

                ret.FutureValue = ret.PastValue = value;
            }

            ret.Success = true;
            return(ret);
        }
Esempio n. 13
0
        public bool GetMatchedTimexRange(string text, out string timex, out int beginHour, out int endHour, out int endMin)
        {
            var trimmedText = text.Trim();

            beginHour = 0;
            endHour   = 0;
            endMin    = 0;

            var timeOfDay = string.Empty;

            if (DateTimeDefinitions.MorningTermList.Any(o => trimmedText.EndsWith(o, StringComparison.Ordinal)))
            {
                timeOfDay = Constants.Morning;
            }
            else if (DateTimeDefinitions.MidDayTermList.Any(o => trimmedText.EndsWith(o, StringComparison.Ordinal)))
            {
                timeOfDay = Constants.MidDay;
            }
            else if (DateTimeDefinitions.AfternoonTermList.Any(o => trimmedText.EndsWith(o, StringComparison.Ordinal)))
            {
                timeOfDay = Constants.Afternoon;
            }
            else if (DateTimeDefinitions.EveningTermList.Any(o => trimmedText.EndsWith(o, StringComparison.Ordinal)))
            {
                timeOfDay = Constants.Evening;
            }
            else if (DateTimeDefinitions.DaytimeTermList.Any(o => trimmedText.Equals(o, StringComparison.Ordinal)))
            {
                timeOfDay = Constants.Daytime;
            }
            else if (DateTimeDefinitions.NightTermList.Any(o => trimmedText.EndsWith(o, StringComparison.Ordinal)))
            {
                timeOfDay = Constants.Night;
            }
            else if (DateTimeDefinitions.BusinessHourTermList.Any(o => trimmedText.EndsWith(o, StringComparison.Ordinal)))
            {
                timeOfDay = Constants.BusinessHour;
            }
            else
            {
                timex = null;
                return(false);
            }

            var parseResult = TimexUtility.ResolveTimeOfDay(timeOfDay);

            timex     = parseResult.Timex;
            beginHour = parseResult.BeginHour;
            endHour   = parseResult.EndHour;
            endMin    = parseResult.EndMin;

            // Modify time period if "early"/"late" is present
            if (DateTimeDefinitions.EarlyHourTermList.Any(o => trimmedText.EndsWith(o, StringComparison.Ordinal)))
            {
                endHour = beginHour + Constants.HalfMidDayDurationHourCount;

                // Handling special case: night ends with 23:59.
                if (endMin == 59)
                {
                    endMin = 0;
                }
            }

            if (DateTimeDefinitions.LateHourTermList.Any(o => trimmedText.EndsWith(o, StringComparison.Ordinal)))
            {
                beginHour = beginHour + Constants.HalfMidDayDurationHourCount;
            }

            return(true);
        }
Esempio n. 14
0
        public bool GetMatchedTimeRange(string text, out string timex, out int beginHour, out int endHour, out int endMin)
        {
            var trimmedText = text.Trim();

            if (trimmedText.EndsWith("s", StringComparison.Ordinal))
            {
                trimmedText = trimmedText.Substring(0, trimmedText.Length - 1);
            }

            beginHour = 0;
            endHour   = 0;
            endMin    = 0;

            var timeOfDay = string.Empty;

            if (DateTimeDefinitions.MorningTermList.Any(o => trimmedText.EndsWith(o, StringComparison.Ordinal)))
            {
                timeOfDay = Constants.Morning;
            }
            else if (DateTimeDefinitions.AfternoonTermList.Any(o => trimmedText.EndsWith(o, StringComparison.Ordinal)))
            {
                timeOfDay = Constants.Afternoon;
            }
            else if (DateTimeDefinitions.EveningTermList.Any(o => trimmedText.EndsWith(o, StringComparison.Ordinal)))
            {
                timeOfDay = Constants.Evening;
            }
            else if (DateTimeDefinitions.DaytimeTermList.Any(o => trimmedText.EndsWith(o, StringComparison.Ordinal)))
            {
                timeOfDay = Constants.Daytime;
            }
            else if (DateTimeDefinitions.NighttimeTermList.Any(o => trimmedText.EndsWith(o, StringComparison.Ordinal)))
            {
                timeOfDay = Constants.Nighttime;
            }
            else if (DateTimeDefinitions.NightTermList.Any(o => trimmedText.EndsWith(o, StringComparison.Ordinal)))
            {
                timeOfDay = Constants.Night;
            }
            else if (DateTimeDefinitions.BusinessHourSplitStrings.All(o => trimmedText.Contains(o)))
            {
                timeOfDay = Constants.BusinessHour;
            }
            else if (DateTimeDefinitions.MealtimeBreakfastTermList.Any(o => trimmedText.Contains(o)))
            {
                timeOfDay = Constants.MealtimeBreakfast;
            }
            else if (DateTimeDefinitions.MealtimeBrunchTermList.Any(o => trimmedText.Contains(o)))
            {
                timeOfDay = Constants.MealtimeBrunch;
            }
            else if (DateTimeDefinitions.MealtimeLunchTermList.Any(o => trimmedText.Contains(o)))
            {
                timeOfDay = Constants.MealtimeLunch;
            }
            else if (DateTimeDefinitions.MealtimeDinnerTermList.Any(o => trimmedText.Contains(o)))
            {
                timeOfDay = Constants.MealtimeDinner;
            }
            else
            {
                timex = null;
                return(false);
            }

            var parseResult = TimexUtility.ResolveTimeOfDay(timeOfDay);

            timex     = parseResult.Timex;
            beginHour = parseResult.BeginHour;
            endHour   = parseResult.EndHour;
            endMin    = parseResult.EndMin;

            return(true);
        }