【问题标题】:Parsing "1.5 hours" from Stanford Core NLP从斯坦福核心 NLP 解析“1.5 小时”
【发布时间】:2016-07-02 15:38:37
【问题描述】:

核心 NLP 正在解析如下字符串:

1.5 小时

使用以下代码作为一小时的持续时间:

def getPeriods(text: String): Seq[Period] = {
    parse(text).filter(timexAnn => {
        val timeExpr: TimeExpression = timexAnn.get(classOf[TimeExpression.Annotation])
        timeExpr.getValue.getType == duration
    }).map(timexAnn => {
        val timeExpr: TimeExpression = timexAnn.get(classOf[TimeExpression.Annotation])
        val period = timeExpr.getTemporal.getDuration.getJodaTimePeriod
        log.debug("Parsed period: " + TimeUtils.getHourMinutePeriodFormatter.print(period))
        period
    })
}

我将采用生成的 Seq[Period] 的第一个也是唯一一个成员。我一直在玩online demo,这种行为似乎是意料之中的。也许我错过了什么?如果没有,有没有更好的选择?

【问题讨论】:

    标签: java scala nlp stanford-nlp


    【解决方案1】:

    Core NLP 和 SuTime 似乎不解析十进制小时数。我在 Scala 中编写了一个简单的函数,将“1.5 小时”之类的字符串转换为 SuTime 理解的“1 小时 30 分钟”之类的字符串。然后我将这个字符串传递给解析器,每个人都很高兴。

    def getReadableDurationString(durationString: String): String = {
        val hoursAndMins = "([0-9])(\\.[0-9]+) hour[s]?".r
        val minsOnly = "[0-9]?(\\.[0-9]+) hour[s]?".r
        durationString match {
          case hoursAndMins(hours: String, mins: String) =>
            s"${hours.toDouble} hours and ${Math.round(mins.toDouble * 60)} minutes"
          case minsOnly(mins: String) =>
            s"${Math.round(mins.toDouble * 60)} minutes"
          case _ => durationString
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-03
      • 1970-01-01
      • 2014-04-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多