module Data.SyntaxTree
( module Data.SyntaxTree
, module Data.Tree
, module Data.ConllToken
) where
import Data.ConllToken
import Data.Map
import Data.Tree
import Protolude
type SyntaxtTree cpos fpos ger feats lemma =
Tree (ConllToken cpos fpos ger feats lemma)
createSyntaxTree :: [ConllToken cpos fpos ger feats lemma]
-> Either SyntaxErrorCoNLL (SyntaxtTree cpos fpos ger feats lemma)
createSyntaxTree conllLines =
note TheresNoRoot $ listToMaybe (treeFrom 0)
where
indexToNode = fromList [ (_tnId l,l) | l <- conllLines]
headToNode = fromListWith (++) [ (_tnHead node,[node])
| node <- conllLines
]
treeFrom n = let relations = fromMaybe [] $ lookup n headToNode
in [ Node{ rootLabel = node
, subForest = treeFrom (_tnId node)
}
| node <- relations
]