diff options
Diffstat (limited to 'contrib/eaglesconv/EaglesMatcher.hs')
| -rw-r--r-- | contrib/eaglesconv/EaglesMatcher.hs | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/contrib/eaglesconv/EaglesMatcher.hs b/contrib/eaglesconv/EaglesMatcher.hs new file mode 100644 index 000000000..27e76706f --- /dev/null +++ b/contrib/eaglesconv/EaglesMatcher.hs @@ -0,0 +1,63 @@ +-- Copyright (C) 2011 Nikita Frolov + +-- The format specification can be found at +-- http://devel.cpl.upc.edu/freeling/svn/trunk/doc/tagsets/tagset-ru.html + +-- Bugs in the specification: +-- Participle, 2nd field: case, not mood +-- Participle, 6th field: field, not person +-- Verb, persons can be denoted both with 'Pnumber' or just 'number' +-- Noun, 10th field can be absent + +-- No, it wouldn't be simpler to implement this grammar with Parsec or another +-- parser combinator library. + + +module EaglesMatcher where + +import qualified Data.Text as T +import Data.List +import qualified Data.Map as M + +type Forms = M.Map T.Text T.Text + +isOpenCat ('A':_) = True +isOpenCat ('N':_) = True +isOpenCat ('V':_) = True +isOpenCat ('D':_) = True +isOpenCat _ = False + +noun forms (c, n) = findForm (matchNoun . T.unpack) forms + where matchNoun ('N':_:c':n':_) = c == c' && n == n' + matchNoun _ = False + +adj forms d = findForm (matchAdj . T.unpack) forms + where matchAdj ('A':'N':'S':'M':_:'F':d':_) = d == d + matchAdj _ = False + +verbPres forms (n, p) = findForm (matchPres . T.unpack) forms + where matchPres ('V':'D':n':_:'P':'P':p':_:'A':_) = n == n' && p == p' + matchPres ('V':'D':n':_:'F':'P':p':_:'A':_) = n == n' && p == p' + matchPres ('V':'D':n':_:'P':'P':p':_) = n == n' && p == p' + matchPres ('V':'D':n':_:'F':'P':p':_) = n == n' && p == p' + matchPres _ = False + +verbPast forms (n, g) = findForm (matchPast . T.unpack) forms + where matchPast ('V':'D':n':g':'S':_:_:'A':_) = n == n' && g == g' + matchPast _ = False + +verbImp forms = findForm (matchImp . T.unpack) forms + where matchImp ('V':'M':_) = True + matchImp _ = False + +verbInf forms = findForm (matchInf . T.unpack) forms + where matchInf ('V':'I':_) = True + matchInf _ = False + +adv forms = findForm (matchAdv . T.unpack) forms + where matchAdv ('D':d:_) = d == 'P' + matchAdv _ = False + +findForm match forms = case find match (M.keys forms) of + Just tag -> forms M.! tag + Nothing -> findForm (\ _ -> True) forms |
