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

23 篇文章 4 订阅
9 篇文章 1 订阅

一、约束挂载

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

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', '的', '篮球', '运动员']
    
  2. 获取SRL标注

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

    ['超过']
    
  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))
    
    
  5. 结果

    [
      {
        "entity": "篮球运动员",
        "condition": [
          {
            "key": "身高",
            "val": "1米8",
            "op": "超过",
            "deny": false
          }
        ]
      }
    ]
    

附录

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值