如何在nltk中创建句子的否定形式
我刚接触NLTK这个工具。我想把一个句子变成否定句(通常是现在时)。比如,有没有什么函数可以让我把:
'我跑'变成'我不跑'
或者
'她跑'变成'她不跑'。
我想我可以用词性标注来找出动词和它前面的代词,但我只是想知道有没有更简单的内置函数可以用。
3 个回答
除了之前提到的挑战,还有一个叫做负极性项的挑战。这些是一些词语,它们需要前面有一个否定的成分。我们来看下面的句子:
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。
在进行句子改写,比如把主动语态改成被动语态时,负极性项也会带来麻烦。想了解更多,可以查看这篇文章:语态转换与负极性项。
没有,确实没有简单的解决办法。更重要的是,这个问题相当复杂,甚至可以作为研究课题,而不是简单的内置函数能解决的。这样的操作需要对句子进行语义分析。比如说“我觉得我能跑得更快”,在这句话中,三个动词中哪个应该被否定呢?我们知道是“觉得”,但对算法来说,它们都是一样的。甚至判断用“do”还是“does”也不是那么简单。想想“玛丽和简沿着路走”和“简沿着路走”,如果没有解析树,你就无法区分单数和复数的问题。总之,没有,也不可能有简单的解决方案。你可以设计任何你想要的启发式方法(其中一种是基于词性标注的否定方法),如果失败了,那就开始在这个领域进行研究吧。
你应该使用一个解析器来找到句子的谓语动词部分,也就是句子的“头”。
如果你假设原句的语法是正确的,那么你可以通过原始动词的特性来解决主谓一致的问题(比如 don't 和 doesn't 的使用)。
如果这个动词是助动词1,就把它换成对应的否定形式(比如 was 变成 wasn't,will 变成 won't,have 变成 haven't,等等)。如果不是助动词,就要加上正确的否定形式的支持动词do:如果主动词是过去式(比如 walked),就用 didn't;如果是非第三人称单数的现在式(比如 think),就用 don't;如果是第三人称单数的现在式(比如 runs),就用 doesn't。然后紧接着支持动词do后面要用原动词的基本形式(比如 walk、think、run)。
还有一个更难解决的问题,就是ShaiCohen在他的回答中提到的。注意,并不是所有的情况都需要替换这些词。有很多情况下你是不应该替换的。例如:I am the one who saw someone at the office 变成 I'm not the one who saw someone at the office。
可以看看这个 Contextors API。
1 注意那些看起来像助动词的词汇动词。比如 She has a dog...