diff --git a/assistant_skill_analysis/utils/skills_util.py b/assistant_skill_analysis/utils/skills_util.py index e8d913b..d5e6e0a 100644 --- a/assistant_skill_analysis/utils/skills_util.py +++ b/assistant_skill_analysis/utils/skills_util.py @@ -179,6 +179,15 @@ def retrieve_workspace(skill_id, conversation, export_flag=True): return ws_json.get_result() +def _get_intent_name_from_action_condition(condition: dict): + if "intent" in condition and condition["intent"] is not None: + return condition["intent"] + for v in condition.values(): + if isinstance(v, list): + for cond in v: + return _get_intent_name_from_action_condition(cond) + + def parse_workspace_json(workspace_json): """ Parse workspace json and returns list of utterances, list of intents, and list of entities, and intent to action title mapping @@ -202,13 +211,17 @@ def parse_workspace_json(workspace_json): else: # intent name to action title mapping for readability - raw_intent_name_to_action_title_mapping = { - action["condition"]["intent"]: action["title"] - for action in workspace_json["workspace"]["actions"] - if action.get("condition", {}).get("intent") - } + raw_intent_name_to_action_title_mapping = {} + for action in workspace_json["workspace"]["actions"]: + possible_intent = _get_intent_name_from_action_condition(action.get("condition", {})) + if possible_intent: + raw_intent_name_to_action_title_mapping[possible_intent] = action["title"] for intent in workspace_json["workspace"]["intents"]: - action_title = raw_intent_name_to_action_title_mapping[intent["intent"]] + intent_name = intent["intent"] + action_title = raw_intent_name_to_action_title_mapping.get(intent_name) + if action_title is None: + raw_intent_name_to_action_title_mapping[intent_name] = intent_name + action_title = intent_name for example in intent["examples"]: utterances.append(example["text"]) intents.append(action_title) diff --git a/requirements.txt b/requirements.txt index 2e4a227..6741f04 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,7 +6,7 @@ tabulate matplotlib nltk seaborn -ibm-watson>=4.5.0 +ibm-watson>=9.0.0 scipy>=1.2.0 jupyter spacy~=2.3.2 diff --git a/tests/utils/test_skills_util.py b/tests/utils/test_skills_util.py index b287fab..f637fb7 100644 --- a/tests/utils/test_skills_util.py +++ b/tests/utils/test_skills_util.py @@ -62,6 +62,28 @@ def test_extract_workspace_data(self): len(workspace_pd["intent"].unique()), 9, "Extract workspace failed" ) + def test_parse_intent_from_action_condition(self): + + data = { + "intent": "action_10017_intent_27671" + } + self.assertEqual( + skills_util._get_intent_name_from_action_condition(data), "action_10017_intent_27671" + ) + data = { + "and": [ + { + "intent": "action_15841_intent_20012" + }, + { + "expression": "false" + } + ] + } + self.assertEqual( + skills_util._get_intent_name_from_action_condition(data), "action_15841_intent_20012" + ) + @classmethod def tearDownClass(cls): cls.skill_file.close()