-----------------------------------------------------------------------------
-- |
-- Module : NLP.WordNet.Types
-- Copyright : (c) Hal Daume III 2003-2004
-- License : BSD-style
--
-- Maintainer : hdaume@isi.edu
-- Stability : experimental
-- Portability : non-portable (H98 + implicit parameters)
--
-- This module is maintained at:
-- .
--
-- This module describes the types used in the purely functional interface.
--
-- More information about WordNet is available at:
-- .
-------------------------------------------------------------------------------
module NLP.WordNet.Types
(
-- * The wrapper type for wordnet functions.
WN(),
-- * The basic Word type (just a 'String').
Word,
-- * The part of speech type.
POS(..),
-- * The type, and functions dealing with overview searches.
Overview(),
numNounSenses,
numVerbSenses,
numAdjSenses,
numAdvSenses,
taggedCountNounSenses,
taggedCountVerbSenses,
taggedCountAdjSenses,
taggedCountAdvSenses,
-- * The type, and functions dealing with the word net environment.
WordNetEnv(),
getReleaseVersion,
getDataDirectory,
-- The type, and functions dealing with senses.
-- SenseKey(),
-- senseKeyPOS,
-- senseKeyWord,
-- * The type to control which sense a search is looking at.
SenseType(..),
-- * The type, and functions dealing with search results.
SearchResult(),
srOverview,
srSenseNum,
srPOS,
srDefinition,
srSenses,
srWords,
srForms,
srFormKeys,
srToKey,
-- The type, and functions dealing with indices.
-- Index(),
-- indexWord,
-- indexPOS,
-- * A sum type of the different relations which can hold between words.
Form(..),
-- * A simple key into the database.
Key(),
)
where
import Data.List
import Data.Maybe
import NLP.WordNet.PrimTypes
import NLP.WordNet.Util
-- | In actuality this type is:
--
-- > type WN a = (?wne :: WordNetEnv) => a
--
-- but Haddock cannot parse this at this time.
-- type WN a = a
type WN a = (?wne :: WordNetEnv) => a
-- | A Word is just a String.
type Word = String
-- basically, all we do is wrap the SenseKey, Synset and WordNetEnv
-- datatypes in a bunch of useful functions
-- | This will give you the current release of the WordNet databases
-- we are using (if we know).
getReleaseVersion :: WN (Maybe String)
getReleaseVersion = wnReleaseVersion ?wne
-- | This will give you the directory from which the databases are being read.
getDataDirectory :: WN FilePath
getDataDirectory = dataDirectory ?wne
-- | Given an 'Overview', this will tell you how many noun senses the searched-for word has.
numNounSenses :: Overview -> Int
numNounSenses = maybe 0 indexSenseCount . nounIndex
-- | Given an 'Overview', this will tell you how many verb senses the searched-for word has.
numVerbSenses :: Overview -> Int
numVerbSenses = maybe 0 indexSenseCount . verbIndex
-- | Given an 'Overview', this will tell you how many adjective senses the searched-for word has.
numAdjSenses :: Overview -> Int
numAdjSenses = maybe 0 indexSenseCount . adjIndex
-- | Given an 'Overview', this will tell you how many adverb senses the searched-for word has.
numAdvSenses :: Overview -> Int
numAdvSenses = maybe 0 indexSenseCount . advIndex
-- | Given an 'Overview', this will tell you how many times this word was tagged as a noun.
taggedCountNounSenses :: Overview -> Int
taggedCountNounSenses = maybe 0 indexTaggedCount . nounIndex
-- | Given an 'Overview', this will tell you how many times this word was tagged as a verb.
taggedCountVerbSenses :: Overview -> Int
taggedCountVerbSenses = maybe 0 indexTaggedCount . verbIndex
-- | Given an 'Overview', this will tell you how many times this word was tagged as an adjective.
taggedCountAdjSenses :: Overview -> Int
taggedCountAdjSenses = maybe 0 indexTaggedCount . adjIndex
-- | Given an 'Overview', this will tell you how many times this word was tagged as an adverb.
taggedCountAdvSenses :: Overview -> Int
taggedCountAdvSenses = maybe 0 indexTaggedCount . advIndex
-- | This gives the part of speech of a 'SearchResult'
srPOS :: SearchResult -> POS
srPOS sr = case pos (srSynset sr) of { POS p -> p; _ -> Adj }
-- | This gives the definition of the sense of a word in a 'SearchResult'.
srDefinition :: SearchResult -> String
srDefinition = defn . srSynset
-- | This gives a list of senses the word has.
srSenses :: SearchResult -> [SenseType]
srSenses = nub . map thr3 . ssWords . srSynset
-- | This gives the actual words used to describe the Synset of a search result.
srWords :: SearchResult -> SenseType -> [Word]
srWords sr t = nub . map fst3 . filter (isType t . thr3) . ssWords . srSynset $ sr
where isType AllSenses _ = True
isType _ AllSenses = True
isType (SenseNumber n) (SenseNumber m) = n == m
-- | This gives all the 'Form's a word has (i.e., what sort of relations hold between
-- it and other words.
srForms :: SearchResult -> [Form]
srForms = nub . map (\ (f,_,_,_,_) -> f) . forms . srSynset
-- | This provides a 'Key' (which can be searched for using 'lookupKey') for
-- a 'SearchResult' under a given form. For instance, it can be used to
-- get all 'Hypernym's of a given word.
srFormKeys :: SearchResult -> Form -> [Key]
srFormKeys sr f = nub . mapMaybe mkKey . filter (\ (f',_,_,_,_) -> f == f') . forms . srSynset $ sr
where mkKey (_,o,POS p,_,_) = Just $ Key (o,p)
mkKey (_,o,_,_,_) =
case srSenseKey sr of
Nothing -> Nothing
Just sk -> Just $ Key (o, senseKeyPOS sk)
-- | This converts a 'SearchResult' into a 'Key'.
srToKey :: SearchResult -> Key -- returns the key associated with this search result
srToKey sr = Key (hereIAm $ srSynset sr, p)
where p = case srSenseKey sr of
Just sk -> senseKeyPOS sk
Nothing -> case pos (srSynset sr) of
POS pp -> pp
_ -> case ssType (srSynset sr) of
POS pp -> pp
_ -> Adj