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))