packages feed

WordAlignment-0.2.0.0: Linguistics/WordAlignment.hs

-- | Functions of alignments of words.

module Linguistics.WordAlignment
  ( module Linguistics.WordAlignment
  , buildAlignmentBuilder
  ) where

import           Control.Arrow (second)
import           Control.DeepSeq
import           Control.Lens hiding (each)
import           Control.Monad.State.Strict
import           Data.Default
import           Data.Function (on)
import           Data.List (groupBy)
import           Data.Text.Lazy.Builder (Builder)
import           Data.Vector (Vector)
import           Pipes hiding ((<~))
import           Prelude hiding (Word)
import qualified Data.Vector as V
import           System.IO (stderr)
import           Text.Printf
import qualified Data.Vector.Unboxed as VU

import           Data.Paired.Vector
import           NLP.Text.BTI

import           Linguistics.WordAlignment.AlignmentBuilder
import           Linguistics.WordAlignment.PipedPairs
import           Linguistics.WordAlignment.FastLookups
import           Linguistics.WordAlignment.Word (Word, wordLang, wordWord, FastChars, fastChars)
import qualified Linguistics.WordAlignment.TwoWay.Global.Bigram as GB2
import qualified Linguistics.WordAlignment.TwoWay.Global.Simple as GS2
--import qualified Linguistics.WordAlignment.TwoWay.Infix.Bigram as IB2
--import qualified Linguistics.WordAlignment.TwoWay.Infix.Simple as IS2



alignGlobalSimple2 = GS2.alignGlobal
alignGlobalBigram2 = GB2.alignGlobal

--alignInfixSimple2 = IS2.alignInfix
--alignInfixBigram2 = IB2.alignInfix

-- | Wrap up the most common way to perform alignments. The function @f@
-- needs to have all scoring parts incorporated.

alignmentWrapper2 f fga fc fd x y = do
  w <- use aliWidth
  c <- use aliNumCoopts
  sf <- use aliFilterScore
  bf <- use aliFilterBackt
  fn <- use aliFilterNormalized
  let (d,bts) = f fga fc fd w c (wordWord x) (wordWord y)
  let l = VU.length (wordWord x) `max` VU.length (wordWord y)
  let ali = scoreFilter fn l sf d
          $ buildAlignmentBuilder 0 ([x,y],(d, btFilter fn l bf d bts))
  return ali
{-# Inline alignmentWrapper2 #-}

-- |

scoreFilter False _ (Just z) d _ | z > d                  = mempty
scoreFilter True  l (Just z) d _ | z > d / fromIntegral l = mempty
scoreFilter _  _ _        _ blder = blder
{-# Inline scoreFilter #-}

-- |

btFilter False _ (Just z) d xs | z > d                  = []
btFilter True  l (Just z) d xs | z > d / fromIntegral l = []
btFilter _     _ _        _ xs = xs
{-# Inline btFilter #-}

-- | Default system for printing out the status every 10k alignments.

eachGroupStatus len k x y = do
  let wLx :: String = btiToCS $ wordLang x
      wLy :: String = btiToCS $ wordLang y
  v <- use aliVerbose
  numGs <- use aliGroups
  curG  <- use aliCurGroup
  lift . when (v && k `mod` 10000 == 9999)
       $ hPrintf stderr "%5d %5d   %s %s %10d %10d\n" numGs curG wLx wLy len (k+1)
{-# Inline eachGroupStatus #-}

-- | In case we don't want to do anything for each group.

eachGroupNothing _ _ _ _ = return ()