packages feed

alpino-tools 0.1.0 → 0.2.0

raw patch · 14 files changed

+390/−427 lines, 14 filesdep +MonadRandomdep +alpino-toolsdep +conduitdep −enumeratordep −randomdep −transformersdep ~bytestringdep ~bytestring-lexingdep ~containersPVP ok

version bump matches the API change (PVP)

Dependencies added: MonadRandom, alpino-tools, conduit, resourcet

Dependencies removed: enumerator, random, transformers

Dependency ranges changed: bytestring, bytestring-lexing, containers, hexpat-pickle, mtl, random-shuffle, rosezipper, utf8-string

API changes (from Hackage documentation)

- Data.Alpino.Model.Enumerator: bestScore :: Monad m => Enumeratee [TrainingInstance] Double m b
- Data.Alpino.Model.Enumerator: concat :: Monad m => Enumeratee [a] a m b
- Data.Alpino.Model.Enumerator: filterFeatures :: Monad m => (Bool -> Bool) -> Set ByteString -> Enumeratee TrainingInstance TrainingInstance m b
- Data.Alpino.Model.Enumerator: filterFeaturesFunctor :: Monad m => (Bool -> Bool) -> Set ByteString -> Enumeratee TrainingInstance TrainingInstance m b
- Data.Alpino.Model.Enumerator: groupBy :: (Monad m, Eq a) => (a -> a -> Bool) -> Enumeratee a [a] m b
- Data.Alpino.Model.Enumerator: groupByKey :: Monad m => Enumeratee TrainingInstance [TrainingInstance] m b
- Data.Alpino.Model.Enumerator: instance Exception InvalidDataException
- Data.Alpino.Model.Enumerator: instance Show InvalidDataException
- Data.Alpino.Model.Enumerator: instance Typeable InvalidDataException
- Data.Alpino.Model.Enumerator: instanceGenerator :: Monad m => Enumeratee TrainingInstance ByteString m b
- Data.Alpino.Model.Enumerator: instanceParser :: Monad m => Enumeratee ByteString TrainingInstance m b
- Data.Alpino.Model.Enumerator: lineEnum :: MonadIO m => Enumerator ByteString m b
- Data.Alpino.Model.Enumerator: printByteString :: MonadIO m => Iteratee ByteString m ()
- Data.Alpino.Model.Enumerator: randomSample :: MonadIO m => Int -> Enumeratee [TrainingInstance] [TrainingInstance] m b
- Data.Alpino.Model.Enumerator: scoreToBinary :: Monad m => Enumeratee [TrainingInstance] [TrainingInstance] m b
- Data.Alpino.Model.Enumerator: scoreToBinaryNorm :: Monad m => Enumeratee [TrainingInstance] [TrainingInstance] m b
- Data.Alpino.Model.Enumerator: scoreToNorm :: Monad m => Enumeratee [TrainingInstance] [TrainingInstance] m b
+ Data.Alpino.Model.Conduit: addNewLine :: Monad m => Conduit ByteString m ByteString
+ Data.Alpino.Model.Conduit: bestScore :: Monad m => Conduit [TrainingInstance] m Double
+ Data.Alpino.Model.Conduit: bsToTrainingInstance :: MonadThrow m => Conduit ByteString m TrainingInstance
+ Data.Alpino.Model.Conduit: concat :: Monad m => Conduit [a] m a
+ Data.Alpino.Model.Conduit: filterFeatures :: Monad m => (Bool -> Bool) -> Set ByteString -> Conduit TrainingInstance m TrainingInstance
+ Data.Alpino.Model.Conduit: filterFeaturesFunctor :: Monad m => (Bool -> Bool) -> Set ByteString -> Conduit TrainingInstance m TrainingInstance
+ Data.Alpino.Model.Conduit: groupByKey :: Monad m => Conduit TrainingInstance m [TrainingInstance]
+ Data.Alpino.Model.Conduit: instance Exception InvalidDataException
+ Data.Alpino.Model.Conduit: instance Show InvalidDataException
+ Data.Alpino.Model.Conduit: instance Typeable InvalidDataException
+ Data.Alpino.Model.Conduit: randomSample :: MonadRandom m => Int -> Conduit [TrainingInstance] m [TrainingInstance]
+ Data.Alpino.Model.Conduit: scoreToBinary :: Monad m => Conduit [TrainingInstance] m [TrainingInstance]
+ Data.Alpino.Model.Conduit: scoreToBinaryNorm :: Monad m => Conduit [TrainingInstance] m [TrainingInstance]
+ Data.Alpino.Model.Conduit: scoreToNorm :: Monad m => Conduit [TrainingInstance] m [TrainingInstance]
+ Data.Alpino.Model.Conduit: trainingInstanceToBS :: Monad m => Conduit TrainingInstance m ByteString
- Data.Alpino.Model: randomSample :: RandomGen g => g -> Int -> [TrainingInstance] -> [TrainingInstance]
+ Data.Alpino.Model: randomSample :: MonadRandom m => Int -> [TrainingInstance] -> m [TrainingInstance]

Files

alpino-tools.cabal view
@@ -1,51 +1,60 @@-Name:		alpino-tools-Version:	0.1.0-License:	OtherLicense-License-file:	LICENSE-Copyright:	Copyright 2010 Daniël de Kok-Author:		Daniël de Kok <me@danieldk.eu>-Maintainer:	Daniël de Kok <me@danieldk.eu>-Homepage:	http://github.com/danieldk/alpino-tools-Category:	Natural Language Processing, Data-Synopsis:	Alpino data manipulation tools-Description:	Tools for manipulating data for the Alpino parser for Dutch.-Cabal-Version:	>= 1.2-Build-Type:	Simple+Name:          alpino-tools+Version:       0.2.0+License:       OtherLicense+License-file:  LICENSE+Copyright:     Copyright 2010-2012 Daniël de Kok+Author:        Daniël de Kok <me@danieldk.eu>+Maintainer:    Daniël de Kok <me@danieldk.eu>+Homepage:      http://github.com/danieldk/alpino-tools+Category:      Natural Language Processing, Data+Synopsis:      Alpino data manipulation tools+Description:   Tools for manipulating data for the Alpino parser for Dutch.+Cabal-Version: >= 1.8+Build-Type:    Simple  Library   Exposed-Modules:      Data.Alpino.DepStruct, Data.Alpino.DepStruct.Pickle,                         Data.Alpino.DepStruct.Triples, Data.Alpino.Model,-                        Data.Alpino.Model.Enumerator-  Build-Depends:	base >= 4 && < 5, bytestring >= 0.9.1.7,-                        utf8-string >= 0.3.6, bytestring-lexing >= 0.2.1,-                        enumerator >= 0.4.8 && < 0.5, transformers >= 0.2.2.0,-                        containers >= 0.3.0.0, random >= 1.0.0.3,-                        random-shuffle >= 0.0.2, hexpat-pickle >= 0.4,-                        rosezipper >= 0.2, mtl >= 2.0.1.0+                        Data.Alpino.Model.Conduit+  Build-Depends:        base >= 4 && < 5, bytestring == 0.9.2.*,+                        containers == 0.4.*, utf8-string == 0.3.*,+                        bytestring-lexing == 0.4.*,+                        conduit == 0.4.*, MonadRandom == 0.1.*,+                        random-shuffle == 0.0.3, hexpat-pickle == 0.5,+                        resourcet == 0.3.*, rosezipper == 0.2,+                        mtl == 2.0.1.*   HS-Source-Dirs:       src-  Ghc-Options:		-O2 -Wall+  Ghc-Options:          -O2 -Wall  Executable at_model_rescore_data-  HS-Source-Dirs:       src+  HS-Source-Dirs:       utils   main-is:              model_rescore_data.hs-  Ghc-Options:		-O2+  Build-Depends:        base >= 4 && < 5, alpino-tools, conduit == 0.4.*+  Ghc-Options:          -O2 -Wall  Executable at_model_filter_data-  HS-Source-Dirs:       src+  HS-Source-Dirs:       utils   main-is:              model_filter_data.hs-  Ghc-Options:		-O2+  Build-Depends:        base >= 4 && < 5, alpino-tools, conduit == 0.4.*,+                        containers == 0.4.*, utf8-string == 0.3.*+  Ghc-Options:          -O2 -Wall  Executable at_model_oracle-  HS-Source-Dirs:       src+  HS-Source-Dirs:       utils   main-is:              model_oracle.hs-  Ghc-Options:		-O2+  Build-Depends:        base >= 4 && < 5, alpino-tools, conduit == 0.4.*+  Ghc-Options:          -O2 -Wall  Executable at_model_random_sample-  HS-Source-Dirs:       src+  HS-Source-Dirs:       utils   main-is:              model_random_sample.hs-  Ghc-Options:		-O2+  Build-Depends:        base >= 4 && < 5, alpino-tools, conduit == 0.4.*,+                        resourcet == 0.3.*, mtl == 2.0.1.*,+                        MonadRandom == 0.1.*+  Ghc-Options:          -O2 -Wall -fno-warn-orphans  Executable at_model_statistics_data-  HS-Source-Dirs:       src+  HS-Source-Dirs:       utils   main-is:              model_statistics_data.hs-  Ghc-Options:		-O2+  Build-Depends:        base >= 4 && < 5, alpino-tools, conduit == 0.4.*+  Ghc-Options:          -O2 -Wall
src/Data/Alpino/Model.hs view
@@ -29,6 +29,8 @@                            trainingInstanceToBs                          ) where +import Control.Monad (liftM)+import Control.Monad.Random.Class (MonadRandom) import qualified Data.ByteString as B import Data.ByteString.Internal (c2w) import Data.ByteString.Lex.Double (readDouble)@@ -37,8 +39,7 @@ import Data.Maybe (fromJust) import qualified Data.Set as Set import GHC.Word (Word8)-import System.Random (RandomGen)-import System.Random.Shuffle (shuffle')+import System.Random.Shuffle (shuffleM) import Text.Printf (printf)  -- | A training instance.@@ -68,11 +69,11 @@  -- | Find the highest score of a context. bestScore :: [TrainingInstance] -> Double-bestScore = foldl (\acc e -> max acc $ instanceScore e) 0.0+bestScore = foldl (\acc -> max acc . instanceScore) 0.0  -- | Find the highest score of a context (strict). bestScore' :: [TrainingInstance] -> Double-bestScore' = foldl' (\acc e -> max acc $ instanceScore e) 0.0+bestScore' = foldl' (\acc -> max acc . instanceScore) 0.0  -- | -- Read a training instance from a `BU.ByteString`.@@ -157,7 +158,7 @@ filterFeatures f keepFeatures i =     i { instanceFeatures = FeaturesList $ filter keep $                    parsedFeatures $ instanceFeatures i}-    where keep fv = f $ Set.member (feature fv) keepFeatures+    where keep = f . flip Set.member keepFeatures . feature  -- | -- Filter features by their functor. A modifier function can be applied,@@ -167,17 +168,16 @@ filterFeaturesFunctor f keepFeatures i =     i { instanceFeatures = FeaturesList $ filter keep $ parsedFeatures $                    instanceFeatures i}-    where keep fv = f $ Set.member (functor $ feature fv) keepFeatures+    where keep = f . flip Set.member keepFeatures . functor . feature           functor func = B.split argOpen func !! 0           argOpen = c2w '('  -- | Extract a random sample from a list of instances.-randomSample :: RandomGen g => g -> Int -> [TrainingInstance] ->-                [TrainingInstance]-randomSample g n i-    | instLen <= n = i-    | otherwise = take n $ shuffle' i instLen g-    where instLen = length i+randomSample :: MonadRandom m => Int -> [TrainingInstance] ->+  m [TrainingInstance]+randomSample n i+  | length i <= n = return $ i+  | otherwise     = take n `liftM` shuffleM i  -- | -- Convert the quality scores to binary scores. The instances
+ src/Data/Alpino/Model/Conduit.hs view
@@ -0,0 +1,115 @@+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE DoAndIfThenElse #-}++module Data.Alpino.Model.Conduit (+  addNewLine,+  bestScore,+  concat,+  filterFeatures,+  filterFeaturesFunctor,+  groupByKey,+  randomSample,+  scoreToBinary,+  scoreToBinaryNorm,+  scoreToNorm,+  bsToTrainingInstance,+  trainingInstanceToBS+) where++import           Prelude hiding (concat)+import           Control.Exception.Base (Exception)+import           Control.Monad.Random.Class (MonadRandom(..))+import qualified Data.Alpino.Model as AM+import qualified Data.ByteString as B+import           Data.Conduit (Conduit, ConduitStateResult(StateProducing),+                   conduitState)+import qualified Data.Conduit.List as CL+import qualified Data.Set as Set+import Data.Typeable+import Control.Monad.Trans.Resource (MonadThrow (..))++data InvalidDataException = InvalidDataException String+  deriving Typeable++instance Exception InvalidDataException++instance Show InvalidDataException where+  show (InvalidDataException e) = show e++addNewLine :: Monad m => Conduit B.ByteString m B.ByteString+addNewLine =+  CL.map (\bs -> B.snoc bs 10)++-- | Retrieve the best score from a list of training instances.+bestScore :: Monad m => Conduit [AM.TrainingInstance] m Double+bestScore = CL.map AM.bestScore'++concat :: Monad m => Conduit [a] m a+concat =+  conduitState+    ()+    (\_ v -> return $ StateProducing () v)+    (\_   -> return [])+++-- |+-- Filter features by exact names. A modifier function can be applied,+-- for instance, the 'not' function would exclude the specified features.+filterFeatures :: Monad m => (Bool -> Bool) -> Set.Set B.ByteString ->+  Conduit AM.TrainingInstance m AM.TrainingInstance+filterFeatures f keepFeatures = CL.map (AM.filterFeatures f keepFeatures)++-- |+-- Filter features by their functor. A modifier function can be applied,+-- for instance, the 'not' function would exclude the specified features.+filterFeaturesFunctor :: Monad m => (Bool -> Bool) -> Set.Set B.ByteString ->+  Conduit AM.TrainingInstance m AM.TrainingInstance+filterFeaturesFunctor f keepFeatures =+    CL.map (AM.filterFeaturesFunctor f keepFeatures)++-- | Group training instances by key.+groupByKey :: Monad m =>+           Conduit AM.TrainingInstance m [AM.TrainingInstance]+groupByKey = CL.groupBy keyEq+    where keyEq i1 i2 = AM.instanceType i1 == AM.instanceType i2 &&+                        AM.instanceKey i1 == AM.instanceKey i2++randomSample :: MonadRandom m => Int ->+  Conduit [AM.TrainingInstance] m [AM.TrainingInstance]+randomSample size = CL.mapM $ AM.randomSample size++-- |+-- Conduit recaculating scores to binary scores (/1.0/ for best,+-- /0.0/ for the rest).+scoreToBinary :: Monad m =>+  Conduit [AM.TrainingInstance] m [AM.TrainingInstance]+scoreToBinary = CL.map AM.scoreToBinary++-- |+-- Conduit recalculating scores, dividing a score of /1.0/ uniformly+-- over instances with the highest quality score.+scoreToBinaryNorm :: Monad m =>+  Conduit [AM.TrainingInstance] m [AM.TrainingInstance]+scoreToBinaryNorm = CL.map AM.scoreToBinaryNorm++-- |+-- Conduit that normalized instance scores over all instances+-- in the list.+scoreToNorm :: Monad m =>+  Conduit [AM.TrainingInstance] m [AM.TrainingInstance]+scoreToNorm = CL.map AM.scoreToNorm++-- XXX: Use proper serialization?+bsToTrainingInstance :: MonadThrow m => Conduit B.ByteString m AM.TrainingInstance+bsToTrainingInstance = CL.mapM cvtBS+  where+    cvtBS b =+      case AM.bsToTrainingInstance b of+        Just i -> return $ i+        Nothing -> monadThrow $+          InvalidDataException "Could not parse instance."++-- XXX: Use some proper serialization here?+-- | Convert `TrainingInstance`s to `B.ByteString`s.+trainingInstanceToBS :: Monad m => Conduit AM.TrainingInstance m B.ByteString+trainingInstanceToBS = CL.map AM.trainingInstanceToBs
− src/Data/Alpino/Model/Enumerator.hs
@@ -1,180 +0,0 @@-{-# OPTIONS_GHC -XDeriveDataTypeable #-}--- |--- Module      : Data.Alpino.Model.Enumerator--- Copyright   : (c) 2010 Daniël de Kok--- License     : Apache 2------ Maintainer  : Daniël de Kok <me@danieldk.eu>--- Stability   : experimental------ Enumerators derived from Data.Alpino.Model--module Data.Alpino.Model.Enumerator ( bestScore,-                                      concat,-                                      groupBy,-                                      groupByKey,-                                      filterFeatures,-                                      filterFeaturesFunctor,-                                      instanceGenerator,-                                      instanceParser,-                                      lineEnum,-                                      printByteString,-                                      randomSample,-                                      scoreToBinary,-                                      scoreToBinaryNorm,-                                      scoreToNorm-                                    ) where--import Prelude hiding (concat, filter, mapM)-import Control.Exception.Base (Exception)-import Control.Monad.IO.Class (MonadIO(..), liftIO)-import Control.Monad.Trans.Class (lift)-import qualified Data.Alpino.Model as AM-import qualified Data.ByteString as B-import qualified Data.ByteString.UTF8 as BU-import qualified Data.Enumerator.List as EL-import Data.Enumerator hiding (isEOF, head, length, map)-import qualified Data.Set as Set-import Data.Typeable-import System.IO (isEOF)-import System.Random (getStdRandom, split)--data InvalidDataException = InvalidDataException String-                            deriving Typeable--instance Exception InvalidDataException--instance Show InvalidDataException where-    show (InvalidDataException e) = show e---- | Retrieve the best score from a list of training instances.-bestScore :: (Monad m) =>-               Enumeratee [AM.TrainingInstance] Double m b-bestScore = EL.map AM.bestScore'---- |--- Filter features by exact names. A modifier function can be applied,--- for instance, the 'not' function would exclude the specified features.-filterFeatures :: (Monad m) =>  (Bool -> Bool) -> Set.Set B.ByteString ->-                  Enumeratee AM.TrainingInstance AM.TrainingInstance m b-filterFeatures f keepFeatures = EL.map (AM.filterFeatures f keepFeatures)---- |--- Filter features by their functor. A modifier function can be applied,--- for instance, the 'not' function would exclude the specified features.-filterFeaturesFunctor :: (Monad m) =>  (Bool -> Bool) -> Set.Set B.ByteString ->-                         Enumeratee AM.TrainingInstance AM.TrainingInstance m b-filterFeaturesFunctor f keepFeatures =-    EL.map (AM.filterFeaturesFunctor f keepFeatures)---- | Enumeratee grouping chunks according to an equality function.-groupBy :: (Monad m, Eq a) => (a -> a -> Bool) ->-           Enumeratee a [a] m b-groupBy f = loop-    where loop (Continue k) = do-            h <- peek-            case h of-              Nothing -> return $ Continue k-              Just e -> do-                     xs <- EL.takeWhile $ f e-                     newStep <- lift $ runIteratee $ k $ Chunks [xs]-                     loop newStep-          loop step = return step---- | Group training instances by key.-groupByKey :: (Monad m) =>-           Enumeratee AM.TrainingInstance [AM.TrainingInstance] m b-groupByKey = groupBy keyEq-    where keyEq i1 i2 = AM.instanceType i1 == AM.instanceType i2 &&-                        AM.instanceKey i1 == AM.instanceKey i2---- | Enumeratee that converts `BU.ByteString` to `AM.TrainingInstance`.-instanceParser :: (Monad m) =>-                  Enumeratee BU.ByteString AM.TrainingInstance m b-instanceParser = mapMaybeEnum (InvalidDataException "Could not parse instance.")-                 AM.bsToTrainingInstance---- | Enumeratee that converts `AM.TrainingInstance` to `B.ByteString`.-instanceGenerator :: (Monad m) =>-                     Enumeratee AM.TrainingInstance B.ByteString m b-instanceGenerator = EL.map AM.trainingInstanceToBs---- | Enumerator of lines read from the standard input.-lineEnum :: MonadIO m => Enumerator B.ByteString m b-lineEnum = Iteratee . loop-    where loop (Continue k) = do-            eof <- liftIO isEOF-            case eof of-              True -> return $ Continue k-              False -> do-                       line <- liftIO B.getLine-                       runIteratee (k (Chunks [line])) >>= loop-          loop step = return step---- | Enumeratee concatenating lists.-concat :: (Monad m) =>-              Enumeratee [a] a m b-concat = loop-    where loop (Continue k) = do-            h <- EL.head-            case h of-              Nothing -> return $ Continue k-              Just e -> do-                     newStep <- lift $ runIteratee $ k $ Chunks e-                     loop newStep-          loop step = return step--mapMaybeEnum :: (Exception e, Monad m) => e -> (ao -> Maybe ai) ->-                Enumeratee ao ai m b-mapMaybeEnum exception f = loop where-    loop = checkDone $ continue . step-    step k EOF = yield (Continue k) EOF-    step k (Chunks []) = continue $ step k-    step k (Chunks xs) = case mapMaybeMaybe f xs of-                     Just ys -> k (Chunks ys) >>== loop-                     Nothing -> throwError exception---- If one function application fails return Nothing, otherwise Just xs-mapMaybeMaybe :: (a -> Maybe b) -> [a] -> Maybe [b]-mapMaybeMaybe _ []     = Just []-mapMaybeMaybe f (x:xs) = do-  r <- f x-  rs <- mapMaybeMaybe f xs-  return $ r:rs---- | Iterator printing `B.ByteString` to the standard output.-printByteString :: MonadIO m => Iteratee B.ByteString m ()-printByteString = continue step-    where step (Chunks []) = continue step-          step (Chunks xs) = liftIO (mapM_ B.putStrLn xs) >> continue step-          step EOF = yield () EOF---- | Extract a random sample of @n@ instances from a context.-randomSample :: (MonadIO m) => Int ->-                Enumeratee [AM.TrainingInstance] [AM.TrainingInstance] m b-randomSample n = EL.mapM (liftIO . sampleFun)-    where sampleFun :: [AM.TrainingInstance] -> IO [AM.TrainingInstance]-          sampleFun i = do-            gen <- getStdRandom split-            return $ AM.randomSample gen n i---- |--- Enumerator recaculating scores to binary scores (/1.0/ for best,--- /0.0/ for the rest).-scoreToBinary :: (Monad m) =>-                 Enumeratee [AM.TrainingInstance] [AM.TrainingInstance] m b-scoreToBinary = EL.map AM.scoreToBinary---- |--- Enumerator recalculating scores, dividing a score of /1.0/ uniformly--- over instances with the highest quality score.-scoreToBinaryNorm :: (Monad m) =>-                     Enumeratee [AM.TrainingInstance] [AM.TrainingInstance] m b-scoreToBinaryNorm = EL.map AM.scoreToBinaryNorm---- |--- Enumerator that normalized instance scores over all instances--- in the list.-scoreToNorm :: (Monad m) =>-               Enumeratee [AM.TrainingInstance] [AM.TrainingInstance] m b-scoreToNorm = EL.map AM.scoreToNorm
− src/model_filter_data.hs
@@ -1,61 +0,0 @@-module Main where--import Prelude hiding (concat)--import Control.Monad (unless)-import Data.Alpino.Model.Enumerator-import Data.ByteString.UTF8 (fromString)-import Data.Enumerator (($$), joinI, run_)-import Data.List as L-import qualified Data.Set as Set-import System.Console.GetOpt-import System.Environment-import System.Exit-import System.IO--main :: IO ()-main = do-  (options, args) <- getOptions--  let filter0 = if elem FilterFeatures options-                then filterFeatures-                else filterFeaturesFunctor-  let filter = if elem InverseFilter options-               then filter0 not-               else filter0 id--  unless (not $ null args) $ do-         name <- getProgName-         hPutStrLn stderr $ usageInfo (usage name) optionInfo-         exitFailure--  let keepFeatures = Set.fromList $ map fromString args--  run_ $ lineEnum $$ joinI $ instanceParser $$-       joinI $ filter keepFeatures $$-       joinI $ instanceGenerator $$ printByteString--data Option = FilterFeatures | FilterFunctors | InverseFilter-            deriving Eq--optionInfo :: [OptDescr Option]-optionInfo =-    [ Option ['f'] ["functor"] (NoArg FilterFunctors) "filter feature functors",-      Option ['i'] ["inverse"] (NoArg InverseFilter) "exclude specified features"]--usage :: String -> String-usage name = "Usage: " ++ name ++ " <OPTION> [FEATURES]\n"--getOptions :: IO ([Option], [String])-getOptions = do-  args <- getArgs-  let (options, keep, errors) = getOpt Permute optionInfo args-  unless (null errors) $ do-               name <- getProgName-               hPutStrLn stderr $ L.concat errors-               hPutStrLn stderr $ usageInfo (usage name) optionInfo-               exitFailure--  case options of-    []        -> return ([FilterFeatures], keep)-    otherwise -> return (options, keep)
− src/model_oracle.hs
@@ -1,26 +0,0 @@-{-# OPTIONS -XBangPatterns #-}--module Main where--import Prelude hiding (concat, filter)--import Data.Alpino.Model.Enumerator-import Data.Enumerator hiding (isEOF, length)-import Data.List (genericLength)-import Text.Printf (printf)--sumCount :: (Monad m, Fractional a, Integral b) => Iteratee a m (a, b)-sumCount = continue $ step (0.0, 0)-    where step acc (Chunks []) = continue $ step acc-          step (!sumAcc, !lenAcc) (Chunks xs) =-              continue $ step (sumAcc + sum xs, lenAcc + genericLength xs)-          step acc EOF = yield acc EOF--main :: IO ()-main = do-  (scoreSum, scoreLen) <- run_ $ lineEnum $$ joinI $ instanceParser $$-                          joinI $ groupByKey $$-                          joinI $ bestScore $$ sumCount-  putStrLn $ "Contexts: " ++ (show scoreLen)-  putStrLn $ "Oracle: " ++ (printf("%.4f") $ scoreSum / fromIntegral scoreLen)-
− src/model_random_sample.hs
@@ -1,41 +0,0 @@-module Main where--import Prelude hiding (concat)--import Control.Monad (unless)-import Data.Alpino.Model.Enumerator-import Data.Enumerator (($$), joinI, run_)-import qualified Data.List as L-import System.Console.GetOpt-import System.Environment-import System.Exit-import System.IO--main :: IO ()-main = do-  options <- getOptions-  let (SampleSize n) = head options    -  run_ $ lineEnum $$ joinI $ instanceParser $$ joinI $ groupByKey $$-       joinI $ randomSample n $$ joinI $ concat $$-       joinI $ instanceGenerator $$ printByteString--data Option = SampleSize Int--optionInfo :: [OptDescr Option]-optionInfo =-    [ Option "n" ["sample_size"] (ReqArg (\n -> SampleSize . read $ n) "NUMBER")-                 "random sample size"]--usage :: String -> String-usage name = "Usage: " ++ name ++ " <OPTION>\n"--getOptions :: IO ([Option])-getOptions = do-  args <- getArgs-  let (options, _, errors) = getOpt Permute optionInfo args-  unless (null errors && length options == 1) $ do-               name <- getProgName-               hPutStrLn stderr $ L.concat errors-               hPutStrLn stderr $ usageInfo (usage name) optionInfo-               exitFailure-  return options
− src/model_rescore_data.hs
@@ -1,47 +0,0 @@-module Main where--import Prelude hiding (concat)--import Control.Monad (unless)-import Data.Alpino.Model.Enumerator-import Data.Enumerator (($$), joinI, run_)-import qualified Data.List as L-import System.Console.GetOpt-import System.Environment-import System.Exit-import System.IO--main :: IO ()-main = do-  option <- getOptions-  let score = case option of-                Binary           -> scoreToBinary-                BinaryNormalized -> scoreToBinaryNorm-                Normalized       -> scoreToNorm-    -  run_ $ lineEnum $$ joinI $ instanceParser $$ joinI $ groupByKey $$-       joinI $ score $$ joinI $ concat $$-       joinI $ instanceGenerator $$ printByteString--data Option = Binary | Normalized | BinaryNormalized--optionInfo :: [OptDescr Option]-optionInfo =-    [ Option ['b'] ["binary"] (NoArg Binary) "convert to binary scores",-      Option ['i'] ["binary_normalize"] (NoArg BinaryNormalized)-                 "binary normalize over context",-      Option ['n'] ["normalize"] (NoArg Normalized) "normalize over context" ]--usage :: String -> String-usage name = "Usage: " ++ name ++ " <OPTION>\n"--getOptions :: IO (Option)-getOptions = do-  args <- getArgs-  let (options, _, errors) = getOpt Permute optionInfo args-  unless (null errors && length options == 1) $ do-               name <- getProgName-               hPutStrLn stderr $ L.concat errors-               hPutStrLn stderr $ usageInfo (usage name) optionInfo-               exitFailure-  return $ head options
− src/model_statistics_data.hs
@@ -1,29 +0,0 @@-{-# OPTIONS -XBangPatterns #-}--module Main where--import Prelude hiding (concat, filter)--import qualified Data.Alpino.Model as AM-import Data.Alpino.Model.Enumerator-import Data.Enumerator hiding (isEOF, length, map)-import Data.List (genericLength)-import Text.Printf (printf)--statistics :: Monad m => Iteratee [AM.TrainingInstance] m (Int, Int, Int)-statistics = continue $ step (0, 0, 0)-    where step acc (Chunks []) = continue $ step acc-          step (!lenSumAcc, !lenAcc, !maxLenAcc) (Chunks xs) =-              continue $ (step $ (lenSumAcc + (sum $ map length xs),-                                  lenAcc + genericLength xs,-                                  max maxLenAcc $ maximum $ map length xs))-          step acc EOF = yield acc EOF--main :: IO ()-main = do-  (lenSum, len, maxLen) <- run_ $ lineEnum $$ joinI $ instanceParser $$-                           joinI $ groupByKey $$ statistics-  putStrLn $ "Contexts: " ++ (show len)-  putStrLn $ "Max. events: " ++ (show maxLen)-  putStrLn $ "Avg. events: " ++ (printf "%.2f" $ (fromIntegral lenSum / fromIntegral len :: Double))-
+ utils/model_filter_data.hs view
@@ -0,0 +1,62 @@+module Main where++import Prelude hiding (concat)++import Control.Monad (unless)+import Data.Alpino.Model.Conduit+import Data.ByteString.UTF8 (fromString)+import Data.Conduit (runResourceT, ($=), ($$))+import qualified Data.Conduit.Binary as CB+import Data.List as L+import qualified Data.Set as Set+import System.Console.GetOpt+import System.Environment+import System.Exit+import System.IO++main :: IO ()+main = do+  (options, args) <- getOptions++  let filter0 = if elem FilterFeatures options+                then filterFeatures+                else filterFeaturesFunctor+  let filter1 = if elem InverseFilter options+               then filter0 not+               else filter0 id++  unless (not $ null args) $ do+         name <- getProgName+         hPutStrLn stderr $ usageInfo (usage name) optionInfo+         exitFailure++  let keepFeatures = Set.fromList $ map fromString args++  runResourceT (CB.sourceHandle stdin $= CB.lines $= bsToTrainingInstance $=+    filter1 keepFeatures $= trainingInstanceToBS $= addNewLine $$+    CB.sinkHandle stdout)++data Option = FilterFeatures | FilterFunctors | InverseFilter+            deriving Eq++optionInfo :: [OptDescr Option]+optionInfo =+    [ Option ['f'] ["functor"] (NoArg FilterFunctors) "filter feature functors",+      Option ['i'] ["inverse"] (NoArg InverseFilter) "exclude specified features"]++usage :: String -> String+usage name = "Usage: " ++ name ++ " <OPTION> [FEATURES]\n"++getOptions :: IO ([Option], [String])+getOptions = do+  args <- getArgs+  let (options, keep, errors) = getOpt Permute optionInfo args+  unless (null errors) $ do+               name <- getProgName+               hPutStrLn stderr $ L.concat errors+               hPutStrLn stderr $ usageInfo (usage name) optionInfo+               exitFailure++  case options of+    []        -> return ([FilterFeatures], keep)+    _         -> return (options, keep)
+ utils/model_oracle.hs view
@@ -0,0 +1,28 @@+{-# OPTIONS -XBangPatterns #-}++module Main where++import Prelude hiding (concat, filter)++import Data.Alpino.Model.Conduit+import Data.Conduit (Sink, runResourceT, ($=), ($$))+import qualified Data.Conduit.Binary as CB+import qualified Data.Conduit.List as CL+import System.IO (stdin)+import Text.Printf (printf)++sumCount :: (Monad m, Fractional a, Integral b) => Sink a m (a, b)+sumCount =+	CL.fold handleCtx (0, 0)+	where+		handleCtx (!scoreSum, !ctxs) score =+			(scoreSum + score, ctxs + 1)++main :: IO ()+main = do+  (scoreSum, scoreLen) <- runResourceT (CB.sourceHandle stdin $= CB.lines $=+  	bsToTrainingInstance $= groupByKey $= bestScore $$ sumCount) :: IO (Double, Int)++  putStrLn $ printf "Contexts: %d" scoreLen+  putStrLn $ printf "Oracle: %.4f" (scoreSum / fromIntegral scoreLen)+
+ utils/model_random_sample.hs view
@@ -0,0 +1,51 @@+module Main where++import Prelude hiding (concat)++import Control.Monad (unless)+import Control.Monad.Random (MonadRandom(..))+import Control.Monad.Trans (lift)+import Control.Monad.Trans.Resource (ResourceT)+import Data.Alpino.Model.Conduit+import Data.Conduit (($=), ($$), runResourceT)+import qualified Data.Conduit.Binary as CB+import qualified Data.List as L+import System.Console.GetOpt+import System.Environment+import System.Exit+import System.IO++instance MonadRandom m => MonadRandom (ResourceT m) where+  getRandom   = lift getRandom+  getRandoms  = lift getRandoms+  getRandomR  = lift . getRandomR+  getRandomRs = lift . getRandomRs++main :: IO ()+main = do+  options <- getOptions+  let (SampleSize n) = head options    +  runResourceT (CB.sourceHandle stdin $= CB.lines $= bsToTrainingInstance $=+    groupByKey $= randomSample n $= concat $=+    trainingInstanceToBS $= addNewLine $$ CB.sinkHandle stdout)++data Option = SampleSize Int++optionInfo :: [OptDescr Option]+optionInfo =+    [ Option "n" ["sample_size"] (ReqArg (\n -> SampleSize . read $ n) "NUMBER")+                 "random sample size"]++usage :: String -> String+usage name = "Usage: " ++ name ++ " <OPTION>\n"++getOptions :: IO ([Option])+getOptions = do+  args <- getArgs+  let (options, _, errors) = getOpt Permute optionInfo args+  unless (null errors && length options == 1) $ do+               name <- getProgName+               hPutStrLn stderr $ L.concat errors+               hPutStrLn stderr $ usageInfo (usage name) optionInfo+               exitFailure+  return options
+ utils/model_rescore_data.hs view
@@ -0,0 +1,48 @@+module Main where++import Prelude hiding (concat)++import Control.Monad (unless)+import Data.Alpino.Model.Conduit+import Data.Conduit (runResourceT, ($=), ($$))+import qualified Data.Conduit.Binary as CB+import qualified Data.List as L+import System.Console.GetOpt+import System.Environment+import System.Exit+import System.IO++main :: IO ()+main = do+  option <- getOptions+  let score = case option of+                Binary           -> scoreToBinary+                BinaryNormalized -> scoreToBinaryNorm+                Normalized       -> scoreToNorm++  runResourceT (CB.sourceHandle stdin $= CB.lines $= bsToTrainingInstance $=+    groupByKey $= score $= concat $= trainingInstanceToBS $= addNewLine $$+    CB.sinkHandle stdout)++data Option = Binary | Normalized | BinaryNormalized++optionInfo :: [OptDescr Option]+optionInfo =+    [ Option ['b'] ["binary"] (NoArg Binary) "convert to binary scores",+      Option ['i'] ["binary_normalize"] (NoArg BinaryNormalized)+                 "binary normalize over context",+      Option ['n'] ["normalize"] (NoArg Normalized) "normalize over context" ]++usage :: String -> String+usage name = "Usage: " ++ name ++ " <OPTION>\n"++getOptions :: IO (Option)+getOptions = do+  args <- getArgs+  let (options, _, errors) = getOpt Permute optionInfo args+  unless (null errors && length options == 1) $ do+               name <- getProgName+               hPutStrLn stderr $ L.concat errors+               hPutStrLn stderr $ usageInfo (usage name) optionInfo+               exitFailure+  return $ head options
+ utils/model_statistics_data.hs view
@@ -0,0 +1,34 @@+{-# OPTIONS -XBangPatterns #-}++module Main where++import Prelude hiding (concat, filter)++import qualified Data.Alpino.Model as AM+import Data.Alpino.Model.Conduit+import Data.Conduit (Sink, runResourceT, ($=), ($$))+import qualified Data.Conduit.Binary as CB+import qualified Data.Conduit.List as CL+import Data.List (genericLength)+import System.IO (stdin)+import Text.Printf (printf)++statistics :: Monad m => Sink [AM.TrainingInstance] m (Int, Int, Int)+statistics =+  CL.fold handleCtx (0, 0, 0)+  where+    handleCtx (!evts, !ctxs, !maxCtx) ctx =+      (evts + ctxLen, succ ctxs, max maxCtx ctxLen)+      where+        ctxLen =+          genericLength ctx++main :: IO ()+main = do+  (evts, ctxs, maxCtx) <- runResourceT (CB.sourceHandle stdin $=+    CB.lines $= bsToTrainingInstance $= groupByKey $$ statistics)++  putStrLn $ "Contexts: " ++ (show ctxs)+  putStrLn $ "Max. events: " ++ (show maxCtx)+  putStrLn $ "Avg. events: " ++ (printf "%.2f" $ (fromIntegral evts / fromIntegral ctxs :: Double))+