facebook / duckling

Language, engine, and tooling for expressing, testing, and evaluating composable language rules on input strings.
Other
4.05k stars 719 forks source link

Custom Dimension doesn't return the actual value! #734

Open sbilgil opened 4 months ago

sbilgil commented 4 months ago

For our companies need i added some CustomDimension's. I saw that duckling is extracting and returning me the dimension. But it didn't return the value extracted from the text. I looked at the ExampleMain.hs for CustomDimension example. I've tried something to make it work but i couldn't succeed. Here is my last code:

` {-# LANGUAGE DeriveAnyClass #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE LambdaCase #-} {-# LANGUAGE NoRebindableSyntax #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeFamilies #-}

module AccessKeyPrebuiltDimension (AccessKeyPrebuiltDimension(..)) where

import Control.DeepSeq import Control.Monad import Data.Aeson import Data.Hashable import Data.Semigroup ((<>)) import Data.Some import Data.Text (Text) import Data.Text (unpack) import Data.Typeable import GHC.Generics import Prelude import qualified Data.HashSet as HashSet import qualified TextShow as TS

import Duckling.Debug import Debug.Trace import Duckling.Locale import Duckling.Regex.Types (GroupMatch(..)) import Duckling.Resolve (Resolve(..)) import Duckling.Types

data AccessKeyPrebuiltDimension = AccessKeyPrebuiltDimension deriving (Eq, Show, Typeable)

instance CustomDimension AccessKeyPrebuiltDimension where type DimensionData AccessKeyPrebuiltDimension = ResponseData dimRules = [accessKeyRule1, accessKeyRule2] dimLangRules = [] dimLocaleRules = [] dimDependents = HashSet.empty

data ResponseData = ResponseData { iField :: Int , bField :: Bool , tField :: Text } deriving (Eq, Generic, Hashable, Ord, Show, NFData)

instance Resolve ResponseData where type ResolvedValue ResponseData = ResponseValue resolve ResponseData{..} = Just ( ResponseValue $ TS.showt iField <> "," <> TS.showt bField <> "," <> tField , False )

newtype ResponseValue = ResponseValue { value :: Text } deriving (Eq, Ord, Show)

instance ToJSON ResponseValue where toJSON (ResponseValue value) = object [ "value" .= value ]

accessKeyPrebuiltDimensionPredicate :: Predicate accessKeyPrebuiltDimensionPredicate (Token (CustomDimension (dim :: a)) dimData) | Just Refl <- eqT @a @AccessKeyPrebuiltDimension, ResponseData{..} <- dimData = iField == 42 && bField accessKeyPrebuiltDimensionPredicate _ = False

accessKeyRule1 :: Rule accessKeyRule1 = Rule { name = "AccessKey rule1" , pattern = [ regex "(?<![A-Z0-9])[A-Z0-9]{20}(?![A-Z0-9])" ]

, prod = \case (:) -> Just . Token (CustomDimension AccessKeyPrebuiltDimension) $ ResponseData { iField = 1 , bField = True , tField = "AccessRule1" } _ -> Nothing }

accessKeyRule2 :: Rule accessKeyRule2 = Rule { name = "AccessKey rule2" , pattern = [ regex "(?<![A-Za-z0-9/+=])[A-Za-z0-9/+=]{40}(?![A-Za-z0-9/+=])" ]

, prod = \case (:) -> Just . Token (CustomDimension AccessKeyPrebuiltDimension) $ ResponseData { iField = 1 , bField = True , tField = "AccessRule2" } _ -> Nothing }

`

This code result in new dimension but as i said before duckling response is like this:

[ { "body": "Js6IDrwAIkvSY+8fSJ5bcep05ENlNvXgc+JRRr7Y", "start": 0, "value": { "value": "1,True,swiftCode" }, "end": 40, "dim": "AccessKeyPrebuiltDimension", "latent": false } ]

But actually i want the extracted value in "value" item. How i can succeed it? I've looked at other dimensions like credit-card and phone-number etc. And i tried to rewrite rule like this:

accessKeyRule2 :: Rule accessKeyRule2 = Rule { name = "AccessKey rule2" , pattern = [ regex "(?<![A-Za-z0-9/+=])[A-Za-z0-9/+=]{40}(?![A-Za-z0-9/+=])" ] , prod = \case (Token RegexMatch (GroupMatch (code:_)):_) -> Just . Token (CustomDimension AccessKeyPrebuiltDimension) $ ResponseData { iField = 1 , bField = True , tField = code } _ -> Nothing }

but this time duckling start not returning anything but "[]"

I dont know how to return extracted value in "value" item.