【问题标题】:Extract entities from Multiple Subject passive sentence by SpacySpacy 从多主语被动句中提取实体
【发布时间】:2016-12-18 12:31:44
【问题描述】:

使用 Python Spacy,我正在尝试从多个主题被动语态句子中提取实体。

句子 = “约翰和珍妮被大卫指控犯罪”

我的意图是从句子中提取“John and Jenny”作为nsubjpass.ent_

但是,我只能将“John”提取为 nsubjpass。

如何提取它们?

请注意,虽然在 .ents 中发现 John 作为实体,但 Jenny 被视为 conj 而不是 nsubjpass。 如何改进?

代码

each_sentence3 =  "John and Jenny were accused of crimes by David"
doc=nlp(each_sentence3)

passive_toks=[tok for tok in doc if (tok.dep_ == "nsubjpass") ]
if passive_toks != []:
    print(passive_toks)

结果:

[John]

实体列表显示:

代码

`

print(list(doc.ents)

结果

[John, Jenny, David]

现在如果我们检查整个句子,我们会看到如下:

代码:

for tok in doc:   
        print(tok, tok.dep_)

结果

John nsubjpass
and cc
Jenny conj
were auxpass
accused ROOT
of prep
crimes pobj
by agent
David pobj

注意第二个被动主语 Jenny 在 Spacy 中被识别为 conj 而不是 nsubjpass。

【问题讨论】:

  • 这不是依赖解析器语法处理连接主题的标准方式吗?我看到从语言的角度来看,您希望两个成员平等地成为主题的一部分,但我认为您不会从解析器中得到这一点(除非您使用选区)。

标签: python nlp nltk spacy


【解决方案1】:

这里是一个使用词性标签和依赖解析来提取主语及其所有连词的示例。

还有一个 Token.conjuncts 属性,但它只能直接连接到令牌。见https://github.com/explosion/spaCy/issues/795

each_sentence3 = "John and Jenny were accused of crimes by David"
sent = nlp(each_sentence3)

result = []
subj = None
for word in sent:
    if 'subj' in word.dep_:
        subj = word
        result.append(word)
    elif word.dep_ == 'conj' and word.head == subj:
        result.append(word)
print str(result)


[John, Jenny]

【讨论】:

    猜你喜欢
    • 2017-05-03
    • 2021-01-11
    • 2019-11-03
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    • 2021-07-19
    • 2021-02-23
    • 1970-01-01
    相关资源
    最近更新 更多