polimorf 0.3.1 → 0.4.0
raw patch · 2 files changed
+27/−20 lines, 2 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Data.PoliMorf: cat :: Entry -> !Cat
- Data.PoliMorf: Entry :: !Form -> !Base -> !Tag -> Entry
+ Data.PoliMorf: Entry :: !Form -> !Base -> !Tag -> !Cat -> Entry
- Data.PoliMorf: merge :: Monoid m => BaseMap -> Map Form m -> Map Form (Maybe (m, RelCode))
+ Data.PoliMorf: merge :: Ord a => BaseMap -> Map Form (Set a) -> Map Form (Map a RelCode)
Files
- Data/PoliMorf.hs +25/−18
- polimorf.cabal +2/−2
Data/PoliMorf.hs view
@@ -26,7 +26,8 @@ ) where import Control.Applicative ((<$>), (<*>))-import Data.Monoid (Monoid, mappend)+import Data.Maybe (catMaybes)+import Data.Monoid (mappend) import Data.List (foldl') import Data.Binary (Binary, get, put) import qualified Data.Map as M@@ -44,11 +45,15 @@ -- | A morphosyntactic tag. type Tag = T.Text +-- | A category.+type Cat = T.Text+ -- | An entry from the PoliMorf dictionary. data Entry = Entry { form :: !Form , base :: !Base- , tag :: !Tag }+ , tag :: !Tag+ , cat :: !Cat } deriving (Eq, Ord, Show, Read) -- | Read the PoliMorf from the file.@@ -62,7 +67,7 @@ -- | Get an entry pair from a PoliMorf row. parsePoliRow :: L.Text -> Entry parsePoliRow row = case map L.toStrict (L.split (=='\t') row) of- [_form, _base, _tag] -> Entry _form _base _tag+ [_form, _base, _tag, _cat] -> Entry _form _base _tag _cat _ -> error $ "parsePoliRow: invalid row \"" ++ L.unpack row ++ "\"" -- | A map from forms to their possible base forms (there may be many since@@ -92,34 +97,36 @@ c -> error $ "get: invalid RelCode code '" ++ [c] ++ "'" -- | Merge the 'BaseMap' with the dictionary resource which maps forms to--- monoidal labels. Depending on the inference technique there are three--- kinds of labels in the resultant dictionary:+-- sets of labels. Every label is assigned a 'RelCode' which tells what+-- is the relation between the label and the form. There are three+-- kinds of labels: -- 'Exact' labels assigned in a direct manner, 'ByBase' labels assigned -- to all forms which have a base form with a label in the input dictionary, -- and 'ByForm' labels assigned to all forms which have a related form from the -- same lexeme with a label in the input dictionary. ----- For a particular form in the output dictionary there are labels extracted--- with at most one of the methods described above, with 'Exact' labels--- having a precedence over 'ByBase' labels and 'ByBase' labels having--- a precedence over 'ByForm' labels.--- -- This function is far from being memory efficient right now. If you plan to -- run it with respect to the entire PoliMorf dictionary you should do it -- on a machine with an abundance of available memory.-merge :: Monoid m => BaseMap -> M.Map Form m -> M.Map Form (Maybe (m, RelCode))-merge poli dict0 =- M.fromList [(x, combine x) | x <- keys]+merge+ :: Ord a => BaseMap+ -> M.Map Form (S.Set a)+ -> M.Map Form (M.Map a RelCode)+merge poli dict0 = M.fromList+ [ (x, combine x)+ | x <- keys ] where -- Keys in the output dictionary. keys = S.toList (M.keysSet poli `S.union` M.keysSet dict0) -- Combining function.- combine x- | Just y <- M.lookup x dict0 = Just (y, Exact)- | Just y <- M.lookup x dict1 = Just (y, ByBase)- | Just y <- M.lookup x dict2 = Just (y, ByForm)- | otherwise = Nothing+ combine x = (M.unionsWith min . catMaybes)+ [ label Exact <$> M.lookup x dict0 + , label ByBase <$> M.lookup x dict1+ , label ByForm <$> M.lookup x dict2 ]++ label :: Ord a => RelCode -> S.Set a -> M.Map a RelCode+ label code s = M.fromList [(x, code) | x <- S.toList s] -- Extended to all base forms of dict0 keys. dict1 = fromListWith mappend
polimorf.cabal view
@@ -1,5 +1,5 @@ name: polimorf-version: 0.3.1+version: 0.4.0 synopsis: Working with the PoliMorf dictionary description: The library provides functionality for manipulating PoliMorf, the@@ -31,4 +31,4 @@ source-repository head type: git- location: git://github.com/kawu/polimorf.git+ location: https://github.com/kawu/polimorf.git