第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > 主谓宾提取

主谓宾提取

时间:2023-01-27 17:22:45

相关推荐

主谓宾提取

思路

1. 可使用主谓宾的依赖项标记; (Stanford CoreNLP Dependency标签)

Subject: csubj: clausal subject; csubjpass: clausal passive subject;

nsubj: nominal subject;nsubjpass: passive nominal subject;

xsubj: controlling subject

Predicate: aux: auxiliary; auxpass: passive auxiliary;

cop: copula;

vmod: reduced non-finite verbal modifier

Object: dobj: direct object;

iobj: indirect object;

pobj: object of a preposition

2. 一般来说,与Subject直接依赖相关的单词即为谓语;

Githubenhanced-subject-verb-object-extraction代码详解:

textacy.extract.subject_verb_object_triples()不能用

Subject_verb_object_extract.py的处理流程:

# dependency markers for subjectsSUBJECTS = {"nsubj", "nsubjpass", "csubj", "csubjpass", "agent", "expl"}# dependency markers for objectsOBJECTS = {"dobj", "dative", "attr", "oprd"}# POS tags that will break adjoining itemsBREAKER_POS = {"CCONJ", "VERB"}# words that are negationsNEGATIONS = {"no", "not", "n't", "never", "none"}

由Spacy nlp将句子转成Doc类;判断是否为被动句:有无依赖项为"auxpass"的被动助动词;查找主要动词:首先排除助动词,查找“VERB”;若查找不到,则查找含助动词(主、被动)的动词;创建一个visited集合,记录已查找过的单词;遍历主要动词vi:

d1. 根据vi获得其临近的主语si:

d1.1 判断vi是否为否定词:即其子单词的小写化是否在NEGATIONS列表;

d1.2 遍历vi的左子单词,查找在SUBJECTS列表且POS标签非限定词的单词,添加进主语列表;

d1.3 若查找到主语,则遍历每个主语si,从并列连词中扩展主语:

d1.3.1 查找si的右子单词并小写化为rightDeps;

d1.3.2 若rightDeps包含["and", "or", "nor", "but", "yet", "so", "for"],则从si的右子单词中查找在SUBJECTS列表的单词或名词,否则返回more_subs为[];

d1.3.3 若从si的右子单词中查找在SUBJECTS列表的单词或名词后,则递归执行d1.3.1~d1.3.3操作,否则返回more_subs为[];(递归)

d1.4 若未查找到主语:

d1.4.1 查找vi作为动词、名词和根单词的父单词,若非则沿树往上找父单词的父单词,直到满足条件为止;

d1.4.2 若查找到作为动词的父单词hi:

d1.4.2.1 遍历hi的左子单词,查找在SUBJECTS列表且POS标签非限定词的单词,添加进主语列表;

d1.4.2.2 若查找到主语,则判断父单词hi是否为否定词,然后重复d1.3操作,返回主语列表和动词否定标记;

d1.4.2.3 若未查找到主语,则判断父单词hi是否为根单词,然后重复d1.4操作;(递归)

d1.4.3 若查找到作为名词的父单词hi,则返回当前父单词hi,以及vi的否定词标记:

d1.4.4 递归遍历后仍未找到,则返回[],以及False;

d1.4.5 将查找到的主语添加到subs中,与vi的否定词标记一起返回;

d2. 判断动词vi临近的主语si是否为空,为空则不再检查vi:

d2.1 判断vi的右子单词是否为2个以上,且第一个为并列连词;# VERB CCONJ VERB (e.g. he beat and hurt me)

d2.2 若vi存在2个以上右子单词且第一个为并列连词,则判断第2个开始的单词是否为动词,排除助动词;

d2.3 是则返回True和修改后的动词,否则返回False,当前动词vi;

d2.3 若动词vi被识别为并列动词,根据vi和被动句标记查找其宾语:

与d2.4.1~d2.4.6操作一致,也执行d3操作,只是分多个主要动词打印;

d2.4 若动词vi未被识别为并列动词,根据vi和被动句标记查找其宾语:

d2.4.1 遍历vi的右子单词,查找在OBJECTS列表,或被动句中作为介词宾语的单词为宾语;

d2.4.2 从介词中扩展宾语,遍历vi的右子单词,查找POS标签为介词+(依赖标签为介词修饰符/被动句+行为主体)的单词ri:

遍历ri的右子单词查找在OBJECTS列表,或POS标签为代词的me,或被动句+介词宾语的单词,添加为宾语;

d2.4.3 从开放子句补语中扩展宾语,遍历vi的右子单词,查找POS标签为动词且依赖标签为开放子句补语的单词ri,

遍历ri的右子单词查找在OBJECTS列表的单词,添加为宾语,再从介词中扩展宾语(执行d2.4.2操作);

若从开放子句补语中查找出宾语,则返回ri以及宾语列表,否则返回None,None;

d2.4.4若从开放子句补语中查找出宾语,则扩展宾语列表,且主要动词替换为ri;

d2.4.5若宾语列表不为空,从并列连词中扩展宾语:

d2.4.5.1 遍历每个宾语oi,查找oi的右子单词并小写化为rightDeps;

d2.4.5.2 若rightDeps包含["and", "or", "nor", "but", "yet", "so", "for"],则从oi的右子单词中查找是否为宾语的单词或名词,否则返回的more_objs为[];

d2.4.5.3 若从oi的右子单词中查找有为宾语的单词或名词后,则递归执行d3.4.4.1~d3.4.4.3操作,返回的more_objs为[];

d2.4.6返回主要动词(可能经开放子句补语修改过)和扩展后的宾语列表;

d3. 遍历主语列表中每个主语si:

d3.1 若宾语列表不为空:

d3.1.1 遍历每个宾语oi,判断oi是否为否定词;

d3.1.2 若为被动句,则宾谓主:

d3.1.2.1由块扩展obj,再扩展subj->item,若item为’that’则需共指解析:即句子中若任意单词的左子单词为’that’,则返回该单词的父单词;

d3.1.2.2 若item存在左子单词,则遍历其左子单词,若存在“CCONJ”和"VERB"的单词则跳出循环,否则判断是否为否定词,若不为则添加进parts列表;

d3.1.2.3若item存在右子单词,则遍历其右子单词,若存在“CCONJ”和"VERB"的单词则跳出循环,否则判断是否为否定词,若不为则添加进parts列表;

d3.1.2.4 若parts列表末尾项存在右子单词,则遍历其右子单词,若存在POS标签为限定词或名词,且其不在visited列表内,则将其索引添加进visited列表;

并由块扩展该右子单词:即重新执行d3.1.2.1~3.1.2.4操作;

d3.1.2.5判断动词或宾语是否为否定词,是则!+动词小写,否则动词小写;

d3.1.3 若为主动句,则主谓宾:与d3.1.2操作一致,先由块扩展subj,再扩展obj;

d3.2若宾语列表为空:

直接执行d3.1.3操作,仅由块扩展subj;

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。