文本简化工具(Java)

使用Java进行文本简化的最佳工具是什么?

以下是文本简化的示例:

John, who was the CEO of a company, played golf. ↓ John played golf. John was the CEO of a company. 

我认为你的问题是将复杂或复合句子转换成简单句子的任务。 根据文献句子类型 ,一个简单的句子是从一个独立的条款建立的。 复合词和复句是由至少两个子句构成的。 此外,条款必须有主语和动词。
所以你的任务是将句子分成构成你句子的条款。

从斯坦福CoreNLP解析依赖性是将复合句和复句分成简单句子的完美工具。 您可以在线试用该演示 。
从您的样本句子中,我们将得到斯坦福类型依赖(SD)表示法的解析结果,如下所示:

nsubj(CEO-6, John-1)
nsubj(played-11, John-1)
cop(CEO-6, was-4)
det(CEO-6, the-5)
rcmod(John-1, CEO-6)
det(company-9, a-8)
prep_of(CEO-6, company-9)
root(ROOT-0, played-11)
dobj(played-11, golf-12)

可以从关系(在SD中)识别哪个类别是主题,例如nsubjnsubjpass 。 请参阅斯坦福依赖手册
Basic子句可以从头部作为动词部分提取,并作为主体部分依赖 。 从上面的SD,有两个基本条款即

  • 约翰CEO
  • 约翰出场了

获得基本条款后,您可以添加另一部分,使您的子句成为完整而有意义的句子。 为此,请参阅斯坦福依赖手册 。

顺便说一下,你的问题可能与从句子中找出有意义的子句有关


回答第3条评论:

一旦你得到一对主语,即nsubj(CEO-6, John-1) ,获得所有依赖于该依赖关系的依赖关系,除了该类别所依赖的任何依赖关系,然后从这些依赖关系中提取唯一的单词。

基于例子, nsubj(CEO-6, John-1) ,如果你开始从John-1 ,你将获得nsubj(played-11, John-1)但你应该忽略它,因为它的类别是主题。

下一步是从CEO-6部分开始。 你会得到

cop(CEO-6, was-4)
det(CEO-6, the-5)
rcmod(John-1, CEO-6)
prep_of(CEO-6, company-9)

从上面的结果中,你得到了新的依赖关系来遍历(即找到另一个依赖was-4, the-5, company-9的头部或依赖的依赖关系)。
现在你的依赖是

cop(CEO-6, was-4)
det(CEO-6, the-5)
rcmod(John-1, CEO-6)
prep_of(CEO-6, company-9)
det(company-9, a-8)

在此步骤中,您已完成遍历与nsubj(CEO-6, John-1)链接的所有依赖项。 接下来,从所有头部和从属词中提取单词,然后根据附加到这些单词的数字按升序排列单词。 这个数字表示原始句子中的单词顺序。

John was the CEO a company

我们的新句子缺少一部分,即。 这部分隐藏在prep_of(CEO-6, company-9) 。 如果您阅读斯坦福依赖手册 ,有两种SD ,折叠和非折叠。 请阅读它们以了解为什么隐藏这个以及如何获得这个隐藏部分的单词顺序。

用同样的方法,你会得到第二句话

John played golf

我认为可以为这种情况的基本情况设计一个非常简单的算法,而真实世界的情况可能太多,这样的方法将变得难以驾驭:)

我仍然认为我应该大声思考并编写我的方法,并可能添加一些python代码。 我的基本想法是从第一原则中获得解决方案,主要是通过明确地揭示我们的实际模型。 在我们用HAND和SCRATCH做之前,不要依赖其他理论,模型和库。


目标:给出一个句子,从中提取子句。

例如:约翰,他是公司的首席执行官,打高尔夫球。

预期产出:约翰是该公司的首席执行官。 约翰打高尔夫球。


以下是我以模型假设的forms写出的模型:(公理?)

MA1。 通过插入子句可以扩展简单的句子。 MA2。 子项是对一个或多个实体的资格/修改(附加信息)。 MA3。 要插入子句,我们在我们想要扩展的实体旁边放一个逗号(提供更多信息)并附加子句,我将其称为扩展名 – 并在扩展名结束时放置另一个逗号。

给定此模型,该算法可以直接至少首先解决简单情况。

  1. 检测:给定一个句子,通过在句子中查找一对逗号来检测它是否具有扩展子句。
  2. 提取:如果你找到两个逗号,生成两个句子:2.1 EXTRACT-BASE:基本句子:删除两个逗号之间的所有内容,你得到基本句子。 2.2 EXTRACT-EXTENSION:扩展句:将所有内容都放在扩展句中,将“who”替换为前面的单词。 那是你的第二句话。
  3. 打印:实际上你应该首先打印扩展句子,因为基本句子取决于它。

嗯,这是我们的算法。 是的,这听起来像是一个黑客。 它是。 但我现在正在学习的是,如果你在一个程序中使用技巧它是一个黑客,如果它可以处理更多的东西,这是一种技术。

因此,让我们稍微扩展并使情况复杂化。

复合案例:例2. John是公司的首席执行官,与首席财务官Ram一起打高尔夫球。

在我写作的时候,我注意到我省略了CFO的“谁是”这句话! 这让我们看到了复杂的情况,即我们的算法会失败。 在去那里之前,让我创建一个更简单的2版本。

示例3. John是该公司的首席执行官,与担任首席财务官的Ram一起打高尔夫球。

示例4.公司首席执行官约翰与首席财务官Ram一起打高尔夫球。

等等我们还没完成!

示例5.当时担任首席财务官的首席执行官约翰和拉姆扮演高尔夫,这是一款引人入胜的游戏。

为了实现这一点,我需要扩展我的模型假设:

MA4。 可以同样扩展多个实体,但不应引起混淆,因为扩展条款紧挨着被通知的实体发生。 (例如3)

MA5。 可以省略’who was’短语,因为它可以由听众推断。 (例如4)

MA6。 一些实体是人,他们将使用“谁”扩展,而某些实体是事物,使用“哪个”扩展。 可以省略这些扩展头中的任何一个。

现在我们如何在算法中处理这些复杂情况?

尝试这个:

  1. SPLIT-SENTENCE-INTO-BASE-ANDTENSIONS:如果句子包含逗号,请查找以下逗号,并将其中的任何内容提取到扩展句中。 继续,直到找不到结束逗号或打开逗号。 此时,您应该有基本句子和一个或多个扩展句子的列表。

  2. PROCESS_EXTENSIONS:对于每个扩展,如果它具有’who is’或’which is’,则在扩展词条之前按名称替换它。 如果扩展名没有“who is”或“which is”,则放置前导词和a。

  3. 打印:首先是所有扩展句子,然后是基本句子。

不可怕。

当我在接下来的几天里得到一些时间时,我将添加一个python实现。

谢谢

Ravi Annaswamy

在一般情况下,您不太可能使用任何已知算法解决此问题 – 这是进入强AI领域。 即便是人类也无法很好地解析语法!

请注意,对于您的简化程度以及您愿意做出的假设,问题非常模糊。 你可以进一步举例说:

约翰被认为是存在的名字。 约翰的种族未知。 约翰在过去的某个时候打过高尔夫球。 高尔夫被认为是指称为高尔夫的球类比赛,但约翰所打的高尔夫变体是未知的。 在过去的某个时刻,约翰是一家公司的首席执行官。 首席执行官在公司背景下被认为是“首席执行官”,但这没有具体说明。 该公司不详。

如果课程不明显:你试图确定单词的确切含义越多,你开始打开的蠕虫就越多……它需要类似人类的判断和解释才能知道何时停止。

您可以使用各种基于Java的NLP工具解决一些更简单的案例:请参阅是否有一个好的自然语言处理库

我相信AlchemyApi是你最好的选择。 仍然需要你做很多工作来完成你所需要的,以及大多数评论员如何告诉你,很可能你不会得到100%的质量结果。