Fis.hs 2.85 KB
Newer Older
Quentin Lobbé's avatar
Quentin Lobbé committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
{-|
Module      : Gargantext.Viz.Phylo.Tools
Description : Phylomemy Tools to build/manage it
Copyright   : (c) CNRS, 2017-Present
License     : AGPL + CECILL v3
Maintainer  : team@gargantext.org
Stability   : experimental
Portability : POSIX


-}

{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE FlexibleContexts  #-}
{-# LANGUAGE OverloadedStrings #-}

module Gargantext.Viz.Phylo.Aggregates.Fis
  where

Alexandre Delanoë's avatar
Alexandre Delanoë committed
20
import Data.List        (null)
21
import Data.Map         (Map, empty)
Quentin Lobbé's avatar
Quentin Lobbé committed
22
import Data.Tuple       (fst, snd)
Alexandre Delanoë's avatar
Alexandre Delanoë committed
23
import Gargantext.Prelude
Quentin Lobbé's avatar
Quentin Lobbé committed
24 25 26 27 28 29 30
import Gargantext.Text.Metrics.FrequentItemSet  (fisWithSizePolyMap, Size(..))
import Gargantext.Viz.Phylo
import Gargantext.Viz.Phylo.Tools
import qualified Data.Map    as Map


-- | To Filter Fis by support 
31
filterFisBySupport :: Bool -> Int -> Map (Date, Date) [PhyloFis] -> Map (Date, Date) [PhyloFis]
32 33 34
filterFisBySupport keep min' m = case keep of
  False -> Map.map (\l -> filterMinorFis min' l) m
  True  -> Map.map (\l -> keepFilled (filterMinorFis) min' l) m
Quentin Lobbé's avatar
Quentin Lobbé committed
35 36


37 38
-- | To filter Fis with small Support, to preserve nonempty periods please use : filterFisBySupport true
filterMinorFis :: Int -> [PhyloFis] -> [PhyloFis]
39
filterMinorFis min' l = filter (\fis -> getSupport fis > min') l
Quentin Lobbé's avatar
Quentin Lobbé committed
40 41 42


-- | To filter nested Fis 
43
filterFisByNested :: Map (Date, Date) [PhyloFis] -> Map (Date, Date) [PhyloFis]
Alexandre Delanoë's avatar
Alexandre Delanoë committed
44
filterFisByNested = map (\l -> let cliqueMax = filterNestedSets (head' "Fis" $ map getClique l) (map getClique l) []
45
                               in  filter (\fis -> elem (getClique fis) cliqueMax) l)
Quentin Lobbé's avatar
Quentin Lobbé committed
46 47 48


-- | To transform a list of Documents into a Frequent Items Set 
49
docsToFis :: Map (Date, Date) [Document] -> Map (Date, Date) [PhyloFis]
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
docsToFis docs = map (\d -> let fs = Map.toList $ fisWithSizePolyMap (Segment 1 20) 1 (map text d)
                            in map (\f -> PhyloFis (fst f) (snd f) empty) fs) docs


-- | To process a list of Filters on top of the PhyloFis
processFilters :: [Filter] -> Map (Date, Date) [PhyloFis] -> Map (Date, Date) [PhyloFis]
processFilters filters phyloFis
  | null filters = phyloFis
  | otherwise    = panic "[ERR][Viz.Phylo.LevelMaker.processFilters] please add some filters for the Fis"


-- | To process a list of Metrics on top of the PhyloFis
processMetrics :: [Metric] -> Map (Date, Date) [PhyloFis] -> Map (Date, Date) [PhyloFis]
processMetrics metrics phyloFis
  | null metrics = phyloFis
  | otherwise    = panic "[ERR][Viz.Phylo.LevelMaker.processMetrics] please add some metrics for the Fis"


-- | To transform some Documents into PhyloFis and apply a List of Metrics and Filters
toPhyloFis :: Map (Date, Date) [Document] -> Bool -> Support -> [Metric] -> [Filter] -> Map (Date, Date) [PhyloFis]
toPhyloFis ds k s ms fs = processFilters fs  
                        $ processMetrics ms
                        $ filterFisByNested 
                        $ filterFisBySupport k s
74
                        $ docsToFis ds