【问题标题】:How to handle composite type of Entities using RASA NLU?如何使用 RASA NLU 处理复合类型的实体?
【发布时间】:2019-06-05 16:10:02
【问题描述】:

假设我有这样的话语:“我的名字是 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),如下所示:

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

那么,在 RASA 中是否有任何内容可供我制作用于处理这些复合类型实体的训练格式。

感谢您的帮助。

【问题讨论】:

    标签: python nlp rasa-nlu


    【解决方案1】:

    我相信,如果您继续使用 Name 实体类型进行训练,该实体类型会为所有名称提取一段文本,然后尝试从返回的实体文本中处理各个复合部分,我相信您会更轻松。原因是如果您尝试在组件上进行训练,您很快就必须在训练数据中提供大量组合,而这将变得无效。

    还请记住,随着您的深入,这不是一个微不足道的问题。如果您单独使用位置来确定第一个/中间/最后一个,您在日本可能会遇到问题(https://www.sljfaq.org/afaq/names-for-people.html),如果您尝试训练根据内容识别名称(即挑选 Doe 作为姓氏),它将是容易出现问题:美国人的名字在其他地方被认为是姓氏(杰克逊、亨特等)并不陌生,中间名也有很大差异(https://en.m.wikipedia.org/wiki/Middle_name)

    【讨论】:

    • 我同意假设所有名称都遵循个人中产家庭模式是非常以西方为中心的......但是,确实存在复合实体是一个很好的抽象的情况
    【解决方案2】:

    我为此写了一个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"
    

    如果它被包含,您将获取属于包含部分的所有实体值并将它们组合到一个 full_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"
    

    【讨论】:

    • 看看这个guide 并阅读以下部分:“不要过多地谈论你的产品/网站/书籍/工作”。您不应该谈论自己的产品,或者至少不应该将它们标记为您自己的产品。
    • 嗨 Aaron,感谢您的提醒和链接。我添加了对我的代码如何工作的描述,以避免将单个链接作为答案。我仍然认为我的答案是有效的,因为它 a)提供了问题的直接解决方案 b)我链接到开源代码,我不是在销售产品。我希望通过提供描述我不再违反任何规则。
    猜你喜欢
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多