def _parse_item(self, line: Text) -> None: """Parses an md list item line based on the current section type.""" import rasa.shared.nlu.training_data.lookup_tables_parser as lookup_tables_parser # noqa: E501 import rasa.shared.nlu.training_data.synonyms_parser as synonyms_parser from rasa.shared.nlu.training_data import entities_parser match = re.match(item_regex, line) if match: item = match.group(1) if self.current_section == INTENT: parsed = entities_parser.parse_training_example( item, self.current_title) synonyms_parser.add_synonyms_from_entities( parsed.get(TEXT), parsed.get("entities", []), self.entity_synonyms) self.training_examples.append(parsed) elif self.current_section == SYNONYM: synonyms_parser.add_synonym(item, self.current_title, self.entity_synonyms) elif self.current_section == REGEX: self.regex_features.append({ "name": self.current_title, "pattern": item }) elif self.current_section == LOOKUP: lookup_tables_parser.add_item_to_lookup_tables( self.current_title, item, self.lookup_tables)
def parse_e2e_message(line: Text) -> Message: """Parses an md list item line based on the current section type. Matches expressions of the form `<intent>:<example>`. For the syntax of `<example>` see the Rasa docs on NLU training data.""" # Match three groups: # 1) Potential "form" annotation # 2) The correct intent # 3) Optional entities # 4) The message text form_group = fr"({FORM_PREFIX}\s*)*" item_regex = re.compile(r"\s*" + form_group + r"([^{}]+?)({.*})*:\s*(.*)") match = re.match(item_regex, line) if not match: raise ValueError( "Encountered invalid test story format for message " "`{}`. Please visit the documentation page on " "end-to-end testing at {}/user-guide/testing-your-assistant/" "#end-to-end-testing/".format(line, LEGACY_DOCS_BASE_URL)) from rasa.shared.nlu.training_data import entities_parser intent = match.group(2) message = match.group(4) example = entities_parser.parse_training_example(message, intent) # If the message starts with the `INTENT_MESSAGE_PREFIX` potential entities # are annotated in the json format (e.g. `/greet{"name": "Rasa"}) if message.startswith(INTENT_MESSAGE_PREFIX): parsed = RegexInterpreter().synchronous_parse(message) example.data["entities"] = parsed["entities"] return example
def extract_text_and_entities(text: Text): """ extract entities and plain text from markdown intent example :param text: markdown intent example :return: plain intent, list of extracted entities """ example = entities_parser.parse_training_example(text) return example.get(TEXT), example.get('entities', [])
def test_parse_training_example_with_entities(): message = entities_parser.parse_training_example( "I am from [Berlin](city).", intent="inform" ) assert message.get("intent") == "inform" assert message.get(TEXT) == "I am from Berlin." assert message.get("entities") == [ {"start": 10, "end": 16, "value": "Berlin", "entity": "city"} ]
def extract_text_and_entities(text: Text): """ extract entities and plain text from markdown intent example :param text: markdown intent example :return: plain intent, list of extracted entities """ from rasa.shared.nlu.constants import TEXT from rasa.shared.nlu.training_data import entities_parser example = entities_parser.parse_training_example(text) return example.get(TEXT), example.get('entities', None)
def md_format_message( text: Text, intent: Optional[Text], entities: Union[Text, List[Any]] ) -> Text: """Uses NLU parser information to generate a message with inline entity annotations. Arguments: text: text of the message intent: intent of the message entities: entities of the message Return: Message with entities annotated inline, e.g. `I am from [Berlin]{"entity": "city"}`. """ from rasa.shared.nlu.training_data.formats.readerwriter import TrainingDataWriter from rasa.shared.nlu.training_data import entities_parser message_from_md = entities_parser.parse_training_example(text, intent) deserialised_entities = deserialise_entities(entities) return TrainingDataWriter.generate_message( {"text": message_from_md.get(TEXT), "entities": deserialised_entities} )
def test_parse_empty_example(): message = entities_parser.parse_training_example("") assert message.get("intent") is None assert message.get(TEXT) == ""
def test_parse_training_example(): message = entities_parser.parse_training_example("Hello!", intent="greet") assert message.get("intent") == "greet" assert message.get(TEXT) == "Hello!"