module NLP.Concraft.Morphosyntax
(
Sent
, Word (..)
, mapWord
, mapSent
, interpsSet
, interps
, WMap (unWMap)
, mkWMap
, mapWMap
) where
import Control.Arrow (first)
import qualified Data.Set as S
import qualified Data.Map as M
import qualified Data.Text as T
type Sent t = [Word t]
data Word t = Word {
orth :: T.Text
, tagWMap :: WMap t
, oov :: Bool }
deriving (Show, Eq, Ord)
mapWord :: Ord b => (a -> b) -> Word a -> Word b
mapWord f w = w { tagWMap = mapWMap f (tagWMap w) }
mapSent :: Ord b => (a -> b) -> Sent a -> Sent b
mapSent = map . mapWord
interpsSet :: Word t -> S.Set t
interpsSet = M.keysSet . unWMap . tagWMap
interps :: Word t -> [t]
interps = S.toList . interpsSet
newtype WMap a = WMap { unWMap :: M.Map a Double }
deriving (Show, Eq, Ord)
mkWMap :: Ord a => [(a, Double)] -> WMap a
mkWMap = WMap . M.fromListWith (+) . filter ((>=0).snd)
mapWMap :: Ord b => (a -> b) -> WMap a -> WMap b
mapWMap f = mkWMap . map (first f) . M.toList . unWMap