module NLP.Extraction.Examples.ParsecExamples where
import qualified Data.Text as T
import Data.Text (Text)
import Text.Parsec.Prim (parse, (<|>), try)
import Text.Parsec.Pos
import qualified Text.Parsec.Combinator as PC
import NLP.Types
import NLP.Extraction.Parsec
chunk :: [(Text, Tag)]
-> Tag
-> (Text, Tag)
chunk tss tg = (T.unwords (map fst tss), tg)
prepPhrase :: Extractor (Text, Tag)
prepPhrase = do
prep <- posTok $ Tag "IN"
np <- nounPhrase
return $ chunk [prep, np] (Tag "p-phr")
nounPhrase :: Extractor (Text, Tag)
nounPhrase = do
nlist <- PC.many1 (try (posTok $ Tag "NN")
<|> try (posTok $ Tag "DT")
<|> (posTok $ Tag "JJ"))
let term = T.intercalate " " (map fst nlist)
return (term, Tag "n-phr")
clause :: Extractor (Text, Tag)
clause = do
np <- nounPhrase
vp <- verbPhrase
return $ chunk [np, vp] $ Tag "clause"
verbPhrase :: Extractor (Text, Tag)
verbPhrase = do
vp <- posPrefix "V"
obj <- PC.many1 $ ((try nounPhrase)
<|> (try prepPhrase)
<|> clause)
return $ chunk (vp:obj) $ Tag "v-phr"