8000 add test for multi-intents etc. · rsliang/botbuilder-python@027f8cd · GitHub
[go: up one dir, main page]

Skip to content

Commit 027f8cd

Browse files
committed
add test for multi-intents etc.
* add tests for multi-intents, prebuilt entities * add top intent with named tuple
1 parent 60adb55 commit 027f8cd

File tree

4 files changed

+64
-15
lines changed

4 files changed

+64
-15
lines changed

libraries/botbuilder-ai/botbuilder/ai/luis/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from .luis_application import LuisApplication
66
from .luis_prediction_options import LuisPredictionOptions
77
from .luis_telemetry_constants import LuisTelemetryConstants
8-
from .recognizer_result import RecognizerResult
8+
from .recognizer_result import RecognizerResult, TopIntent
99
from .luis_recognizer import LuisRecognizer
1010

1111
__all__ = [
@@ -15,4 +15,5 @@
1515
"LuisRecognizer",
1616
"LuisTelemetryConstants",
1717
"RecognizerResult",
18+
"TopIntent",
1819
]

libraries/botbuilder-ai/botbuilder/ai/luis/luis_util.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -104,12 +104,12 @@ def extract_entity_value(entity: EntityModel) -> object:
104104
if entity.type.startswith("builtin.datetime."):
105105
return resolution
106106
elif entity.type.startswith("builtin.datetimeV2."):
107-
if not resolution.values:
107+
if not resolution["values"]:
108108
return resolution
109109

110-
resolution_values = resolution.values
111-
val_type = resolution.values[0].type
112-
timexes = [val.timex for val in resolution_values]
110+
resolution_values = resolution["values"]
111+
val_type = resolution["values"][0]["type"]
112+
timexes = [val["timex"] for val in resolution_values]
113113
distinct_timexes = list(set(timexes))
114114
return {"type": val_type, "timex": distinct_timexes}
115115
else:
@@ -152,8 +152,8 @@ def extract_entity_metadata(entity: EntityModel) -> Dict:
152152
obj["score"] = float(entity.additional_properties["score"])
153153

154154
resolution = entity.additional_properties.get("resolution")
155-
if resolution is not None and resolution.subtype is not None:
156-
obj["subtype"] = resolution.subtype
155+
if resolution is not None and resolution.get("subtype") is not None:
156+
obj["subtype"] = resolution["subtype"]
157157

158158
return obj
159159

libraries/botbuilder-ai/botbuilder/ai/luis/recognizer_result.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
11
# Copyright (c) Microsoft Corporation. All rights reserved.
22
# Licensed under the MIT License.
33

4-
from typing import Dict, NamedTuple, Tuple
4+
from typing import Dict, NamedTuple
55

66
from . import IntentScore
77

88

9+
class TopIntent(NamedTuple):
10+
"""The top scoring intent and its score."""
11+
12+
intent: str
13+
score: float
14+
15+
916
class RecognizerResult:
1017
"""
1118
Contains recognition results generated by a recognizer.
@@ -137,22 +144,20 @@ def properties(self, value: Dict[str, object]) -> None:
137144

138145
self._properties = value
139146

140-
def get_top_scoring_intent(
141-
self
142-
) -> NamedTuple("TopIntent", intent=str, score=float):
147+
def get_top_scoring_intent(self) -> TopIntent:
143148
"""Return the top scoring intent and its score.
144149
145150
:return: Intent and score.
146-
:rtype: NamedTuple("TopIntent", intent=str, score=float)
151+
:rtype: TopIntent
147152
"""
148153

149154
if self.intents is None:
150155
raise TypeError("result.intents can't be None")
151156

152-
top_intent: Tuple[str, float] = ("", 0.0)
157+
top_intent = TopIntent(intent="", score=0.0)
153158
for intent_name, intent_score in self.intents.items():
154159
score = intent_score.score
155160
if score > top_intent[1]:
156-
top_intent = (intent_name, score)
161+
top_intent = TopIntent(intent_name, score)
157162

158163
return top_intent

libraries/botbuilder-ai/tests/luis/luis_recognizer_test.py

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,13 @@
77
from msrest import Deserializer
88
from requests.models import Response
99

10-
from botbuilder.ai.luis import LuisApplication, LuisPredictionOptions, LuisRecognizer
10+
from botbuilder.ai.luis import (
11+
LuisApplication,
12+
LuisPredictionOptions,
13+
LuisRecognizer,
14+
RecognizerResult,
15+
TopIntent,
16+
)
1117
from botbuilder.core import TurnContext
1218
from botbuilder.core.adapters import TestAdapter
1319
from botbuilder.schema import (
@@ -145,6 +151,43 @@ def test_null_utterance(self):
145151
self.assertIsNotNone(result.entities)
146152
self.assertEqual(0, len(result.entities))
147153

154+
def test_MultipleIntents_PrebuiltEntity(self):
155+
utterance: str = "Please deliver February 2nd 2001"
156+
response_path: str = "MultipleIntents_PrebuiltEntity.json"
157+
158+
result = LuisRecognizerTest._get_recognizer_result(utterance, response_path)
159+
160+
self.assertIsNotNone(result)
161+
self.assertEqual(utterance, result.text)
162+
self.assertIsNotNone(result.intents)
163+
self.assertTrue(len(result.intents) > 1)
164+
self.assertIsNotNone(result.intents["Delivery"])
165+
self.assertTrue(
166+
result.intents["Delivery"].score > 0
167+
and result.intents["Delivery"].score <= 1
168+
)
169+
self.assertEqual("Delivery", result.get_top_scoring_intent().intent)
170+
self.assertTrue(result.get_top_scoring_intent().score > 0)
171+
self.assertIsNotNone(result.entities)
172+
self.assertIsNotNone(result.entities["number"])
173+
self.assertEqual(2001, int(result.entities["number"][0]))
174+
self.assertIsNotNone(result.entities["ordinal"])
175+
self.assertEqual(2, int(result.entities["ordinal"][0]))
176+
self.assertIsNotNone(result.entities["datetime"][0])
177+
self.assertEqual("2001-02-02", result.entities["datetime"][0]["timex"][0])
178+
self.assertIsNotNone(result.entities["$instance"]["number"])
179+
self.assertEqual(
180+
28, int(result.entities["$instance"]["number"][0]["startIndex"])
181+
)
182+
self.assertEqual(32, int(result.entities["$instance"]["number"][0]["endIndex"]))
183+
self.assertEqual("2001", result.text[28:32])
184+
self.assertIsNotNone(result.entities["$instance"]["datetime"])
185+
self.assertEqual(15, result.entities["$instance"]["datetime"][0]["startIndex"])
186+
self.assertEqual(32, result.entities["$instance"]["datetime"][0]["endIndex"])
187+
self.assertEqual(
188+
"february 2nd 2001", result.entities["$instance"]["datetime"][0]["text"]
189+
)
190+
148191
def assert_score(self, score: float):
149192
self.assertTrue(score >= 0)
150193
self.assertTrue(score <= 1)

0 commit comments

Comments
 (0)
0