2016-07-02 5 views
0

Kern NLP ist das Parsen Strings wie:Parsing "1,5 Stunden" von der Stanford-Core NLP

1,5 Stunden

als 1 Stunde Dauer mit dem folgenden Code:

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 
    }) 
} 

Ich nehme das erste und einzige Mitglied der resultierenden Seq [Periode]. Ich habe mit der online demo gespielt und dieses Verhalten scheint zu erwarten. Vielleicht habe ich etwas verpasst? Wenn nicht, gibt es eine bessere Alternative?

Antwort

0

Es scheint, dass Core NLP und SuTime Dezimalstunden nicht analysieren. Ich habe eine einfache Funktion in Scala geschrieben, um eine Saite wie "1,5 Stunden" in eine Saite zu konvertieren, die Suitime wie "1 Stunde und 30 Minuten" versteht. Ich gebe diese Zeichenfolge an den Parser weiter und alle sind glücklich.

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 
    } 
    } 
}