DialogFlow: как автоматически добавить параметр при использовании Python-интерфейса dialogflow

Мне было интересно, как я могу получить автоматическое отображение между тренировочными фразами и параметрами. Когда вы просто вводите "school" в обучающую фразу, и у вас есть сущность с тем же значением, вы получаете автоматическое сопоставление (см. Здесь после того, как я добавил школу в качестве обучающей фразы, я получил автоматическое сопоставление с сущностью @school https://i.imgur.com/uY8Mq0S.png).

Я хочу это, но я использую API Python для вставки новых намерений. Есть ли способ сделать это, или мне нужно вручную проверить, соответствует ли какое-либо из слов сущности, а затем вручную создать этот параметр для этого намерения? Вот фрагмент кода, который я использую.

import dialogflow_v2beta1

client = dialogflow_v2beta1.IntentsClient()
parent = client.project_agent_path('[project]')

intent = {
    "display_name": "test",
    "webhook_state": True,
    "training_phrases": [{"parts": [{"text": "school", "entity_type": "@school"}], "type": "EXAMPLE"}],
    "parameters": [{"display_name": "school", "entity_type_display_name": "@school", "value": "$school"}]
}

response = client.create_intent(parent, intent)

Спасибо за чтение:)

1 ответ

Решение

Аннотация сущности обучающей фразы является функцией интерфейса Dialogflow и недоступна в API.

Вам необходимо вручную аннотировать сущности в ваших учебных фразах, как вы уже подробно описали в своих вопросах.

Вот код, который может делать то, что вы хотите

def create_annotated_intent(project_id, display_name, training_phrases_parts,
                          action, mapped_entities, message_texts):
    """Create an intent of the given intent type and parameters.
    :type entity_display_name: list

    """

    intents_client = dialogflow.IntentsClient()
    parent = intents_client.project_agent_path(project_id)
    training_phrases = []
    entity_display_name = mapped_entities.keys()

    for training_phrases_part in training_phrases_parts:
        parts = []
        mots = training_phrases_part.split(" ")
        for mot in mots:
            is_entity = False
            for entity_name in entity_display_name:
                if mot in mapped_entities[entity_name]:
                    parts.append(dialogflow.types.Intent.TrainingPhrase.Part(
                        text=mot, entity_type="@" + entity_name, alias=entity_name))
                    if mots.index(mot) != len(mots) - 1:
                        parts.append(dialogflow.types.Intent.TrainingPhrase.Part(
                            text=" "))
                    is_entity = True
                    break
            if not is_entity:
                if mots.index(mot) != len(mots) - 1:
                    parts.append(dialogflow.types.Intent.TrainingPhrase.Part(
                        text=mot + " "))
                else:
                    parts.append(dialogflow.types.Intent.TrainingPhrase.Part(
                        text=mot))

        # Here we create a new training phrase for each provided part.
        training_phrase = dialogflow.types.Intent.TrainingPhrase(parts=parts)
        training_phrases.append(training_phrase)

    text = dialogflow.types.Intent.Message.Text(text=message_texts)
    message = dialogflow.types.Intent.Message(text=text)
    parameters = []

    for entity_name in entity_display_name:
        params = dialogflow.types.Intent.Parameter(display_name=entity_name,
                                                   value='$' + entity_name)
        params.entity_type_display_name = '@' + entity_name
        parameters.append(params)

    intent = dialogflow.types.Intent(
        display_name=display_name,
        action=action,
        parameters=parameters,
        training_phrases=training_phrases,
        messages=[message])

    response = intents_client.create_intent(parent, intent)

    print('Intent created: {}'.format(response))
Другие вопросы по тегам