如何在nltk中创建句子的否定形式

6

我刚接触NLTK。我想要创建一个句子的否定形式(通常是现在时)。例如,有没有一种函数可以让我将以下内容进行转换:

'I run' 转为 'I do not run'

或者

'She runs' 转为 'She does not run'。

我认为我可以使用POS来检测动词及其前面的代词,但我想知道是否有更简单的内置函数。

3个回答

8
没有简单的内置函数可以解决这个问题,这是一个相当复杂的问题,需要进行研究,而不是简单的内置函数可以解决的。这种操作需要对句子进行语义分析,例如,“我认为我可以跑得更快”,应该否定哪个动词?我们知道是“think”,但对于算法来说它们是一样的。甚至检测是否应该使用“do”或“does”的情况也不那么容易。考虑“玛丽和简走在路上”和“简走在路上”,没有解析树,您将无法区分单数/复数问题。总之,没有简单的解决方案,您可以设计任何类型的启发式方法(如基于POS的否定),如果失败,请在此领域开展研究。

3
你应该使用解析器来查找句子的谓语头(动词)。如果你假设原始句子在语法上是正确的,那么可以依赖于原始谓语头的属性来解决一致性问题(don't vs. doesn't)。
如果它是一个助动词,将其替换为其否定形式(was > wasn'twill > won'thave > haven't 等)。如果它不是助动词,则添加支持-do 的正确否定形式:如果谓语头处于过去式(即walked),则使用 didn't;如果谓语头处于非第三人称单数现在形式(即think),则使用 don't;如果处于第三人称单数现在形式(即runs),则使用 doesn't。紧接着支持-do使用原始谓语头的基本形式(walkthinkrun)。
一个更难解决的问题是 ShaiCohen 在他的回答中所讨论的问题。请注意,你并不总是需要替换这些项。有许多情况下你不应该替换它们,例如:I am the one who saw someone at the office > I'm not the one who saw someone at the office
查看Contextors API

2

除了前面提到的挑战,还有一种负极性项的挑战,即需要前置非肯定元素的词汇项。考虑以下句子:

a. I didn’t see anyone at the office
b. * I saw anyone at the office
c. I saw someone at the office  

(a)的肯定形式不是(b),而是(c),其中anyone被替换为someone
在改变句子的主动语态和被动语态时,否定极性成分也会带来挑战。您可以在这篇文章中了解更多关于这个主题的内容:Voice Alternation and Negative Polarity Items

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接