Skip to content

Commit

Permalink
Fix bugs in merging DateTime extractions and DateTimeRange (#821) (#828)
Browse files Browse the repository at this point in the history
  • Loading branch information
sanxing-chen authored and tellarin committed Aug 31, 2018
1 parent 9c7f6c8 commit 79f941d
Show file tree
Hide file tree
Showing 67 changed files with 889 additions and 812 deletions.
Expand Up @@ -101,22 +101,22 @@ protected DateTimeResolutionResult InnerParser(string text, DateObject reference
// parse if lunar contains
private static bool IsLunarCalendar(string text)
{
var trimedText = text.Trim();
var match = DateExtractorChs.LunarRegex.Match(trimedText);
var trimmedText = text.Trim();
var match = DateExtractorChs.LunarRegex.Match(trimmedText);

return match.Success;
}

// parse basic patterns in DateRegexList
protected DateTimeResolutionResult ParseBasicRegexMatch(string text, DateObject referenceDate)
{
var trimedText = text.Trim();
var trimmedText = text.Trim();
foreach (var regex in DateExtractorChs.DateRegexList)
{
const int offset = 0;
var match = regex.Match(trimedText);
var match = regex.Match(trimmedText);

if (match.Success && match.Index == offset && match.Length == trimedText.Length)
if (match.Success && match.Index == offset && match.Length == trimmedText.Length)
{
// LUIS value string will be set in Match2Date method
var ret = Match2Date(match, referenceDate);
Expand All @@ -131,13 +131,13 @@ protected DateTimeResolutionResult ParseBasicRegexMatch(string text, DateObject
// including '今天', '后天', '十三日'
protected DateTimeResolutionResult ParseImplicitDate(string text, DateObject referenceDate)
{
var trimedText = text.Trim();
var trimmedText = text.Trim();

var ret = new DateTimeResolutionResult();

// handle "十二日" "明年这个月三日" "本月十一日"
var match = DateExtractorChs.SpecialDate.Match(trimedText);
if (match.Success && match.Length == trimedText.Length)
var match = DateExtractorChs.SpecialDate.Match(trimmedText);
if (match.Success && match.Length == trimmedText.Length)
{
var yearStr = match.Groups["thisyear"].Value.ToLower();
var monthStr = match.Groups["thismonth"].Value.ToLower();
Expand Down Expand Up @@ -231,8 +231,8 @@ protected DateTimeResolutionResult ParseImplicitDate(string text, DateObject ref
}

// handle cases like "昨日", "明日", "大后天"
match = DateExtractorChs.SpecialDayRegex.Match(trimedText);
if (match.Success && match.Index == 0 && match.Length == trimedText.Length)
match = DateExtractorChs.SpecialDayRegex.Match(trimmedText);
if (match.Success && match.Index == 0 && match.Length == trimmedText.Length)
{
var value = referenceDate.AddDays(config.GetSwiftDay(match.Value.ToLower()));
ret.Timex = FormatUtil.LuisDate(value);
Expand Down Expand Up @@ -365,8 +365,8 @@ protected virtual DateTimeResolutionResult ParseWeekdayOfMonth(string text, Date
{
var ret = new DateTimeResolutionResult();

var trimedText = text.Trim().ToLowerInvariant();
var match = this.config.WeekDayOfMonthRegex.Match(trimedText);
var trimmedText = text.Trim().ToLowerInvariant();
var match = this.config.WeekDayOfMonthRegex.Match(trimmedText);
if (!match.Success)
{
return ret;
Expand All @@ -393,11 +393,11 @@ protected virtual DateTimeResolutionResult ParseWeekdayOfMonth(string text, Date
if (string.IsNullOrEmpty(monthStr))
{
var swift = 0;
if (trimedText.StartsWith(this.config.NextMonthToken))
if (trimmedText.StartsWith(this.config.NextMonthToken))
{
swift = 1;
}
else if (trimedText.StartsWith(this.config.LastMonthToken))
else if (trimmedText.StartsWith(this.config.LastMonthToken))
{
swift = -1;
}
Expand Down
Expand Up @@ -153,10 +153,11 @@ private DateTimeResolutionResult ParseSimpleCases(string text, DateObject refere
var noYear = false;
var inputYear = false;

var trimedText = text.Trim();
var match = DatePeriodExtractorChs.SimpleCasesRegex.Match(trimedText);
var trimmedText = text.Trim();
var match = DatePeriodExtractorChs.SimpleCasesRegex.Match(trimmedText);
string beginLuisStr, endLuisStr;
if (match.Success && match.Index == 0 && match.Length == trimedText.Length)

if (match.Success && match.Index == 0 && match.Length == trimmedText.Length)
{
var days = match.Groups["day"];
beginDay = this.config.DayOfMonth[days.Captures[0].Value.ToLower()];
Expand Down Expand Up @@ -426,12 +427,12 @@ private DateTimeResolutionResult ParseOneWordPeriod(string text, DateObject refe
int year = referenceDate.Year, month = referenceDate.Month;
int futureYear = year, pastYear = year;

var trimedText = text.Trim().ToLower();
var match = DatePeriodExtractorChs.OneWordPeriodRegex.Match(trimedText);
if (match.Success && match.Index == 0 && match.Length == trimedText.Length)
var trimmedText = text.Trim().ToLower();
var match = DatePeriodExtractorChs.OneWordPeriodRegex.Match(trimmedText);
if (match.Success && match.Index == 0 && match.Length == trimmedText.Length)
{
var monthStr = match.Groups["month"].Value;
if (trimedText.Equals("今年"))
if (trimmedText.Equals("今年"))
{
ret.Timex = referenceDate.Year.ToString("D4");
ret.FutureValue =
Expand All @@ -441,23 +442,23 @@ private DateTimeResolutionResult ParseOneWordPeriod(string text, DateObject refe
return ret;
}

var thismatch = DatePeriodExtractorChs.ThisRegex.Match(trimedText);
var nextmatch = DatePeriodExtractorChs.NextRegex.Match(trimedText);
var lastmatch = DatePeriodExtractorChs.LastRegex.Match(trimedText);
var thismatch = DatePeriodExtractorChs.ThisRegex.Match(trimmedText);
var nextmatch = DatePeriodExtractorChs.NextRegex.Match(trimmedText);
var lastmatch = DatePeriodExtractorChs.LastRegex.Match(trimmedText);

if (!string.IsNullOrEmpty(monthStr))
{
var swift = -10;

if (trimedText.StartsWith("明年"))
if (trimmedText.StartsWith("明年"))
{
swift = 1;
}
else if (trimedText.StartsWith("去年"))
else if (trimmedText.StartsWith("去年"))
{
swift = -1;
}
else if (trimedText.StartsWith("今年"))
else if (trimmedText.StartsWith("今年"))
{
swift = 0;
}
Expand Down Expand Up @@ -496,7 +497,7 @@ private DateTimeResolutionResult ParseOneWordPeriod(string text, DateObject refe
swift = -1;
}

if (trimedText.EndsWith("") | trimedText.EndsWith("星期"))
if (trimmedText.EndsWith("") | trimmedText.EndsWith("星期"))
{
var monday = referenceDate.This(DayOfWeek.Monday).AddDays(7*swift);
ret.Timex = FormatUtil.ToIsoWeekTimex(monday);
Expand All @@ -509,7 +510,7 @@ private DateTimeResolutionResult ParseOneWordPeriod(string text, DateObject refe
return ret;
}

if (trimedText.EndsWith("周末"))
if (trimmedText.EndsWith("周末"))
{
var beginDate = referenceDate.This(DayOfWeek.Saturday).AddDays(7*swift);
var endDate = referenceDate.This(DayOfWeek.Sunday).AddDays(7*swift);
Expand All @@ -526,29 +527,29 @@ private DateTimeResolutionResult ParseOneWordPeriod(string text, DateObject refe
return ret;
}

if (trimedText.EndsWith(""))
if (trimmedText.EndsWith(""))
{
month = referenceDate.AddMonths(swift).Month;
year = referenceDate.AddMonths(swift).Year;
ret.Timex = year.ToString("D4") + "-" + month.ToString("D2");
futureYear = pastYear = year;
}
else if (trimedText.EndsWith(""))
else if (trimmedText.EndsWith(""))
{
year = referenceDate.AddYears(swift).Year;
if (trimedText.EndsWith("去年"))
if (trimmedText.EndsWith("去年"))
{
year--;
}
else if (trimedText.EndsWith("明年"))
else if (trimmedText.EndsWith("明年"))
{
year++;
}
else if (trimedText.EndsWith("前年"))
else if (trimmedText.EndsWith("前年"))
{
year -= 2;
}
else if (trimedText.EndsWith("后年"))
else if (trimmedText.EndsWith("后年"))
{
year += 2;
}
Expand Down Expand Up @@ -943,7 +944,7 @@ private DateTimeResolutionResult ParseNumberWithUnit(string text, DateObject ref
private DateTimeResolutionResult ParseWeekOfMonth(string text, DateObject referenceDate)
{
var ret = new DateTimeResolutionResult();
var trimedText = text.Trim().ToLowerInvariant();
var trimmedText = text.Trim().ToLowerInvariant();
var match = DatePeriodExtractorChs.WeekOfMonthRegex.Match(text);
if (!match.Success)
{
Expand All @@ -969,11 +970,11 @@ private DateTimeResolutionResult ParseWeekOfMonth(string text, DateObject refere
if (string.IsNullOrEmpty(monthStr))
{
var swift = 0;
if (trimedText.StartsWith("下个"))
if (trimmedText.StartsWith("下个"))
{
swift = 1;
}
else if (trimedText.StartsWith("上个"))
else if (trimmedText.StartsWith("上个"))
{
swift = -1;
}
Expand Down Expand Up @@ -1159,11 +1160,11 @@ private DateTimeResolutionResult ParseDecade(string text, DateObject referenceDa
int decadeLastYear = 10;
var inputCentury = false;

var trimedText = text.Trim();
var match = DatePeriodExtractorChs.DecadeRegex.Match(trimedText);
var trimmedText = text.Trim();
var match = DatePeriodExtractorChs.DecadeRegex.Match(trimmedText);
string beginLuisStr, endLuisStr;

if (match.Success && match.Index == 0 && match.Length == trimedText.Length)
if (match.Success && match.Index == 0 && match.Length == trimmedText.Length)
{
var decadeStr = match.Groups["decade"].Value;
if (!int.TryParse(decadeStr, out decade))
Expand Down
Expand Up @@ -98,34 +98,34 @@ public DateTimeParseResult Parse(ExtractResult er, DateObject refDate)
// parse if lunar contains
private bool IsLunarCalendar(string text)
{
var trimedText = text.Trim();
var match = DateExtractorChs.LunarRegex.Match(trimedText);
var trimmedText = text.Trim();
var match = DateExtractorChs.LunarRegex.Match(trimmedText);
if (match.Success)
{
return true;
}

return ChineseHolidayExtractorConfiguration.LunarHolidayRegex.IsMatch(trimedText);
return ChineseHolidayExtractorConfiguration.LunarHolidayRegex.IsMatch(trimmedText);
}

private static DateTimeResolutionResult ParseBasicRegex(string text, DateObject referenceTime)
{
var ret = new DateTimeResolutionResult();
var trimedText = text.Trim().ToLower();
var trimmedText = text.Trim().ToLower();

// handle "现在"
var match = DateTimeExtractorChs.NowRegex.Match(trimedText);
if (match.Success && match.Index == 0 && match.Length == trimedText.Length)
var match = DateTimeExtractorChs.NowRegex.Match(trimmedText);
if (match.Success && match.Index == 0 && match.Length == trimmedText.Length)
{
if (trimedText.EndsWith("现在"))
if (trimmedText.EndsWith("现在"))
{
ret.Timex = "PRESENT_REF";
}
else if (trimedText.Equals("刚刚才") || trimedText.Equals("刚刚") || trimedText.Equals("刚才"))
else if (trimmedText.Equals("刚刚才") || trimmedText.Equals("刚刚") || trimmedText.Equals("刚才"))
{
ret.Timex = "PAST_REF";
}
else if (trimedText.Equals("立刻") || trimedText.Equals("马上"))
else if (trimmedText.Equals("立刻") || trimmedText.Equals("马上"))
{
ret.Timex = "FUTURE_REF";
}
Expand Down
Expand Up @@ -334,16 +334,16 @@ private DateTimeResolutionResult MergeTwoTimePoints(string text, DateObject refe
private DateTimeResolutionResult ParseSpecificNight(string text, DateObject referenceTime)
{
var ret = new DateTimeResolutionResult();
var trimedText = text.Trim().ToLowerInvariant();
var trimmedText = text.Trim().ToLowerInvariant();
int beginHour, endHour, endMin = 0;
string timeStr;

// handle 昨晚,今晨
var match = DateTimePeriodExtractorChs.SpecificTimeOfDayRegex.Match(trimedText);
if (match.Success && match.Index == 0 && match.Length == trimedText.Length)
var match = DateTimePeriodExtractorChs.SpecificTimeOfDayRegex.Match(trimmedText);
if (match.Success && match.Index == 0 && match.Length == trimmedText.Length)
{
var swift = 0;
switch (trimedText)
switch (trimmedText)
{
case "今晚":
swift = 0;
Expand Down Expand Up @@ -394,25 +394,25 @@ private DateTimeResolutionResult ParseSpecificNight(string text, DateObject refe
}

// handle morning, afternoon..
if (MORegex.IsMatch(trimedText))
if (MORegex.IsMatch(trimmedText))
{
timeStr = "TMO";
beginHour = 8;
endHour = Constants.HalfDayHourCount;
}
else if (AFRegex.IsMatch(trimedText))
else if (AFRegex.IsMatch(trimmedText))
{
timeStr = "TAF";
beginHour = Constants.HalfDayHourCount;
endHour = 16;
}
else if (EVRegex.IsMatch(trimedText))
else if (EVRegex.IsMatch(trimmedText))
{
timeStr = "TEV";
beginHour = 16;
endHour = 20;
}
else if (NIRegex.IsMatch(trimedText))
else if (NIRegex.IsMatch(trimmedText))
{
timeStr = "TNI";
beginHour = 20;
Expand All @@ -424,15 +424,15 @@ private DateTimeResolutionResult ParseSpecificNight(string text, DateObject refe
return ret;
}

match = DateTimePeriodExtractorChs.SpecificTimeOfDayRegex.Match(trimedText);
if (match.Success && match.Index == 0 && match.Length == trimedText.Length)
match = DateTimePeriodExtractorChs.SpecificTimeOfDayRegex.Match(trimmedText);
if (match.Success && match.Index == 0 && match.Length == trimmedText.Length)
{
var swift = 0;
if (DateTimePeriodExtractorChs.NextRegex.IsMatch(trimedText))
if (DateTimePeriodExtractorChs.NextRegex.IsMatch(trimmedText))
{
swift = 1;
}
else if (DateTimePeriodExtractorChs.LastRegex.IsMatch(trimedText))
else if (DateTimePeriodExtractorChs.LastRegex.IsMatch(trimmedText))
{
swift = -1;
}
Expand All @@ -451,10 +451,10 @@ private DateTimeResolutionResult ParseSpecificNight(string text, DateObject refe


// handle Date followed by morning, afternoon
match = DateTimePeriodExtractorChs.TimeOfDayRegex.Match(trimedText);
match = DateTimePeriodExtractorChs.TimeOfDayRegex.Match(trimmedText);
if (match.Success)
{
var beforeStr = trimedText.Substring(0, match.Index).Trim();
var beforeStr = trimmedText.Substring(0, match.Index).Trim();
var ers = SingleDateExtractor.Extract(beforeStr, referenceTime);
if (ers.Count == 0 || ers[0].Length != beforeStr.Length)
{
Expand Down
Expand Up @@ -135,20 +135,20 @@ public List<DateTimeParseResult> FilterResults(string query, List<DateTimeParseR
// parse if lunar contains
private bool IsLunarCalendar(string text)
{
var trimedText = text.Trim();
var match = ChineseHolidayExtractorConfiguration.LunarHolidayRegex.Match(trimedText);
var trimmedText = text.Trim();
var match = ChineseHolidayExtractorConfiguration.LunarHolidayRegex.Match(trimmedText);
return match.Success;
}

private static DateTimeResolutionResult ParseHolidayRegexMatch(string text, DateObject referenceDate)
{
var trimedText = text.Trim();
var trimmedText = text.Trim();
foreach (var regex in ChineseHolidayExtractorConfiguration.HolidayRegexList)
{
var offset = 0;
var match = regex.Match(trimedText);
var match = regex.Match(trimmedText);

if (match.Success && match.Index == offset && match.Length == trimedText.Length)
if (match.Success && match.Index == offset && match.Length == trimmedText.Length)
{
// LUIS value string will be set in Match2Date method
var ret = Match2Date(match, referenceDate);
Expand Down

0 comments on commit 79f941d

Please sign in to comment.