module NLP.Concraft.Disamb.Positional
( Tier (..)
, Part (..)
, select
, split
, tierConfDefault
) where
import Control.Applicative ((<$>), (<*>))
import Data.Binary (Binary, put, get)
import Data.Text.Binary ()
import qualified Data.Set as S
import qualified Data.Map as M
import qualified Data.Text as T
import qualified Data.Tagset.Positional as TP
data Tier = Tier {
withPos :: Bool
, withAtts :: S.Set TP.Attr }
instance Binary Tier where
put Tier{..} = put withPos >> put withAtts
get = Tier <$> get <*> get
data Part = Part
{ pos :: Maybe TP.POS
, atts :: M.Map TP.Attr T.Text }
deriving (Show, Eq, Ord)
instance Binary Part where
put Part{..} = put pos >> put atts
get = Part <$> get <*> get
select :: Tier -> TP.Tag -> Part
select Tier{..} tag = Part
{ pos = if withPos then Just (TP.pos tag) else Nothing
, atts = M.filterWithKey (\k _ -> k `S.member` withAtts) (TP.atts tag) }
split :: [Tier] -> TP.Tag -> [Part]
split tiers tag =
[ select tier tag
| tier <- tiers ]
tierConfDefault :: [Tier]
tierConfDefault =
[tier1, tier2]
where
tier1 = Tier True $ S.fromList ["cas", "per"]
tier2 = Tier False $ S.fromList
[ "nmb", "gnd", "deg", "asp" , "ngt", "acm"
, "acn", "ppr", "agg", "vlc", "dot" ]