/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 8 ĠReg ents Ġof Ġthe ĠUniversity Ġof ĠMin nes ota . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġedu . umn . bio med ic us . time Ċ Ċ import Ġedu . umn . bio med ic us . annotations . Setting Ċ import Ġedu . umn . bio med ic us . common . types . syntax . Part Of Speech Ċ import Ġedu . umn . bio med ic us . exc . Bio med ic us Exception Ċ import Ġedu . umn . bio med ic us . framework . Search Expr Ċ import Ġedu . umn . bio med ic us . framework . Search Expr Factory Ċ import Ġedu . umn . bio med ic us . sentences . Sentence Ċ import Ġedu . umn . bio med ic us . tag ging . Pos Tag Ċ import Ġedu . umn . bio med ic us . token ization . Parse Token Ċ import Ġedu . umn . nlp engine .* Ċ import Ġjava . io . File Ċ import Ġjava . nio . charset . StandardCharsets Ċ import Ġjava . nio . file . Path Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . inject . Singleton Ċ Ċ class ĠTime Module Ġ: ĠSystem Module () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Label Class < DayOfWeek >() ĊĠĠĠĠĠĠĠ Ġadd Label Class < Time OfDay Word >() ĊĠĠĠĠĠĠĠ Ġadd Label Class < Season Word >() ĊĠĠĠĠĠĠĠ Ġadd Label Class < Month >() ĊĠĠĠĠĠĠĠ Ġadd Label Class < Year Number >() ĊĠĠĠĠĠĠĠ Ġadd Label Class < Year Range >() ĊĠĠĠĠĠĠĠ Ġadd Label Class < Text Time >() ĊĠĠĠĠĠĠĠ Ġadd Label Class < Text Date >() ĊĠĠĠĠĠĠĠ Ġadd Label Class < Temporal Phrase >() ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġday Ġof Ġweek Ġin Ġtext , Ġe . g . Ġ" Monday ", Ġ" t ue .", Ġetc Ċ Ġ*/ Ċ @ Label Metadata ( classpath Ġ= Ġ" bio med ic us . v 2 ", Ġdistinct Ġ= Ġtrue ) Ċ data Ġclass ĠDay OfWeek ( override Ġval ĠstartIndex : ĠInt , Ġoverride Ġval Ġend Index : ĠInt ) Ġ: ĠLabel () Ġ{ ĊĠĠĠ Ġconstructor ( text Range : ĠText Range ) Ġ: Ġthis ( text Range . startIndex , Ġtext Range . end Index ) Ċ } Ċ Ċ @ Label Metadata ( classpath Ġ= Ġ" bio med ic us . v 2 ", Ġdistinct Ġ= Ġtrue ) Ċ data Ġclass ĠTime OfDay Word ( override Ġval ĠstartIndex : ĠInt , Ġoverride Ġval Ġend Index : ĠInt ) Ġ: ĠLabel () Ġ{ ĊĠĠĠ Ġconstructor ( text Range : ĠText Range ) Ġ: Ġthis ( text Range . startIndex , Ġtext Range . end Index ) Ċ } Ċ Ċ @ Label Metadata ( classpath Ġ= Ġ" bio med ic us . v 2 ", Ġdistinct Ġ= Ġtrue ) Ċ data Ġclass ĠSe ason Word ( override Ġval ĠstartIndex : ĠInt , Ġoverride Ġval Ġend Index : ĠInt ) Ġ: ĠLabel () Ġ{ ĊĠĠĠ Ġconstructor ( text Range : ĠText Range ) Ġ: Ġthis ( text Range . startIndex , Ġtext Range . end Index ) Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġmonth Ġin Ġtext , Ġe . g . Ġ" Jan ", Ġ" Fe bruary ", Ġ" Se pt ." Ċ Ġ*/ Ċ @ Label Metadata ( classpath Ġ= Ġ" bio med ic us . v 2 ", Ġdistinct Ġ= Ġtrue ) Ċ data Ġclass ĠMonth ( override Ġval ĠstartIndex : ĠInt , Ġoverride Ġval Ġend Index : ĠInt ) Ġ: ĠLabel () Ġ{ ĊĠĠĠ Ġconstructor ( text Range : ĠText Range ) Ġ: Ġthis ( text Range . startIndex , Ġtext Range . end Index ) Ċ } Ċ Ċ @ Label Metadata ( classpath Ġ= Ġ" bio med ic us . v 2 ", Ġdistinct Ġ= Ġtrue ) Ċ data Ġclass ĠYear Number ( ĊĠĠĠĠĠĠĠ Ġoverride Ġval ĠstartIndex : ĠInt , ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġend Index : ĠInt , ĊĠĠĠĠĠĠĠ Ġval Ġvalue : ĠInt Ċ ) Ġ: ĠLabel () Ġ{ ĊĊĊĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Range : ĠText Range , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue : ĠInt ĊĠĠĠ Ġ) Ġ: Ġthis ( text Range . startIndex , Ġtext Range . end Index , Ġvalue ) Ċ } Ċ Ċ @ Label Metadata ( classpath Ġ= Ġ" bio med ic us . v 2 ", Ġdistinct Ġ= Ġtrue ) Ċ data Ġclass ĠYear Range ( override Ġval ĠstartIndex : ĠInt , Ġoverride Ġval Ġend Index : ĠInt ) Ġ: ĠLabel () Ċ Ċ @ Label Metadata ( classpath Ġ= Ġ" bio med ic us . v 2 ", Ġdistinct Ġ= Ġtrue ) Ċ data Ġclass ĠText Time ( override Ġval ĠstartIndex : ĠInt , Ġoverride Ġval Ġend Index : ĠInt ) Ġ: ĠLabel () Ċ Ċ @ Label Metadata ( classpath Ġ= Ġ" bio med ic us . v 2 ", Ġdistinct Ġ= Ġtrue ) Ċ data Ġclass ĠText Date ( override Ġval ĠstartIndex : ĠInt , Ġoverride Ġval Ġend Index : ĠInt ) Ġ: ĠLabel () Ċ Ċ @ Label Metadata ( classpath Ġ= Ġ" bio med ic us . v 2 ", Ġdistinct Ġ= Ġtrue ) Ċ data Ġclass ĠTemp oral Phrase ( override Ġval ĠstartIndex : ĠInt , Ġoverride Ġval Ġend Index : ĠInt ) Ġ: ĠLabel () ĊĊ Ċ /** Ċ Ġ* ĠData Ġmodel Ġfor Ġdays Ġof Ġweek Ċ Ġ*/ Ċ @ Singleton Ċ class ĠDays OfWeek ( val Ġvalues : ĠList < String >) Ġ{ ĊĠĠĠ Ġ@ Inject Ġconstructor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Setting (" time . days . as Data Path ") Ġpath : ĠPath ĊĠĠĠ Ġ) Ġ: Ġthis ( path . to File (). read Lines ()) Ċ } Ċ Ċ /** Ċ Ġ* ĠDetect s Ġdays Ġof Ġweek Ġin Ġtext Ċ Ġ*/ Ċ class ĠDetect Days OfWeek ( val Ġvalues : ĠList < String >) Ġ: ĠDocument Task Ġ{ ĊĠĠĠ Ġ@ Inject Ġconstructor ( days OfWeek : ĠDays OfWeek ) Ġ: Ġthis ( days OfWeek . values ) ĊĊĠĠĠ Ġoverride Ġfun Ġrun ( document : ĠDocument ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= Ġdocument . label Index < Parse Token >() ĊĠĠĠĠĠĠĠ Ġval Ġpos Tags Ġ= Ġdocument . label Index < Pos Tag >() ĊĊĠĠĠĠĠĠĠ Ġval Ġlabel er Ġ= Ġdocument . label er < DayOfWeek >() ĊĊĠĠĠĠĠĠĠ Ġpos Tags . filter Ġ{ Ġit . part Of Speech Ġ== ĠPart Of Speech . NN Ġ|| Ġit . part Of Speech Ġ== ĠPart Of Speech . NN P Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtokens . first At Location ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠBio med ic us Exception (" Pos Ġtag Ġwithout Ġtoken ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġvalues . contains ( it . text . toLowerCase ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġlabel er . add ( DayOfWeek ( it )) Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ @ Singleton Ċ class ĠTimes OfDay ( val Ġvalues : ĠList < String >) Ġ{ ĊĠĠĠ Ġ@ Inject Ġconstructor (@ Setting (" time . times OfDay . as Data Path ") Ġpath : ĠString ) Ġ: Ġthis ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( path ). read Lines ( StandardCharsets . UTF _ 8 ) ĊĠĠĠ Ġ) Ċ } Ċ Ċ class ĠDetect Times OfDay ( val Ġvalues : ĠList < String >) Ġ: ĠDocument Task Ġ{ ĊĠĠĠ Ġ@ Inject Ġconstructor ( times OfDay : ĠTimes OfDay ) Ġ: Ġthis ( times OfDay . values ) ĊĊĠĠĠ Ġoverride Ġfun Ġrun ( document : ĠDocument ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlabel er Ġ= Ġdocument . label er < Time OfDay Word >() ĊĊĠĠĠĠĠĠĠ Ġdocument . label Index < Parse Token >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġvalues . contains ( it . text . toLowerCase ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġlabel er . add ( Time OfDay Word ( it )) Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ @ Singleton Ċ class ĠSe asons ( val Ġvalues : ĠList < String >) Ġ{ ĊĠĠĠ Ġ@ Inject Ġconstructor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Setting (" time . se asons . as Data Path ") Ġpath : ĠPath ĊĠĠĠ Ġ) Ġ: Ġthis ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . to File (). read Lines ( StandardCharsets . UTF _ 8 ) ĊĠĠĠ Ġ) Ċ } Ċ Ċ class ĠDetect Season Words ( val Ġvalues : ĠList < String >) Ġ: ĠDocument Task Ġ{ ĊĠĠĠ Ġ@ Inject Ġconstructor ( se asons : ĠSe asons ) Ġ: Ġthis ( se asons . values ) ĊĊĠĠĠ Ġoverride Ġfun Ġrun ( document : ĠDocument ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlabel er Ġ= Ġdocument . label er < Season Word >() ĊĊĠĠĠĠĠĠĠ Ġdocument . label Index < Parse Token >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġvalues . contains ( it . text . toLowerCase ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġlabel er . add ( Season Word ( it )) Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ /** Ċ Ġ* ĠThe Ġdata Ġmodel Ġfor Ġmonths . Ċ Ġ*/ Ċ @ Singleton Ċ class ĠMonth s ( val Ġmonths : ĠList < String >) Ġ{ ĊĠĠĠ Ġ@ Inject Ġconstructor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Setting (" time . months . as Data Path ") Ġpath : ĠPath ĊĠĠĠ Ġ) Ġ: Ġthis ( path . to File (). read Lines ()) Ċ } Ċ Ċ /** Ċ Ġ* ĠDetect s Ġmonths Ġin Ġtext . Ċ Ġ*/ Ċ class ĠDetect Months ( val Ġmonths : ĠList < String >) Ġ: ĠDocument Task Ġ{ ĊĠĠĠ Ġ@ Inject Ġconstructor ( months : ĠMonth s ) Ġ: Ġthis ( months . months ) ĊĊĠĠĠ Ġoverride Ġfun Ġrun ( document : ĠDocument ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= Ġdocument . label Index < Parse Token >() ĊĠĠĠĠĠĠĠ Ġval Ġpos Tags Ġ= Ġdocument . label Index < Pos Tag >() ĊĊĠĠĠĠĠĠĠ Ġval Ġlabel er Ġ= Ġdocument . label er < Month >() ĊĊĠĠĠĠĠĠĠ Ġpos Tags ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . part Of Speech Ġ== ĠPart Of Speech . NN Ġ|| Ġit . part Of Speech Ġ== ĠPart Of Speech . NN P ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġit . part Of Speech Ġ== ĠPart Of Speech . MD ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtokens . first At Location ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠBio med ic us Exception (" Pos Ġtag Ġwithout Ġtoken ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġmonths . contains ( it . text . toLowerCase ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġlabel er . add ( Month ( it )) Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ internal Ġval Ġyear Pattern Ġ= ĠRegex ("( 1 8 | 1 9 | 2 0 )\\ d { 2 }") Ċ Ċ class ĠDetect Year Numbers Ġ: ĠDocument Task Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġrun ( document : ĠDocument ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= Ġdocument . label Index < Parse Token >() ĊĊĠĠĠĠĠĠĠ Ġval Ġlabel er Ġ= Ġdocument . label er < Year Number >() ĊĊĠĠĠĠĠĠĠ Ġtokens . filter Ġ{ Ġyear Pattern . matches ( it . text ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġlabel er . add ( Year Number ( it , Ġit . text . toInt ())) Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ @ Singleton Ċ class ĠYear Range Pattern ( val Ġexpr : ĠSearch Expr ) Ġ{ ĊĠĠĠ Ġ@ Inject Ġconstructor ( search Expr Factory : ĠSearch Expr Factory ) Ġ: Ġthis ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Expr Factory . parse ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"[ ? Number Range ĠYear Number Ġ( Number < getNumber Type = e CARD IN AL > Ġ| ĠYear Number )] " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) Ċ } ĊĊ Ċ class ĠDetect Year Ranges ( val Ġexpr : ĠSearch Expr ) Ġ: ĠDocument Task Ġ{ ĊĠĠĠ Ġ@ Inject Ġconstructor ( pattern : ĠYear Range Pattern ) Ġ: Ġthis ( pattern . expr ) ĊĊĠĠĠ Ġoverride Ġfun Ġrun ( document : ĠDocument ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsearch er Ġ= Ġexpr . create Searcher ( document ) ĊĊĠĠĠĠĠĠĠ Ġval Ġlabel er Ġ= Ġdocument . label er < Year Range >() ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( search er . search ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlabel er . add ( Year Range ( search er . begin , Ġsearch er . end )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ @ Singleton Ċ data Ġclass ĠText Time Pattern ( val Ġexpr : ĠSearch Expr ) Ġ{ ĊĠĠĠ Ġ@ Inject Ġconstructor ( search Expr Factory : ĠSearch Expr Factory ) Ġ: Ġthis ( search Expr Factory . parse ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" Ċ [ ? Number ] ĠParse Token < getText = i " a . m ." | i " am " | i " p . m ." | i " pm " | i " a . m " | i " p . m "> Ġ| Ċ [ ? Parse Token < getText = r "[ 0 - 2 ]? [ 0 - 9 ] "> ] ĠParse Token < getText =" : "> ĠParse Token < getText = r "[ 0 - 5 ][ 0 - 9 ] "> ĠParse Token < getText = i " a . m ." | i " am " | i " p . m ." | i " pm " | i " a . m " | i " p . m "> ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠ Ġ)) Ċ } Ċ Ċ class ĠDetect Text Times ( val Ġexpr : ĠSearch Expr ) Ġ: ĠDocument Task Ġ{ ĊĠĠĠ Ġ@ Inject Ġconstructor ( text Time Pattern : ĠText Time Pattern ) Ġ: Ġthis ( text Time Pattern . expr ) ĊĊĠĠĠ Ġoverride Ġfun Ġrun ( document : ĠDocument ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsentences Ġ= Ġdocument . label Index < Sentence >() ĊĊĠĠĠĠĠĠĠ Ġval Ġlabel er Ġ= Ġdocument . label er ( Text Time :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsearch er Ġ= Ġexpr . create Searcher ( document ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( sentence Ġin Ġsentences ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( search er . search ( sentence )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlabel er . add ( Text Time ( search er . begin , Ġsearch er . end )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ @ Singleton Ċ data Ġclass ĠDate Pattern ( val Ġexpr : ĠSearch Expr ) Ġ{ ĊĠĠĠ Ġ@ Inject Ġconstructor ( search Expr Factory : ĠSearch Expr Factory ) Ġ: Ġthis ( search Expr Factory . parse (""" Ċ ([ ? weekday : DayOfWeek ] ĠParse Token < getText =", "> ? Ġ-> )? Ġ[ ? month : Month ] Ġ(-> Ġday No : Number < getNumber Type = e CARD IN AL >) ? Ġ( Parse Token < getText =" ," |" of "> Ġ-> Ġyear : Year Number )? Ċ | Ġ[ ? month No : Parse Token < getText = r " ([ 1 - 9 ]| 1 [ 0 - 2 ]) "> ] ĠParse Token < getText ="/"> ĠParse Token < getText = r "[ 1 - 9 ] |[ 1 - 2 ][ 1 - 9 ]| 3 [ 0 - 1 ] "> Ġ( Parse Token < getText ="/" |" -"> Ġ-> ĠYear Number )? Ċ | Ġ[ ? month No : Parse Token < getText = r " ([ 1 - 9 ]| 1 [ 0 - 2 ]) "> ] ĠParse Token < getText ="- "> ĠParse Token < getText = r "[ 1 - 9 ] |[ 1 - 2 ][ 1 - 9 ]| 3 [ 0 - 1 ] "> ĠParse Token < getText ="- "> Ġ-> ĠYear Number Ċ | Ġ[ ? Year Number ] ĠParse Token < getText ="- "> ĠParse Token < getText = r "[ 1 - 9 ] |[ 1 - 2 ][ 1 - 9 ]| 3 [ 0 - 1 ] "> ĠParse Token < getText ="- "> Ġmonth No : Parse Token < getText = r " ([ 1 - 9 ]| 1 [ 0 - 2 ]) "> Ċ "" ")) Ċ } Ċ Ċ class ĠDetect Dates ( val Ġexpr : ĠSearch Expr ) Ġ: ĠDocument Task Ġ{ ĊĠĠĠ Ġ@ Inject Ġconstructor ( pattern : ĠDate Pattern ) Ġ: Ġthis ( pattern . expr ) ĊĊĠĠĠ Ġoverride Ġfun Ġrun ( document : ĠDocument ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsearch er Ġ= Ġexpr . create Searcher ( document ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsentences Ġ= Ġdocument . label Index < Sentence >() ĊĊĠĠĠĠĠĠĠ Ġval Ġlabel er Ġ= Ġdocument . label er < Text Date >() ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( sentence Ġin Ġsentences ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( search er . search ( sentence )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlabel er . add ( Text Date ( search er . begin , Ġsearch er . end )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ @ Singleton Ċ class ĠTemp oral Phrase Pattern ( val Ġexpr : ĠSearch Expr ) Ġ{ ĊĠĠĠ Ġ@ Inject Ġconstructor ( search Expr Factory : ĠSearch Expr Factory ) Ġ: Ġthis ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Expr Factory . parse (""" Ċ ([ ? Pos Tag < get Part Of Speech = e IN >] Ġ-> )? Ġ([ ? Parse Token < getText =" a " |" the "> ] Ġ-> )? Ġ( ĊĠ Ġ([ ? Pos Tag < get Part Of Speech = e JJ >] ĠPos Tag < get Part Of Speech = e JJ >{ 0 , 2 } Ġ-> )? Ġ([ ? Quant ifier ] Ġ-> )? Ġ[ ? TimeUnit ] ĠParse Token < getText =" ago "> ? Ġ| ĊĠ Ġ[ ? DayOfWeek ] Ġ-> ĠTime OfDay Word Ġ| ĊĠ Ġ[ ? Text Date ] Ġ( Parse Token < getText =" through " |" to "> Ġ-> ĠText Date )? Ġ| ĊĠ Ġ[ ? Parse Token < getText =" present " |" present ly " |" current " |" currently " |" recent ly " |" recent "> ] Ġ| ĊĠ Ġ[ ? Parse Token < getText =" age "> ] ĠParse Token < getText =" of "> Ġ-> ĠNumber Ġ| ĊĠ Ġ([ ? Parse Token < getText =" last " |" previous " |" next "> ] Ġ-> )? Ġ[ ? Season Word ] Ġ| ĊĠ Ġ([ ? Number ] Ġ| Ġ[ ? Text Time ]) ĠPos Tag < get Part Of Speech = e IN > ĠPos Tag < get Part Of Speech = e DT > Ġ-> ĠTime OfDay Word Ġ| ĊĠ Ġ[ ? Text Time ] Ġ| ĊĠ Ġ[ ? Year Range ] Ġ| ĊĠ Ġ[ ? Time OfDay Word ] Ċ ) """) ĊĠĠĠ Ġ) Ċ } Ċ Ċ class ĠDetect Temporal Ph rases ( val Ġexpr : ĠSearch Expr ) Ġ: ĠDocument Task Ġ{ ĊĠĠĠ Ġ@ Inject Ġconstructor ( pattern : ĠTemp oral Phrase Pattern ) Ġ: Ġthis ( pattern . expr ) ĊĊĠĠĠ Ġoverride Ġfun Ġrun ( document : ĠDocument ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsentences Ġ= Ġdocument . label Index < Sentence >() ĊĊĠĠĠĠĠĠĠ Ġval Ġlabel er Ġ= Ġdocument . label er < Temporal Phrase >() ĊĊĠĠĠĠĠĠĠ Ġval Ġsearch er Ġ= Ġexpr . create Searcher ( document ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( sentence Ġin Ġsentences ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( search er . search ( sentence )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlabel er . add ( Temporal Phrase ( search er . begin , Ġsearch er . end )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ