【问题标题】:Tools for text simplification (Java) [closed]文本简化工具(Java)[关闭]
【发布时间】:2012-03-24 15:45:21
【问题描述】:

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

这里是一个文本简化的例子:

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

【问题讨论】:

  • 我认为以任何真正程度的准确度来做到这一点可能需要 IBM 的 Watson 系统。
  • 你能具体一点吗,我可以用什么工具来应用这个!
  • 简短的回答是否定的,没有工具可以做你所展示的例子。
  • 您给出的具体示例涉及您正在寻找的系统的两个主要功能:(a)语法解析,包括检测相关从句,(b)共指分析(具体来说,检测关系代词“谁”指的是“约翰”)。如果这就是您要寻找的全部,它仍然不是微不足道的,它永远不会 100% 正确工作,但在某种程度上它是可以解决的。告诉我们:这就是您要寻找的一切吗?关系从句的外推?或者您是否想到了许多其他类型的简化,如果有,有哪些?
  • 这不是一个确定的问题。 “文本简化”并不意味着“更短的句子”,也不是“语义上更简单的结构”、“更简单的乔姆斯基树”:它实际上可以意味着任何东西。

标签: java nlp stanford-nlp gate


【解决方案1】:

我认为您的问题是将复杂或复合句子转换为简单句子的任务。 基于文献Sentence Types,一个简单的句子由一个独立的子句组成。复合复合句由至少两个从句构成。此外,从句必须有主语和动词。
所以你的任务是将句子分成构成句子的从句。

Stanford CoreNLP 的依赖解析是将复合句和复杂句拆分为简单句的完美工具。你可以试试demo online
从您的例句中,我们将得到 Stanford typed dependency (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。见Stanford Dependency Manual
基本从句可以从head作为动词部分,dependent作为主语部分。从上面的 SD 中,有两个基本子句,即

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

在获得基本分句后,你可以添加另一个部分,使你的分句成为一个完整而有意义的句子。为此,请咨询Stanford Dependency Manual

顺便说一句,您的问题可能与Finding meaningful sub-sentences from a sentence有关


回答第三条评论:

一旦你得到一对主语和动词,即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) 的所有依赖项的遍历。接下来,从所有的 head 和dependent 中提取单词,然后根据附加到这些单词的数字按升序排列单词。这个数字表示原句中的词序。

John was the CEO a company

我们的新句子少了一个部分,即of。这部分隐藏在 prep_of(CEO-6, company-9) 中。如果您阅读Stanford Dependency Manual,则有两种SD,折叠式和非折叠式。请阅读它们以了解为什么这个 of 被隐藏以及如何获得这个隐藏部分的词序。

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

John played golf

【讨论】:

  • 是否有任何论文应用了这个东西并得到了与问题中显示的相同的结果......
  • 很遗憾没有,AFAIK。我上面的回答是基于我从文本用户需求中提取用例图的经验,我使用Use Case Paths Model Revealing Through Natural Language Requirements Analysis 作为主要参考。
  • 从我们那里得到的输出中,我如何构建我想要的两个句子......这样可以保证我得到我想要的输出!
  • 不错的答案。旧演示的链接已弃用;这是带有测试语句的当前演示。 corenlp.run/….
  • 感谢@VictoriaStuart,演示链接已更新。
【解决方案2】:

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

我仍然认为我应该 大声思考并写下我的方法,也许添加一些 python 代码。我的基本想法是从第一原理中得出解决方案, 主要是通过明确展示我们的模型来了解真实情况。在我们手动和从 SCRATCH 做一个之前,不要依赖其他理论、模型、库。


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

示例:公司的首席执行官约翰打高尔夫球。

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


这是我以模型假设的形式写出的关于这里发生的事情的模型: (公理?)

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

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

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

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

所以让我们把情况扩大一点,让情况复杂一点。

复合案例: 示例 2。公司 CEO 约翰与首席财务官 Ram 一起打高尔夫球。

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

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

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

等等,我们还没有完成!

示例 5。当时担任 CEO 的 John 和担任 CFO 的 Ram 玩高尔夫,这是一款引人入胜的游戏。

为此,我需要扩展我的模型假设:

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

MA5。 'who was' 短语可以省略,因为它可以被听众推断出来。 (例如帐号 4)

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

现在我们如何处理算法中的这些复杂问题?

试试这个:

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

  2. PROCESS_EXTENSIONS: 对于每个分机,如果它有“谁是”或“哪个是”,则在分机词条前用名称替换它。 如果扩展名没有“谁是”或“哪个是”,则放置前导词 and 和一个 is。

  3. PRINT:先是扩展句,然后是基础句。

不可怕。

等我这几天有空的时候,我会添加一个python实现。

谢谢

拉维·安纳斯瓦米

【讨论】:

  • 谢谢,很好的插图,你能不能提供一些关于这个任务的教程,或者一些我可以学习的网站......
【解决方案3】:

我相信AlchemyApi 是您的最佳选择。尽管如此,您仍然需要做很多工作才能完全满足您的需求,而且大多数评论员已经告诉您,您很可能不会获得 100% 的质量结果。

【讨论】:

  • 链接已损坏。请更新。
【解决方案4】:

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

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

约翰被假定为一个存在的名字。约翰的种族不详。约翰出场 在过去的某个时候打高尔夫球。假设高尔夫是指球 游戏叫做高尔夫,但约翰玩的高尔夫的变种是未知的。 在过去的某个时候,约翰是一家公司的首席执行官。假设 CEO 指公司中的“首席执行官”,但这是 未指定。公司不详。

如果教训不明显:你越是试图确定单词的确切含义,你开始打开的蠕虫罐头就越多……它需要人类级别的判断和解释知道什么时候停下来。

您或许可以使用各种基于 Java 的 NLP 工具解决一些更简单的情况:请参阅 Is there a good natural language processing library

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    相关资源
    最近更新 更多