文本简化工具 (Java) [已关闭]

2022-09-02 19:47:45

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

下面是文本简化的示例:

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

答案 1

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

来自斯坦福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。参见斯坦福依赖手册
基本子句可以从头部提取为动词部分,从属为主语部分。从上面的SD来看,有两个基本条款,即

  • 约翰 首席执行官
  • 约翰扮演

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

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


对第三条评论的回答:

一旦你得到了一对主语动词,即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,公司-9)中。如果你读过斯坦福依赖手册,有两种SD,折叠和非折叠。请阅读它们,以了解为什么这是隐藏的,以及如何获得此隐藏部分的词序。

使用相同的方法,您将获得第二句话

John played golf


答案 2

我认为人们可以为这种情况的基本情况设计一个非常简单的算法,而现实世界的情况可能太多了,这种方法会变得不守规矩:)

我仍然认为我应该大声思考并编写我的方法,并可能添加一些python代码。我的基本思想是从第一性原理中推导出一个解决方案,主要是通过明确地暴露我们真正发生的事情的模型。而不是依赖其他理论,模型,库之前,我们手动和从头开始做一个。


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

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

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


以下是我以模型假设的形式写出来的模型:(公理?

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

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

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

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

因此,让我们把情况扩大一点,使情况复杂化一点。

复利案例:实施例2.约翰是该公司的首席执行官,他与首席财务官拉姆一起打高尔夫球。

在我写这篇文章的时候,我注意到我省略了CFO的“谁是”这个短语!这给我们带来了一个复杂的情况,即我们的算法将失败。在去那里之前,让我创建一个更简单的2版本,它将起作用。

示例 3.约翰是该公司的首席执行官,他与首席财务官拉姆一起打高尔夫球。

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

等等,我们还没有完成!

示例 5.约翰是首席执行官,拉姆是当时的首席财务官,他玩高尔夫,这是一个引人入胜的游戏。

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

MA4.可以同样扩展多个实体,但不应引起混淆,因为扩展子句就出现在被告知的实体旁边。(例如 3 个帐户)

MA5.“谁是”短语可以省略,因为它可以由听众推断出来。(例如 4 个帐户)

MA6.有些实体是人,它们将使用“who”进行扩展,而某些实体是事物,使用“who”进行扩展。这些扩展头中的任何一个都可以省略。

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

试试这个:

  1. 将句子拆分为基数和扩展名:如果句子包含逗号,请查找以下逗号,并将两者之间的任何内容提取到扩展句中。继续,直到您不再找到左结束逗号或左开始逗号。此时,您应该具有包含基本句和一个或多个扩展句的列表。

  2. PROCESS_EXTENSIONS:对于每个扩展名,如果它具有“who is”或“who is”,请在扩展名标题词之前将其替换为name。如果扩展没有“谁是”或“哪个是”,请放置前导词和 is。

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

不可怕。

当我在接下来的几天里有时间时,我会添加一个python实现。

谢谢

拉维·安纳斯瓦米


推荐