diff --git a/duckling-fork-chinese/core/src/main/scala/com/xiaomi/duckling/dimension/time/repeat/Repeat.scala b/duckling-fork-chinese/core/src/main/scala/com/xiaomi/duckling/dimension/time/repeat/Repeat.scala index 27cb8e6..ba3e038 100644 --- a/duckling-fork-chinese/core/src/main/scala/com/xiaomi/duckling/dimension/time/repeat/Repeat.scala +++ b/duckling-fork-chinese/core/src/main/scala/com/xiaomi/duckling/dimension/time/repeat/Repeat.scala @@ -72,13 +72,13 @@ case class RepeatValue(interval: Option[DurationData] = None, */ override def schema: Option[String] = { val duration = - if (interval.nonEmpty) { - val _interval = interval.get - if (_interval.schema.isEmpty) durationSchema(_interval.value.toString, _interval.grain).get - else _interval.schema.get - } else if (workdayType.nonEmpty) { - workdayType.get.toString - } else "undefined" + if (interval.nonEmpty) { + val _interval = interval.get + if (_interval.schema.isEmpty) durationSchema(_interval.value.toString, _interval.grain).get + else _interval.schema.get + } else if (workdayType.nonEmpty) { + workdayType.get.toString + } else "undefined" val isWorkdayType = workdayType.nonEmpty start match { case Some((TimeValue(x, _, _, _, _, _), _)) => diff --git a/duckling-fork-chinese/core/src/main/scala/com/xiaomi/duckling/dimension/time/repeat/Rules.scala b/duckling-fork-chinese/core/src/main/scala/com/xiaomi/duckling/dimension/time/repeat/Rules.scala index c471d54..de6a63d 100644 --- a/duckling-fork-chinese/core/src/main/scala/com/xiaomi/duckling/dimension/time/repeat/Rules.scala +++ b/duckling-fork-chinese/core/src/main/scala/com/xiaomi/duckling/dimension/time/repeat/Rules.scala @@ -25,8 +25,8 @@ import com.xiaomi.duckling.dimension.matcher.GroupMatch import com.xiaomi.duckling.dimension.matcher.Prods.{regexMatch, singleRegexMatch} import com.xiaomi.duckling.dimension.time.{form, Time, TimeData} import com.xiaomi.duckling.dimension.time.duration.{Duration, DurationData} -import com.xiaomi.duckling.dimension.time.enums.Grain -import com.xiaomi.duckling.dimension.time.predicates.{isAPartOfDay, isATimeOfDay, isNotLatent, isTimeDatePredicate, TimeDatePredicate} +import com.xiaomi.duckling.dimension.time.enums.{Grain, Hint} +import com.xiaomi.duckling.dimension.time.predicates.{isAPartOfDay, isATimeOfDay, isHint, isNotLatent, isTimeDatePredicate, IntersectTimePredicate, TimeDatePredicate, TimeIntervalsPredicate} trait Rules extends DimRules with LazyLogging { /** @@ -46,15 +46,19 @@ trait Rules extends DimRules with LazyLogging { */ val ruleEveryDatetime = Rule( name = " ", - pattern = List("每(一|一个|个)?".regex, isTimeDatePredicate.predicate), + pattern = List("每(一个|一|个)?".regex, or(isTimeDatePredicate, isHint(Hint.PartOfDayAtLast), isAPartOfDay).predicate), prod = tokens { - case _ :: (t @ Token(_, td: TimeData)) :: _ => - val grainOfInterval = td.timePred.asInstanceOf[TimeDatePredicate].maxGrain.get + case _ :: (t@Token(_, td: TimeData)) :: _ if td.timePred.maxGrain.nonEmpty => + val maxGrain = td.timePred.maxGrain.get val grain = - if (grainOfInterval == Grain.Hour && (isAPartOfDay(t) || isATimeOfDay(t))) Grain.Day - else grainOfInterval + if (maxGrain == Grain.Hour && (isAPartOfDay(t) || isATimeOfDay(t))) Grain.Day + else maxGrain val interval = DurationData(1, grain) - Token(Repeat, RepeatData(interval, start = td)) + td.timePred match { + case _: TimeDatePredicate | _: TimeIntervalsPredicate | _: IntersectTimePredicate => + Token(Repeat, RepeatData(interval, start = td)) + case _ => None + } } ) diff --git a/duckling-fork-chinese/learning/src/main/scala/com/xiaomi/duckling/dimension/time/repeat/Examples.scala b/duckling-fork-chinese/learning/src/main/scala/com/xiaomi/duckling/dimension/time/repeat/Examples.scala index 6f947a6..ffa8165 100644 --- a/duckling-fork-chinese/learning/src/main/scala/com/xiaomi/duckling/dimension/time/repeat/Examples.scala +++ b/duckling-fork-chinese/learning/src/main/scala/com/xiaomi/duckling/dimension/time/repeat/Examples.scala @@ -53,7 +53,12 @@ object Examples extends DimExamples { new DuckDateTime(LocalDateTime.of(2013, 2, 12, 8, 0, 0)), new DuckDateTime(LocalDateTime.of(2013, 2, 12, 12, 0, 0)), Hour, - partOfDay = "上午"), Some(form.PartOfDay("上午")))), List("每个工作日上午")) + partOfDay = "上午"), Some(form.PartOfDay("上午")))), List("每个工作日上午")), + (RepeatValue(DurationData(1, Week), start = (datetimeInterval( + new DuckDateTime(LocalDateTime.of(2013, 2, 13, 12, 0, 0)), + new DuckDateTime(LocalDateTime.of(2013, 2, 13, 18, 0, 0)), + Hour, + partOfDay = "下午"), Some(form.PartOfDay("下午")))), List("每周三下午")) ) override val dimension: Dimension = Repeat