def test_load_group_nested(query_factory): """Tests loading a query with a nested entity group""" text = ( "Order [{one|quantity} {large|size} {Tesora|product} with [{medium|size} " "{cream|option}|option] and [{medium|size} {sugar|option}|option]|product]" ) processed_query = markup.load_query(text, query_factory) entities = processed_query.entities assert len(entities) == 7 assert entities[0].text == "one" assert entities[0].entity.type == "quantity" assert entities[0].span == Span(6, 8) assert entities[0].parent == entities[2] assert entities[1].text == "large" assert entities[1].entity.type == "size" assert entities[1].span == Span(10, 14) assert entities[1].parent == entities[2] assert entities[2].text == "Tesora" assert entities[2].entity.type == "product" assert entities[2].span == Span(16, 21) assert entities[2].children == (entities[0], entities[1], entities[4], entities[6]) assert entities[3].text == "medium" assert entities[3].entity.type == "size" assert entities[3].span == Span(28, 33) assert entities[3].parent == entities[4] assert entities[4].text == "cream" assert entities[4].entity.type == "option" assert entities[4].span == Span(35, 39) assert entities[4].parent == entities[2] assert entities[4].children == (entities[3],) assert entities[5].text == "medium" assert entities[5].entity.type == "size" assert entities[5].span == Span(45, 50) assert entities[5].parent == entities[6] assert entities[6].text == "sugar" assert entities[6].entity.type == "option" assert entities[6].span == Span(52, 56) assert entities[6].parent == entities[2] assert entities[6].children == (entities[5],)
def test_load_groups(query_factory): """Tests loading a query with multiple top level entity groups""" text = ( "Order [{one|quantity} {large|size} {Tesora|product} with " "[{medium|size} {cream|option}|option]|product] from " "[{Philz|store} in {Downtown Sunnyvale|location}|store]" ) processed_query = markup.load_query(text, query_factory) entities = processed_query.entities assert len(entities) == 7 assert entities[0].text == "one" assert entities[0].entity.type == "quantity" assert entities[0].span == Span(6, 8) assert entities[0].parent == entities[2] assert entities[1].text == "large" assert entities[1].entity.type == "size" assert entities[1].span == Span(10, 14) assert entities[1].parent == entities[2] assert entities[2].text == "Tesora" assert entities[2].entity.type == "product" assert entities[2].span == Span(16, 21) assert entities[2].children == (entities[0], entities[1], entities[4]) assert entities[3].text == "medium" assert entities[3].entity.type == "size" assert entities[3].span == Span(28, 33) assert entities[3].parent == entities[4] assert entities[4].text == "cream" assert entities[4].entity.type == "option" assert entities[4].span == Span(35, 39) assert entities[4].parent == entities[2] assert entities[4].children == (entities[3],) assert entities[5].text == "Philz" assert entities[5].entity.type == "store" assert entities[5].span == Span(46, 50) assert entities[5].children == (entities[6],) assert entities[6].text == "Downtown Sunnyvale" assert entities[6].entity.type == "location" assert entities[6].span == Span(55, 72) assert entities[6].parent == entities[5]
def test_load_groups(query_factory): """Tests loading a query with multiple top level entity groups""" text = ('Order [{one|quantity} {large|size} {Tesora|product} with ' '[{medium|size} {cream|option}|option]|product] from ' '[{Philz|store} in {Downtown Sunnyvale|location}|store]') processed_query = markup.load_query(text, query_factory) entities = processed_query.entities assert len(entities) == 7 assert entities[0].text == 'one' assert entities[0].entity.type == 'quantity' assert entities[0].span == Span(6, 8) assert entities[0].parent == entities[2] assert entities[1].text == 'large' assert entities[1].entity.type == 'size' assert entities[1].span == Span(10, 14) assert entities[1].parent == entities[2] assert entities[2].text == 'Tesora' assert entities[2].entity.type == 'product' assert entities[2].span == Span(16, 21) assert entities[2].children == (entities[0], entities[1], entities[4]) assert entities[3].text == 'medium' assert entities[3].entity.type == 'size' assert entities[3].span == Span(28, 33) assert entities[3].parent == entities[4] assert entities[4].text == 'cream' assert entities[4].entity.type == 'option' assert entities[4].span == Span(35, 39) assert entities[4].parent == entities[2] assert entities[4].children == (entities[3], ) assert entities[5].text == 'Philz' assert entities[5].entity.type == 'store' assert entities[5].span == Span(46, 50) assert entities[5].children == (entities[6], ) assert entities[6].text == 'Downtown Sunnyvale' assert entities[6].entity.type == 'location' assert entities[6].span == Span(55, 72) assert entities[6].parent == entities[5]
def test_nested_and_query_entity_equality(): """Tests NestedEntity and QueryEntity equality operations""" entity_a = NestedEntity(('Entity', 'Entity', 'entity'), (Span(0, 5), ) * 3, (Span(0, 0), ) * 3, Entity('text', 'type', 'role', 'value', 'display')) entity_b = QueryEntity(('Entity', 'Entity', 'entity'), (Span(0, 5), ) * 3, (Span(0, 0), ) * 3, Entity('text', 'type', 'role', 'value', 'display')) assert entity_a == entity_b assert not entity_a != entity_b entity_a = NestedEntity(('Entity123', 'Entity', 'entity'), (Span(0, 5), ) * 3, (Span(0, 0), ) * 3, Entity('text', 'type', 'role', 'value', 'display')) entity_b = QueryEntity(('Entity', 'Entity', 'entity'), (Span(0, 5), ) * 3, (Span(0, 0), ) * 3, Entity('text', 'type', 'role', 'value', 'display')) assert not entity_a == entity_b assert entity_a != entity_b
def test_dump_group_nested(query_factory): """Tests dumping a query with nested entity groups""" query_text = "Order one large Tesora with medium cream and medium sugar" query = query_factory.create_query(query_text) entities = [ QueryEntity.from_query(query, Span(6, 8), entity_type="quantity"), QueryEntity.from_query(query, Span(10, 14), entity_type="size"), QueryEntity.from_query(query, Span(16, 21), entity_type="product"), QueryEntity.from_query(query, Span(28, 33), entity_type="size"), QueryEntity.from_query(query, Span(35, 39), entity_type="option"), QueryEntity.from_query(query, Span(45, 50), entity_type="size"), QueryEntity.from_query(query, Span(52, 56), entity_type="option"), ] entities[4] = entities[4].with_children((entities[3],)) entities[6] = entities[6].with_children((entities[5],)) entities[2] = entities[2].with_children( (entities[0], entities[1], entities[4], entities[6]) ) processed_query = ProcessedQuery(query, entities=entities) markup_text = ( "Order [{one|quantity} {large|size} {Tesora|product} with [{medium|size} " "{cream|option}|option] and [{medium|size} {sugar|option}|option]|product]" ) entity_text = ( "Order {one|quantity} {large|size} {Tesora|product} with {medium|size} " "{cream|option} and {medium|size} {sugar|option}" ) group_text = ( "Order [one large Tesora with [medium " "cream|option] and [medium sugar|option]|product]" ) assert markup.dump_query(processed_query) == markup_text assert markup.dump_query(processed_query, no_group=True) == entity_text assert markup.dump_query(processed_query, no_entity=True) == group_text assert ( markup.dump_query(processed_query, no_group=True, no_entity=True) == query_text )
def test_entity_string(): """Tests string representation of entities""" entity = NestedEntity(('Entity', 'Entity', 'entity'), (Span(0, 5), ) * 3, (Span(0, 0), ) * 3, Entity('text', 'type', 'role', 'value', 'display')) assert str(entity) == "type:role 'Entity' 0-5"
def test_span_iter(): """Tests the __iter__ implementation for Span objects""" span = Span(3, 5) indexes = list(span) assert indexes == [3, 4, 5]
def test_bootstrap_query_with_entities(query_factory): query_text = "Can I get one curry sauce with my rice ball with house salad" query = query_factory.create_query(query_text) entities = [ QueryEntity.from_query(query, Span(10, 12), entity_type="sys_number", role="quantity"), QueryEntity.from_query(query, Span(14, 24), entity_type="option"), QueryEntity.from_query(query, Span(34, 59), entity_type="dish"), ] entities[1] = entities[1].with_children((entities[0], )) entities[2] = entities[2].with_children((entities[1], )) confidence = { "domains": { "food": 0.95, "music": 0.05 }, "intents": { "get_comestibles": 0.99, "reorder": 0.01 }, "entities": [{ "sys_number": 0.9 }, { "option": 0.99 }, { "dish": 0.65 }], "roles": [{ "quantity": 0.8, "quality": 0.2 }, None, None], } processed_query = ProcessedQuery( query, domain="food", intent="get_comestibles", entities=entities, confidence=confidence, ) bootstrap_data = markup.bootstrap_query_row(processed_query, show_confidence=True) expected_data = { "query": ("Can I get [[{one|sys_number|quantity} {curry sauce|option}|option] " "with my {rice ball with house salad|dish}|dish]"), "domain": "food", "domain_conf": 0.95, "intent": "get_comestibles", "intent_conf": 0.99, "entity_conf": 0.65, "role_conf": 0.8, } assert bootstrap_data == expected_data
def test_bootstrap_query_with_entities(query_factory): query_text = 'Can I get one curry sauce with my rice ball with house salad' query = query_factory.create_query(query_text) entities = [ QueryEntity.from_query(query, Span(10, 12), entity_type='sys_number', role='quantity'), QueryEntity.from_query(query, Span(14, 24), entity_type='option'), QueryEntity.from_query(query, Span(34, 59), entity_type='dish') ] entities[1] = entities[1].with_children((entities[0], )) entities[2] = entities[2].with_children((entities[1], )) confidence = { 'domains': { 'food': 0.95, 'music': 0.05 }, 'intents': { 'get_comestibles': 0.99, 'reorder': 0.01 }, 'entities': [{ 'sys_number': 0.9 }, { 'option': 0.99 }, { 'dish': 0.65 }], 'roles': [{ 'quantity': 0.8, 'quality': 0.2 }, None, None] } processed_query = ProcessedQuery(query, domain='food', intent='get_comestibles', entities=entities, confidence=confidence) bootstrap_data = markup.bootstrap_query_row(processed_query, show_confidence=True) expected_data = { 'query': ('Can I get [[{one|sys_number|quantity} {curry sauce|option}|option] ' 'with my {rice ball with house salad|dish}|dish]'), 'domain': 'food', 'domain_conf': 0.95, 'intent': 'get_comestibles', 'intent_conf': 0.99, 'entity_conf': 0.65, 'role_conf': 0.8 } assert bootstrap_data == expected_data