module NLP.WordNet.PrimTypes where
import Data.Array
import System.IO
import Control.Exception
import Data.Dynamic (Typeable)
type Offset = Integer
data POS = Noun | Verb | Adj | Adv
deriving (Eq, Ord, Show, Ix, Typeable)
allPOS :: [POS]
allPOS = [Noun ..]
data EPOS = POS POS | Satellite | AdjSatellite | IndirectAnt | DirectAnt | UnknownEPos | Pertainym
deriving (Eq, Ord, Typeable)
fromEPOS :: EPOS -> POS
fromEPOS (POS p) = p
fromEPOS _ = Adj
allEPOS :: [EPOS]
allEPOS = [POS Noun ..]
instance Enum POS where
toEnum 1 = Noun
toEnum 2 = Verb
toEnum 3 = Adj
toEnum 4 = Adv
toEnum _ = undefined
fromEnum Noun = 1
fromEnum Verb = 2
fromEnum Adj = 3
fromEnum Adv = 4
enumFrom i = enumFromTo i Adv
enumFromThen i j = enumFromThenTo i j Adv
instance Enum EPOS where
toEnum 1 = POS Noun
toEnum 2 = POS Verb
toEnum 3 = POS Adj
toEnum 4 = POS Adv
toEnum 5 = Satellite
toEnum 6 = AdjSatellite
toEnum _ = undefined
fromEnum (POS Noun) = 1
fromEnum (POS Verb) = 2
fromEnum (POS Adj) = 3
fromEnum (POS Adv) = 4
fromEnum Satellite = 5
fromEnum AdjSatellite = 6
fromEnum _ = 0
enumFrom i = enumFromTo i AdjSatellite
enumFromThen i j = enumFromThenTo i j AdjSatellite
instance Show EPOS where
showsPrec i (POS p) = showsPrec i p
showsPrec _ (Satellite) = showString "Satellite"
showsPrec _ (AdjSatellite) = showString "AdjSatellite"
showsPrec _ (IndirectAnt) = showString "IndirectAnt"
showsPrec _ (DirectAnt) = showString "DirectAnt"
showsPrec _ (Pertainym) = showString "Pertainym"
showsPrec _ (UnknownEPos) = showString "UnknownEPos"
instance Ix EPOS where
range (i,j) = [i..j]
index (i,_) a = fromEnum a fromEnum i
inRange (i,j) a = a `elem` [i..j]
readEPOS :: String -> EPOS
readEPOS "n" = POS Noun
readEPOS "v" = POS Verb
readEPOS "a" = POS Adj
readEPOS "r" = POS Adv
readEPOS "s" = Satellite
readEPOS _ = undefined
data WordNetEnv =
WordNetEnv {
dataHandles :: Array POS (Handle, Handle),
excHandles :: Array POS Handle,
senseHandle,
countListHandle,
keyIndexHandle,
revKeyIndexHandle :: Maybe Handle,
vSentHandle :: Maybe (Handle, Handle),
wnReleaseVersion :: Maybe String,
dataDirectory :: FilePath,
warnAbout :: String -> SomeException -> IO ()
}
wordNetEnv0 :: WordNetEnv
wordNetEnv0 = WordNetEnv {
dataHandles = undefined,
excHandles = undefined,
senseHandle = Nothing,
countListHandle = Nothing,
keyIndexHandle = Nothing,
revKeyIndexHandle = Nothing,
vSentHandle = Nothing,
wnReleaseVersion = Nothing,
dataDirectory = "",
warnAbout = \_ _ -> return ()
}
data SenseKey =
SenseKey {
senseKeyPOS :: POS,
senseKeyString :: String,
senseKeyWord :: String
} deriving (Show, Typeable)
newtype Key = Key (Offset, POS) deriving (Eq, Typeable)
data Synset =
Synset {
hereIAm :: Offset,
ssType :: EPOS,
fnum :: Int,
pos :: EPOS,
ssWords :: [(String, Int, SenseType)],
whichWord :: Maybe Int,
forms :: [(Form, Offset, EPOS, Int, Int)],
frames :: [(Int, Int)],
defn :: String,
key :: Maybe Offset,
searchType :: Int,
headWord :: String,
headSense :: SenseType
}
synset0 :: Synset
synset0 = Synset 0 UnknownEPos (1) undefined [] Nothing [] [] "" Nothing (1) "" AllSenses
data SearchResult =
SearchResult {
srSenseKey :: Maybe SenseKey,
srOverview :: Maybe Overview,
srIndex :: Maybe Index,
srSenseNum :: Maybe SenseType,
srSynset :: Synset
} deriving (Typeable)
data Index =
Index {
indexWord :: String,
indexPOS :: EPOS,
indexSenseCount :: Int,
indexForms :: [Form],
indexTaggedCount :: Int,
indexOffsets :: [Offset]
} deriving (Eq, Ord, Show, Typeable)
index0 :: Index
index0 = Index "" (POS Noun) (1) [] (1) []
data Form = Antonym | Hypernym | Hyponym | Entailment | Similar
| IsMember | IsStuff | IsPart
| HasMember | HasStuff | HasPart
| Meronym | Holonym | CauseTo | PPL | SeeAlso
| Attribute | VerbGroup | Derivation | Classification | Class | Nominalization
| Syns | Freq | Frames | Coords | Relatives | HMeronym | HHolonym | WNGrep | OverviewForm
| Unknown
deriving (Eq, Ord, Show, Enum, Typeable)
data SenseType = AllSenses | SenseNumber Int deriving (Eq, Ord, Show, Typeable)
instance Num SenseType where
fromInteger = SenseNumber . fromInteger
SenseNumber n + SenseNumber m = SenseNumber $ n+m
_ + _ = AllSenses
SenseNumber n SenseNumber m = SenseNumber $ nm
_ _ = AllSenses
SenseNumber n * SenseNumber m = SenseNumber $ n*m
_ * _ = AllSenses
negate (SenseNumber n) = SenseNumber $ negate n
negate x = x
abs (SenseNumber n) = SenseNumber $ abs n
abs x = x
signum (SenseNumber n) = SenseNumber $ signum n
signum x = x
data Overview =
Overview {
nounIndex,
verbIndex,
adjIndex,
advIndex :: Maybe Index
} deriving (Eq, Ord, Show, Typeable)