让我说我有这样的话语:" 我的名字是John James Doe "
{
"rasa_nlu_data": {
"common_examples":
[
{
"text": "My name is John James Doe",
"intent": "Introduction",
"entities": [
{
"start": 11,
"end": 25,
"value": "John James Doe",
"entity": "Name"
}
]
}
],
"regex_features" : [],
"entity_synonyms": []
}
}
此处子字符串John James Doe
是Name
类型的复合实体,具有3个简单实体(First Name
,Middle Name
,Last Name
),如下所示:
那么,RASA中有没有我可以制作一种训练格式来处理这些复合类型的实体。
感谢任何帮助,谢谢。
答案 0 :(得分:0)
我相信如果你继续训练一个实体类型的Name,为所有名称提取一段文本,然后尝试从返回的实体文本中处理单个复合部分,我相信你会更容易。原因在于,如果您尝试对组件进行训练,您将很快在训练数据中提供大量组合,这将无效。
另外请记住,随着您的深入,这不是一个微不足道的问题。如果您单独使用位置来确定第一个/中间/最后一个,那么您可能在日本遇到问题(https://www.sljfaq.org/afaq/names-for-people.html),如果您尝试根据内容进行训练以识别名称(即选择Doe作为姓氏)很容易出现问题:美国人不知道其他人被认为是姓氏的名字(杰克逊,亨特等),中间名也有很大差异(https://en.m.wikipedia.org/wiki/Middle_name)
答案 1 :(得分:0)
为此我也写了custom component,因为我也需要复合实体。这是其工作原理的摘要。
假设您的训练数据看起来像这样:
"rasa_nlu_data": {
"common_examples":
[
{
"text": "My name is John James Doe",
"intent": "Introduction",
"entities": [
{
"start": 11,
"end": 15,
"value": "John",
"entity": "first_name"
},
{
"start": 16,
"end": 21,
"value": "James",
"entity": "middle_name"
},
{
"start": 22,
"end": 25,
"value": "Doe",
"entity": "last_name"
},
]
}
],
"regex_features" : [],
"entity_synonyms": []
}
}
因此,您不是训练全名作为将被拆分的实体,而是训练将被分组为全名的姓名部分。
现在的基本思想是使用实体占位符定义复合模式。对于您的示例,您可以定义以下模式:
full_name = "@first_name @middle_name @last_name"
对于您的例句,Rasa NLU将像这样识别其中的三个实体:
My name is John James Doe
^ ^ ^
first_name middle_name last_name
您使用输入的句子,并将每个已识别的实体替换为其实体类型:
My name is @first_name @middle_name @last_name
您现在可以执行简单的检查,是否在该字符串中包含您定义的模式。
My name is @first_name @middle_name @last_name
^
| Pattern matches
|
"@first_name @middle_name @last_name"
如果包含,则将包含中的所有实体值取整,并将它们分组为一个全名。
My name is John James Doe
^
| Pattern matches
|
@first_name @middle_name @last_name
-> full_name = ["John", "James", "Doe"]
如果使用正则表达式而不是简单的字符串匹配,则可以使该系统更加灵活。例如,您可以通过将模式更改为
来使中间名为可选full_name = "@first_name (@middle_name )?@last_name"