packages feed

morfette-0.3.6: src/GramLab/Morfette/Token.hs

{-# LANGUAGE OverloadedStrings #-}

module GramLab.Morfette.Token ( Token
                              , Sentence
                              , Emb
                              , tokenForm
                              , tokenEmb
                              , tokenLemma
                              , tokenPOS
                              , parseToken
                              , nullToken
                              , isNullToken 
                              , lowercaseToken
                              )
                               
where
import qualified Data.Vector.Unboxed as U
import GramLab.Utils
import Data.Char
import Debug.Trace
import qualified Data.Text.Lazy as Text
import qualified Data.Text.Lazy.Read as Text


type Emb = U.Vector Double

data Token      = Token { tokenForm :: String
                        , tokenEmb :: Maybe Emb
                        , tokenLemma :: Maybe String
                        , tokenPOS :: Maybe String
                        } deriving (Show, Eq)
type Sentence   = [Token]

token :: String -> Maybe Emb -> Maybe String -> Maybe String -> Token
token f e l p = 
  Token { tokenForm = f, tokenEmb = e, tokenLemma = l, tokenPOS = p }
  
parseToken :: Text.Text -> Token  
parseToken line =
  let str = Text.unpack
      t = 
        case Text.words line of 
          [form, embedding, lemma, pos] -> 
            token   (str form)   (Just (parseEmb embedding))  (Just $ str lemma)  (Just $ str pos)
          [form, lemma, pos]            -> 
            token   (str form)   Nothing                      (Just $ str lemma)  (Just $ str pos)
          [form, embedding]             -> 
            token   (str form)   (Just (parseEmb embedding))  Nothing       Nothing         
          [form]                        -> 
            token   (str form)   Nothing                      Nothing       Nothing
          []                            -> 
            nullToken
  in U.length (maybe U.empty id (tokenEmb t)) `seq` t

nullToken = token "" Nothing Nothing Nothing 
isNullToken t = t == nullToken

parseEmb :: Text.Text -> Emb
parseEmb = U.fromList 
           . map readDouble 
           . filter (not . Text.null)
           . Text.splitOn ","

readDouble :: Text.Text -> Double
readDouble s = 
  case Text.double s of
    Right (d, "") -> d
    Left e        -> error $ "GramLab.Morfette.Token.readDouble: " ++ show e
    _             -> error $ "GramLab.Morfette.Token.readDouble: parse error"

lowercaseToken :: Token -> Token
lowercaseToken t = token (lowercase (tokenForm t)) 
                         (tokenEmb t) 
                         (fmap lowercase (tokenLemma t)) 
                         (fmap lowercase (tokenPOS t))
  where lowercase = map toLower