Пример #1
0
    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)
Пример #2
0
    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
Пример #3
0
    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', [])
Пример #4
0
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"}
    ]
Пример #5
0
    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)
Пример #6
0
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}
    )
Пример #7
0
def test_parse_empty_example():
    message = entities_parser.parse_training_example("")
    assert message.get("intent") is None
    assert message.get(TEXT) == ""
Пример #8
0
def test_parse_training_example():
    message = entities_parser.parse_training_example("Hello!", intent="greet")
    assert message.get("intent") == "greet"
    assert message.get(TEXT) == "Hello!"