本文内容主要讲解通过语义角色标注实现约束挂载的流程。
query中的约束词如:
从query中识别出这些约束词可以简单的使用词表进行识别,那么识别出这些约束词之后,怎么挂载到相应的位置呢?
带约束问题是KBQA中常见的复杂问题之一,如:“身高超过1米8的篮球运动员”。约束词为“超过”,在这个例子中需要召回身高超过1米8的篮球运动员,这时候就涉及约束挂载。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m91kQm4p-1663570936522)(D:\资料\微信公众号\imgs\image-20220908203756585.png)]
语义角色标注是一种浅层语义分析技术,以句子为单位,分析句子的谓词-论元结构,其理论基础来源于Fillmore(1968)年提出的格语法,不对句子所包含的语义信息进行深入分析。具体来说,语义角色标注的任务就是以句子的谓词为中心,研究句子中各成分与谓词之间的关系,并且用语义角色来描述他们之间的关系。例如如下所示:
标签释义:
案例:”身高超过1米8的篮球运动员“
分词
cws=['身高', '超过', '1', '米', '8', '的', '篮球', '运动员']
获取SRL标注
srl=[{'predicate': '超过', 'arguments': [('A0-PSE', '身高'), ('A1', '1米8'), ('A0-PSR', '篮球运动员')]}]
使用约束词表从query中获取约束词
['超过']
实现基于角色标注的约束挂载
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))
结果
[
{
"entity": "篮球运动员",
"condition": [
{
"key": "身高",
"val": "1米8",
"op": "超过",
"deny": false
}
]
}
]
语义角色类型表: