如何使用RASA NLU处理复合类型的实体?

时间:2018-01-20 20:19:05

标签: python nlp rasa-nlu

让我说我有这样的话语:" 我的名字是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 DoeName类型的复合实体,具有3个简单实体(First NameMiddle NameLast Name),如下所示:

  • 约翰 - 名字(简单实体)
  • 詹姆斯 - 中间名(简单实体)
  • Doe - 姓氏(简单实体)

那么,RASA中有没有我可以制作一种训练格式来处理这些复合类型的实体。

感谢任何帮助,谢谢。

2 个答案:

答案 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"