From 278fb2356739846f6547e78fcb1aed0dd8688808 Mon Sep 17 00:00:00 2001 From: Horea Popa Date: Tue, 30 Oct 2018 12:56:12 +0200 Subject: [PATCH] Add support for "Duckling support for multiple timezone time/date detection [Rasa NLU] [Duckling] [Timezone] [Date] [Time]" https://forum.rasa.com/t/duckling-support-for-multiple-timezone-time-date-detection-rasa-nlu-duckling-timezone-date-time/1570 --- rasa_nlu/data_router.py | 3 ++- rasa_nlu/emulators/__init__.py | 1 + rasa_nlu/extractors/duckling_http_extractor.py | 10 +++++----- rasa_nlu/model.py | 4 ++-- rasa_nlu/project.py | 4 ++-- rasa_nlu/training_data/message.py | 3 ++- 6 files changed, 14 insertions(+), 11 deletions(-) diff --git a/rasa_nlu/data_router.py b/rasa_nlu/data_router.py index b7408730e389..10d1c3d29b60 100644 --- a/rasa_nlu/data_router.py +++ b/rasa_nlu/data_router.py @@ -267,7 +267,8 @@ def parse(self, data): "Error: {}".format(project, e)) time = data.get('time') - response = self.project_store[project].parse(data['text'], time, + tz = data.get('tz') + response = self.project_store[project].parse(data['text'], time, tz, model) if self.responses: diff --git a/rasa_nlu/emulators/__init__.py b/rasa_nlu/emulators/__init__.py index c26268525066..81ec67ac99f6 100644 --- a/rasa_nlu/emulators/__init__.py +++ b/rasa_nlu/emulators/__init__.py @@ -32,6 +32,7 @@ def normalise_request_json(self, data): _data["model"] = data["model"][0] if type(data["model"]) == list else data["model"] _data['time'] = data["time"] if "time" in data else None + _data['tz'] = data["tz"] if "tz" in data else None return _data def normalise_response_json(self, data): diff --git a/rasa_nlu/extractors/duckling_http_extractor.py b/rasa_nlu/extractors/duckling_http_extractor.py index e799fd25ffc7..1849a93c8e24 100644 --- a/rasa_nlu/extractors/duckling_http_extractor.py +++ b/rasa_nlu/extractors/duckling_http_extractor.py @@ -77,19 +77,19 @@ def _url(self): return self.component_config.get("url") - def _payload(self, text, reference_time): + def _payload(self, text, reference_time, tz): return { "text": text, "locale": self._locale(), - "tz": self.component_config.get("timezone"), + "tz": tz if tz else self.component_config.get("timezone"), "reftime": reference_time } - def _duckling_parse(self, text, reference_time): + def _duckling_parse(self, text, reference_time, tz): """Sends the request to the duckling server and parses the result.""" try: - payload = self._payload(text, reference_time) + payload = self._payload(text, reference_time, tz) headers = {"Content-Type": "application/x-www-form-urlencoded; " "charset=UTF-8"} response = requests.post(self._url() + "/parse", @@ -130,7 +130,7 @@ def process(self, message, **kwargs): if self._url() is not None: reference_time = self._reference_time_from_message(message) - matches = self._duckling_parse(message.text, reference_time) + matches = self._duckling_parse(message.text, reference_time, message.tz) dimensions = self.component_config["dimensions"] relevant_matches = filter_irrelevant_matches(matches, dimensions) extracted = convert_duckling_format_to_rasa(relevant_matches) diff --git a/rasa_nlu/model.py b/rasa_nlu/model.py index bf86eb230fb6..cfe88ceba53a 100644 --- a/rasa_nlu/model.py +++ b/rasa_nlu/model.py @@ -336,7 +336,7 @@ def __init__(self, pipeline, context, model_metadata=None): self.context = context if context is not None else {} self.model_metadata = model_metadata - def parse(self, text, time=None, only_output_properties=True): + def parse(self, text, time=None, tz=None, only_output_properties=True): # type: (Text) -> Dict[Text, Any] """Parse the input text, classify it and return pipeline result. @@ -351,7 +351,7 @@ def parse(self, text, time=None, only_output_properties=True): output["text"] = "" return output - message = Message(text, self.default_output_attributes(), time=time) + message = Message(text, self.default_output_attributes(), time=time, tz=tz) for component in self.pipeline: component.process(message, **self.context) diff --git a/rasa_nlu/project.py b/rasa_nlu/project.py index d6aae4e27091..b34ac9e1b623 100644 --- a/rasa_nlu/project.py +++ b/rasa_nlu/project.py @@ -250,7 +250,7 @@ def _dynamic_load_model(self, requested_model_name=None): logger.warn("Invalid model requested. Using default") return self._latest_project_model() - def parse(self, text, time=None, requested_model_name=None): + def parse(self, text, time=None, tz=None, requested_model_name=None): self._begin_read() model_name = self._dynamic_load_model(requested_model_name) @@ -263,7 +263,7 @@ def parse(self, text, time=None, requested_model_name=None): finally: self._loader_lock.release() - response = self._models[model_name].parse(text, time) + response = self._models[model_name].parse(text, time, tz) response['project'] = self._project response['model'] = model_name diff --git a/rasa_nlu/training_data/message.py b/rasa_nlu/training_data/message.py index ca8a02c64bab..79974dd0050d 100644 --- a/rasa_nlu/training_data/message.py +++ b/rasa_nlu/training_data/message.py @@ -9,9 +9,10 @@ class Message(object): - def __init__(self, text, data=None, output_properties=None, time=None): + def __init__(self, text, data=None, output_properties=None, time=None, tz=None): self.text = text self.time = time + self.tz = tz self.data = data if data else {} if output_properties: