我想知道是否有人熟悉算法句子否定的任何尝试。
例如,给定一个像“这本书很好”这样的句子,提供任意数量的替代句子,意思是相反的,比如“这本书不好”甚至“这本书很糟糕”。
显然,以高精度完成此任务可能超出了当前 NLP 的范围,但我确信已经有一些关于该主题的工作。如果有人知道任何工作,请给我指出一些文件吗?
我想知道是否有人熟悉算法句子否定的任何尝试。
例如,给定一个像“这本书很好”这样的句子,提供任意数量的替代句子,意思是相反的,比如“这本书不好”甚至“这本书很糟糕”。
显然,以高精度完成此任务可能超出了当前 NLP 的范围,但我确信已经有一些关于该主题的工作。如果有人知道任何工作,请给我指出一些文件吗?
虽然我不知道有任何专门研究自动生成否定句的工作,但我想一个好的起点是阅读形式语义学和语用学中的语言学工作。Steven C. Levinson 的 Pragmatics书是一个很好的入门介绍。
我认为你会遇到的一个问题是,很难否定一个句子所传达的所有信息。例如,采取:
John fixed the vase that he broke.
即使您将其更改为John没有修复他打破的花瓶,也有一个假设是有一个花瓶并且约翰打破了它。
同样,简单地否定“约翰没有停止使用毒品”这句话,因为“约翰停止使用毒品”仍然传达出约翰曾在某一时刻使用过毒品。更彻底的否定是约翰从未使用过毒品。
您可能想要查看的一些现有自然语言处理 (NLP) 工作是 MacCartney 和 Manning 2007 年的Natural Logic for Textual Inference。在本文中,他们使用 George Lakoff 的自然逻辑概念和 Sanchez Valencia 的单调性演算来创建自动确定一个句子是否包含另一个句子的软件。您可能可以使用他们的一些技术来检测非蕴涵,以人为地构建否定和矛盾的句子。
当然,最简单的方法是尝试在 {am,are,is} 之后添加“not”。我不知道这将如何在您的设置中起作用,它可能只适用于类似谓词的句子。
对于简单的句子,根据英语语法规则解析寻找副词或形容词,如果只存在一个含义,则替换反义词。否则使用正确的英语否定规则来否定动词(即:is -> is not)。
高级算法:
对于更复杂的句子,例如带有从句的句子,您需要进行更复杂的分析,但对于简单的句子,这应该不是不可行的。
一阶逻辑也有类似的过程。通常的算法是映射P
到not P
,然后执行有效的翻译以移动not
到方便的地方,例如:
Original: (not R(x) => exists(y) (O(y) and P(x, y)))
Negate it: not (not R(x) => exists(y) (O(y) and P(x, y)))
Rearrange: not (R(x) or exists(y) (O(y) and P(x, y)))
not R(x) and not exists(y) (O(y) and P(x, y))
not R(x) and forall(y) not (O(y) and P(x, y))
not R(x) and forall(y) (not O(y) or not P(x, y))
在英语上执行相同的操作会否定“如果这里不下雨,那么有些活动是户外活动,可以在这里进行”到“不是这样……”,最后变成“这是没有下雨,所有可能的活动要么不适合户外活动,要么不能在这里进行。”
当然,自然语言比一阶逻辑复杂得多……但是如果您可以将句子解析为可以识别“不”、“与”、“或”、“存在”等词的东西,那么您应该能够执行类似的翻译。
Nice demos using NTLK - http://text-processing.com/demo and a short writeup - http://text-processing.com/demo/sentiment/.