m9

0、语义分析

发展过程:依存句法分析-》语义角色标注-》依存语义分析-》抽象语义表示

【依存句法分析,Dependency Parsing, DP】

分析句子里的词语之间的依存关系,如SBV主语关系,VOB动宾关系,ATT修饰关系,常用标记:

1a0a8f55acd4658a7c9a3338768c4017.png

例子:

abd3aa0b8fe80e3357c614a4062aad4d.png

from ltp import LTP
 
ltp = LTP()
 
seg, hidden = ltp.seg(["他叫汤姆去拿外衣。"])
dep = ltp.dep(hidden)
 [['', '', '汤姆', '', '', '外衣', '']]
 [
     [
         (1, 2, 'SBV'),    # 他(1) --|SBV|--> 叫(2)
         (2, 0, 'HED'),    # 叫(2) --|HED|--> ROOT(0)
         (3, 2, 'DBL'),
         (4, 2, 'VOB'),
         (5, 4, 'COO'),
         (6, 5, 'VOB'),
         (7, 2, 'WP')
     ]
 ]

【语义角色标注,Semantic Role Labeling,简称 SRL】

分析词语的角色,标记:

315a400f46ee4081c7be030312d7526d.png

 

例子:

 

071c829c89e49772e6d255226e2b66c5.png

from ltp import LTP
ltp = LTP()
seg, hidden = ltp.seg(["他叫汤姆去拿外衣。"])
srl = ltp.srl(hidden)
 [['', '', '汤姆', '', '', '外衣', '']]
 [
     [
         [],      # 他
         [('ARG0', 0, 0), ('ARG1', 2, 2), ('ARG2', 3, 5)], # 对于“叫”而言 -> [ARG0: 他(列表的索引0-0), ARG1: 汤姆(索引2-2), ARG2: 去拿外衣(索引3-5)]
         [],      # 汤姆
         [],      # 去
         [('ARG0', 2, 2), ('ARG1', 5, 5)],# 对于“拿”而言 -> [ARG0: 汤姆, ARG1: 外衣]
         [],   # 外衣
         []    # 。
     ]
 ]
srl = ltp.srl(hidden, keep_empty=False) # 简化显示
 [
     [
         (1, [('ARG0', 0, 0), ('ARG1', 2, 2), ('ARG2', 3, 5)]), # 叫 -> [ARG0: 他, ARG1: 汤姆, ARG2: 去拿外衣]
         (4, [('ARG0', 2, 2), ('ARG1', 5, 5)])                  # 拿 -> [ARG0: 汤姆, ARG1: 外衣]

 

【语义依存分析 (Semantic Dependency Parsing, SDP)】

分析词语语义之间的关系,标记:

955ff9d81096382610155dbdfb850a24.png

 

例子:

b56e45adfa7d7efb0d44921ee7faf2fe.png

from ltp import LTP
ltp = LTP()
seg, hidden = ltp.seg(["他叫汤姆去拿外衣。"])
sdp = ltp.sdp(hidden, mode='tree')
 [['', '', '汤姆', '', '', '外衣', '']]
 [
     [
         (1, 2, 'Agt'), # 他 -- AGT-- 叫
         (2, 0, 'Root'),   # 叫 --|Root|--> ROOT
         (3, 2, 'Datv'),
         (4, 2, 'eEfft'),
         (5, 4, 'eEfft'),
         (6, 5, 'Pat'),
         (7, 2, 'mPunc')
     ]
 ]

 

 【抽象语义表示 Abstract Meaning Representation (AMR)】

将表示同一个意思的英文句子(不管语法如何),映射到AMR图,AMR的基本结构是“单根有向无环图”,CAMR是针对中文提出的,句子中的词抽象为概念节点,词之间的关系抽象为带有语义关系标签的有向弧,同时忽略虚词和形态变化体现的较虚的语义(如the、单复数、时、体等等),图中的节点不再是单词而是概念,还可以自由引入句子表面不存在的概念

AMR 解析的就是对给定的输入句子,输出一个相应的 AMR图结构

在关系上,语义关系分为两种,核心语义角色关系和非核心语义角色关系。用形如 “Argx(x∈[0,4])”的标签来表示核心语义角色关系,用形如“cost(花费)”等的语义标 签来表示非核心的语义角色关系。

核心语义关系,沿用 OntoNotes 的体系,共5个,即:ARG0(原型施事)、ARG1(原 型受事)、ARG2(间接宾语、工具等)、ARG3(出发点、受益者等)、ARG4(终点);

非核心语义关系表示除核心语义之外的关系类型:

ffcb7f5b102a3c1f3fdd2bdc349662aa.png

 

评估预测的arm和人工arm的方法:smatch,在对两个 AMR图进行匹配度计算时,首先将每个 AMR图转化成一个逻辑三元组的集合,其中每个三元组表示图中的一个顶点或一条边;然后计算两个三元组集合之间的匹配或重叠程度,以 F1 值呈现

import hanlp
hanlp.pretrained.amr.ALL # 语种见名称最后一个字段或相应语料库
 
amr = hanlp.load('MRP2020_AMR_ENG_ZHO_XLM_BASE')
graph = amr(["男孩", "希望", "女孩", "相信", "", ""])
print(graph) # 谓词在中心,论元在子部分,然后针对论元,再对论元分解为谓词和论元,括号内是一个整体块,下面的显示也能转成图的形式
(x2 / 希望-01
    :arg1 (x4 / 相信-01
              :arg0 (x3 / 女孩)
              :arg1 x1)
    :arg0 (x1 / 男孩))

 

1、关系抽取

【概念】论元:与谓词搭配的名词,如“老张走了”,是由一个谓词“走”和一个名词性论元“老张”组成的论元结构

即抽取两个或多个实体之间的联系,比如给定输入 : 句子 “Steve Jobs was the co-founder of Apple Inc” 和两个实体 Steve Jobs 和 Apple Inc。

需要输出:实体之间关系 :/business/company/founder

【基于模板的关系抽取方法】

人工定义关系涉及到的所有模板,

比如,假设 X 和 Y 都表示公司实体,那么可以使用下述模板表示“收购”关系:X is acquired by Y; X is purchased by Y; X is bought by Y;

当句子中所出现的实体匹配其中一个模板时,就可以认为这两个实体具备“收购”的语义关系。

显然,凡是涉及到需要人工去总结归纳的,都不可避免的无法穷举所有模板,这就导致关系抽取的召回率特别低;另外,凡是涉及到模板的,它都是针对特定领域的高度定制化的,不具有可扩展性。

基于特征工程的机器学习方法

先人工定义关系的特征,然后使用特征抽取工具来提取所列举的特征,同时特征抽取的过程是一个串联的(Pipeline)过程,前一步的输出要作为后一步的输入,显然,这不可避免的造成错误的累积和传递,导致抽取的特征不精准,当然最终的关系抽取效果就大打折扣了。

基于神经网络的方法

PCNN(Piece-Wise-CNN)模型=TextCNN + Position Embedding:

输入一句话,输出这句话两个实体之间的关系,如As we known,Steve Jobs was the co-founder of Apple Inc which is a great company in America,这两个实体之间的关系是co-founder

由于句子中有2个实体,所以这条句子就会产生两个和句子长度相同的编码向量,含有其他单词与实体之间的相对距离。

 

  • pos_1:[-4,-3,-2,-1,0,1,2,3......] ,其中0就是 Steve Jobs 的位置。

  • pos_2:[-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3......] 其中0就是 Apple Inc 的位置。

 

因为entities之间有关系的词一般会出现在两个entity之间,左侧,或者右侧,集中注意力分别关注这三部分,所以进行切分:在两个实体处各切一刀将文本分成了3段,2个位置向量也同样切割,上述例句可以切分成这样:

 

  • 1. As we known,Steve Jobs,-4,-3,-2,-1,0,-9,-8,-7,-6,-5

  • 2. Steve Jobs was the co-founder of Apple Inc,....,....

  • 3. Apple Inc which is a great company in America.,.....,....

 

3个部分并行处理, 以1为例,把单词、位置1索引、位置2索引映射为词向量:

As的词向量,-4的词向量,-9的词向量

we的词向量,-3的词向量,-8的词向量

...

分别通过20(举例)个卷积核,每个卷积核宽度=3,生成n*1*20的长方体,再通过池化,变成1*1*20的向量

3个部分拼接,形成1*1*30的向量,然后通过多层神经网络和softmax层,此时的类别个数就是所有关系的个数

【基于RoBERTa的模型,硕士论文】

输入层:将包含两个实体的一句话做格式处理,头实体的前后加{,尾实体的前后加}

 

文本编码层:roberta,针对这2个实体,若某个实体包括多个词,则取多个词向量的平均得到该实体向量h1~,h2~

实体语义角色标签(我改进):roberta的输出加上 crf 层,得到每个词的语义角色标签,如B-Arg0,只看这2个实体的语义角色标签,然后将2个实体的标签转换成对应的标签向量,最后得到2个实体的语义角色标签向量s1,s2

实体感知注意力层:

将实体向量和对应的语义角色标签向量做融合,得到2个实体的融合向量:

 

 

 

 然后用(m1+m2)/2做q,代表实体对,k 和 v 都 = roberta输出{h1,h2,...hn},用q分别点乘 hi 得到相似度,然后通过softmax得到每个词的权重,然后和hi做加权和得到最终句子向量mh,这个句子向量就是实体对对其每个单词做了重要性分配的结果

mh再和m1,m2做拼接得到该层输出

输出层:实体感知注意力层的输出向量接了一个输出层,神经元的个数=所有可能的关系数,用于预测这两个实体包含什么关系

 

 【Roberta实体关系联合抽取,期刊】

 

 

 

从下面的主体模块开始,将一段话输入到roberta中,roberta的输出再接一个crf层,得到每个词的标签预测结果,此时能得到一个 crf 损失:预测某个词是该标签的概率,然后将每个词的概率相乘,再加上(第0个词的标签O转移到第1个词的标签B-PER的概率 * 第1个....转移到第2个....),最后取 -log

通过 crf 的预测结果从中提取所有的主体,遍历每个主体,此例只有刘洪波,该主体通过 BiLSTM 聚合一下主体内的信息,得到的输出向量和实体位置向量拼接,得到该实体向量

遍历所有可能的关系,比如对于关系“民族”,得到关系向量,再把 roberta 的输出结果拿来,把每个词向量做拼接,得到 {实体向量 | 词向量 | 关系向量},然后我改进了一下:

每个词接一个神经网络输出该词是起始和结束的概率,通过预测结果确定一个客体,如果这个客体合法(词起始预测位置<词终点预测位置),我们就能从该段落中预测了一个三元组:主体->关系->客体,通过遍历就可以得到这段话中所有的三元组,其中 客体的开始结尾损失 加上 crf 损失可以作为总损失

 

其他模型详细: https://mp.weixin.qq.com/s?__biz=MzAwOTgwMjQ4OQ==&mid=2649990154&idx=1&sn=7a0057b32c988792f728313776d60c95&chksm=835d039cb42a8a8a681468f54d21f04789970a5ad586254351379bb9dc1125cecce97ce6dc4c&cur_album_id=2370685926617645061&scene=189#wechat_redirect

 

 2、共指消解

目前思路:先找到所有可能的span(连续的词,如a big dog),然后mention detection检测他是不是mention(比如a big就不是mention),然后通过mention pair detection判定两两mention是不是共指(如果只有1个共指,则叫singleton,共指中前面的mention叫antecedent,后面的叫作 anaphor)

   # 叫(2) --|HED|--> ROOT(0)
posted @ 2022-06-20 12:28  Jary霸  阅读(1227)  评论(0)    收藏  举报