【问题标题】:NLP problems to handle sentence with conjunctions处理带有连词的句子的 NLP 问题
【发布时间】:2020-11-06 08:16:19
【问题描述】:

我想做的事

我想预处理包括如下连词的句子。 我不在乎主语后面的动词时态和变形。 我想要的是保留两个分别具有主语和动词的新句子。

**Pattern1**
They entered the house and she glanced at the dark fireplace.
["They entered the house ", "she glanced at the dark fireplace"]

**Pattern2** 
Felipa and Alondra sing a song.
["Felipa sing a song”, "Alondra sing a song"]

**Pattern3**
“Jessica watches TV and eats dinner.
["Jessica watch TV, “Jessica eat dinner”]

问题

我能够用下面的代码解决 Pattern1 的句子,但是我想用下面的代码 2 来思考 Pattern2 和 3 的解决方案。

使用the NLP library spaCy,我能够弄清楚连词被识别为CCONJ。 但是,没有任何线索可以实现我想像上面那样做的事情。

请给我你的建议!

当前代码

模式1

text = "They entered the house and she glanced at the dark fireplace."
if 'and' in text:
    text = text.replace('and',',')
    l = [x.strip() for x in text.split(',') if not x.strip() == '']
l

#output
['They entered the house', 'she glanced at the dark fireplace.']

工作代码

text = "Felipa and Alondra sing a song."
doc_dep = nlp(text)
for k in range(len(doc_dep)):
    token = doc_dep[k]
    print(token.text, token.lemma_, token.pos_, token.tag_, token.dep_) 
    if token.pos_ == 'CCONJ':
        print(token.text)

#output
Felipa felipa NOUN NN nsubj
     SPACE _SP 
and and CCONJ CC cc
and
     SPACE _SP 
Alondra Alondra PROPN NNP nsubj
sing sing VERB VBP ROOT
a a DET DT det
song song NOUN NN dobj
. . PUNCT . punct
text = "Jessica watches TV and eats dinner."
doc_dep = nlp(text)
for k in range(len(doc_dep)):
    token = doc_dep[k]
    print(token.text, token.lemma_, token.pos_, token.tag_, token.dep_) 
    if token.pos_ == 'CCONJ':
        print(token.text)
#output
Jessica Jessica PROPN NNP nsubj
watches watch VERB VBZ ROOT
TV tv NOUN NN dobj
and and CCONJ CC cc
and
eats eat VERB VBZ conj
dinner dinner NOUN NN dobj
. . PUNCT . punct

开发环境

python 3.7.4

spaCy 版本 2.3.1

jupyter 笔记本:6.0.3

【问题讨论】:

  • 不太符合您的模式。 Pattern2Felipa 和 Alondra 在哪里写歌。 [“Felipa 唱歌”,“我去购物”] Pattern3 Jessica 看电视吃晚饭。 [“尼克看电视,“杰西卡吃晚餐”] ....................您的意思是说:Pattern2Felipa 和 Alondra 唱歌一首歌。[“Felipa sing a song”,“Alondra sing a song”] Pattern3 Jessica 看电视吃晚饭。[“Jessica 看电视,“Jessica 吃晚饭”] ??
  • 是的。感谢您的评论。

标签: python python-3.x nlp stanford-nlp spacy


【解决方案1】:

没有理由认为相同的代码应该能够处理所有这些情况,因为“and”这个词的功能在每种情况下都非常不同。在模式 1 中,它连接了两个独立的子句。在模式 2 中,它正在创建一个复合主题。在模式 3 中,它是协调动词短语。

我会提醒您,如果您的最终目标是用这种方式“拆分”所有包含“和”(或任何其他并列连词)的句子,那么您面临的工作将非常具有挑战性。并列连词在英语中以多种不同的方式发挥作用。有许多与您在此处列出的不同的常见模式,例如非组成协调(“比尔周三去了芝加哥,周四纽约”,您可能想变成 [“比尔周三去了芝加哥”, “比尔星期四去了纽约”])——注意与“比尔星期四去了芝加哥和纽约”的微妙但关键的区别,它需要变成 [“比尔星期四去了芝加哥”,“比尔去了星期四去纽约”];协调动词(“玛丽看到并听到他走上台阶”)等等。当然,可以协调两个以上的成分(“Sarah, John, and Marcia...”),并且许多模式都可以组合在同一个句子中。

英语很复杂,处理这将是一项艰巨的工作,即使对于在所有要涵盖的情况下对句法情况有很强的掌握能力的语言学家也是如此。正如this paper that considers just a handful of patterns 所说明的那样,即使只是描述英语协调的行为方式也很困难。如果您认为您的代码必须处理具有多个 ' 的现实世界句子并且正在做不同的事情(例如,“自动驾驶汽车将保险责任和道德责任转移给制造商,而且看起来这不会很快改变”) ,任务的复杂性就更清晰了。

也就是说,如果您只对处理最常见和最简单的情况感兴趣,您至少可以通过处理 the one built into NLTK 之类的选区解析器或 @987654323 之类的 SpaCy 插件的结果来取得一些进展@。这至少会清楚地告诉你句子的哪些元素是由连词协调的。

我不知道你的最终任务是什么,所以我不能自信地说出来,但我怀疑通过这种方式预处理所获得的收益是否值得付出努力。您可能会考虑退后一步,思考您想要完成的最终任务,并研究(和/或询问 StackOverflow)是否有任何已知的预处理步骤通常可以提高性能。

【讨论】:

  • 感谢您的回答。在第一次试用中,我对处理最常见和最简单的情况感兴趣,我检查了两个示例:内置于 NLTK 和 benepar。但是,我无法在这些网页上找到有关连词的特定代码。你的意思是使用内置的 NLTK 或 benepar 进行处理,就像我在当前代码上尝试做的那样?如果您能解释您的图像细节以处理最常见和最简单的情况,我将不胜感激。
  • @halt 你能解决一些基本情况吗?我也在尝试对文本进行类似的预处理以拆分句子,然后再将它们传递给打开的 IE 工具。
【解决方案2】:

解决此问题的另一种方法是实现自定义句子边界检测组件。这个组件需要放在Spacy的解析器之前。

请查看this solution,它使用 SBD 组件来分割句子。您还可以使用regex 来查找协调连词,例如和/或,但是。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-18
    • 2015-11-15
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多