• 浅尝KBQA中使用语义角色标注进行约束挂载


    一、约束挂载

    本文内容主要讲解通过语义角色标注实现约束挂载的流程。

    1.1 约束词识别

    query中的约束词如:

    • 过滤类型:大于、小于、超过、不超过等
    • 最值类型:最大、最小等

    从query中识别出这些约束词可以简单的使用词表进行识别,那么识别出这些约束词之后,怎么挂载到相应的位置呢?

    1.2 约束挂载

    带约束问题是KBQA中常见的复杂问题之一,如:“身高超过1米8的篮球运动员”。约束词为“超过”,在这个例子中需要召回身高超过1米8的篮球运动员,这时候就涉及约束挂载。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m91kQm4p-1663570936522)(D:\资料\微信公众号\imgs\image-20220908203756585.png)]

    二、语义角色标注进行约束挂载流程

    2.1 语义角色标注(SRL)定义

    语义角色标注是一种浅层语义分析技术,以句子为单位,分析句子的谓词-论元结构,其理论基础来源于Fillmore(1968)年提出的格语法,不对句子所包含的语义信息进行深入分析。具体来说,语义角色标注的任务就是以句子的谓词为中心,研究句子中各成分与谓词之间的关系,并且用语义角色来描述他们之间的关系。例如如下所示:

    在这里插入图片描述

    标签释义:

    • A0:施事者、主体、触发者
    • A1:受事者
    • PSR:持有者
    • PSE:被持有者

    2.2 SRL进行约束挂载流程

    案例:”身高超过1米8的篮球运动员“

    1. 分词

      cws=['身高', '超过', '1', '米', '8', '的', '篮球', '运动员']
      
      • 1
    2. 获取SRL标注

      srl=[{'predicate': '超过', 'arguments': [('A0-PSE', '身高'), ('A1', '1米8'), ('A0-PSR', '篮球运动员')]}]
      
      • 1
    3. 使用约束词表从query中获取约束词

      ['超过']
      
      • 1
    4. 实现基于角色标注的约束挂载

      def build_arguments_dict(arguments):
          arguments_dict = dict()
          for k, v in arguments:
              arguments_dict[k] = v
          return arguments_dict
      
      
      def extraction(query):
          cws = ['身高', '超过', '1', '米', '8', '的', '篮球', '运动员']
          op_list = ['超过']
          srl_list = [{'predicate': '超过', 'arguments': [('A0-PSE', '身高'), ('A1', '1米8'), ('A0-PSR', '篮球运动员')]}]
          data = []
          succ_PSE = dict()
      
          for srl in srl_list:
              key = ''
              entity = ''
              val = ''
              predicate = srl['predicate']
              arguments = srl['arguments']
              arguments_dict = build_arguments_dict(arguments)
              if predicate in op_list:
                  op = predicate
                  if 'A0-PSR' in arguments_dict:
                      entity = arguments_dict['A0-PSR']
                  if 'A0' in arguments_dict:
                      entity = arguments_dict['A0']
                  if 'A0-PSE' in arguments_dict:
                      key = arguments_dict['A0-PSE']
                  if entity in succ_PSE:
                      key = succ_PSE[entity]
                  val = arguments_dict['A1'] if 'A1' in arguments_dict else ''
                  deny = True if 'ARGM-ADV' in arguments_dict else False
                  succ_PSE[entity] = key
                  data.append({
                      "entity_type": entity,
                      "condition": [{
                          "key": key,
                          "val": val,
                          "op": op,
                          "deny": deny
                      }]
                  })
          return data
      
      
      if __name__ == '__main__':
          query = '身高超过1米8的篮球运动员'
          print(extraction(query))
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48
      • 49
      • 50
    5. 结果

      [
        {
          "entity": "篮球运动员",
          "condition": [
            {
              "key": "身高",
              "val": "1米8",
              "op": "超过",
              "deny": false
            }
          ]
        }
      ]
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13

    附录

    语义角色类型表:
    在这里插入图片描述

  • 相关阅读:
    数字人如何在抖音实现稳定开播,以及如何防封?
    Java解析MDB(上)-纯JDBC解析非空间数据
    Spring Boot 项目部署方案,打包 + Shell 脚本部署详解,稳的一批
    prometheus监控etcd证书报错问题
    IDEA闪退解决方案记录
    老王谈商业模式:知识付费为什么是风口?
    LeetCode题:两数之和-2023/9/11
    再谈23种设计模式(3):行为型模式(学习笔记)
    如何使用防关联指纹浏览器批量管理多个TikTok账号?
    Linux权限
  • 原文地址:https://blog.csdn.net/yjh_SE007/article/details/126934124