使用Java进行文本简化的最佳工具是什么?
以下是文字简化的示例:
John, who was the CEO of a company, played golf.
↓
John played golf. John was the CEO of a company.
答案 0 :(得分:32)
我认为你的问题是将复杂或复合句子转换成简单句子的任务。 根据文献Sentence Types,一个简单的句子是从一个独立的条款建立的。复合词和复句是由至少两个子句构成的。此外,条款必须有主语和动词 所以你的任务是将句子分成构成你句子的条款。
斯坦福CoreNLP的依赖解析是将复合句和复句分成简单句子的完美工具。您可以尝试demo online 从您的样本句子中,我们将得到斯坦福类型依赖(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中)识别哪个类别是主题,例如, nsubj , nsubjpass 。见Stanford Dependency Manual
Basic子句可以从 head 中提取为动词部分,依赖作为主语部分。从上面的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)
关联的所有依赖项。接下来,从所有头部和从属词中提取单词,然后根据附加到这些单词的数字按升序排列单词。这个数字表示原始句子中的单词顺序。
John was the CEO a company
我们的新句子缺少一部分,即 of
。此部分隐藏在 prep_of(CEO-6, company-9)
中。如果您阅读Stanford Dependency Manual,则有两种 SD ,折叠和非折叠。请阅读它们以了解隐藏 of
的原因以及如何获取此隐藏部分的单词顺序。
用同样的方法,你会得到第二句话
John played golf
答案 1 :(得分:7)
我认为可以为这种情况的基本情况设计一个非常简单的算法,而真实世界的情况可能太多,这样的方法会变得难以驾驭:)
仍然我认为我应该 大声思考并编写我的方法,并可能添加一些python代码。我的基本想法是从第一原则中获得解决方案, 主要通过明确地揭示我们的实际情况模型。在我们用HAND和SCRATCH做之前,不要依赖其他理论,模型和库。
目标:给出一个句子,从中提取子句。
例子:约翰,他是公司的首席执行官,打高尔夫。
预期产出:约翰是该公司的首席执行官。约翰打高尔夫。
以下是我以模型假设的形式写出的模型: (公理?)
MA1。通过插入子句可以扩展简单的句子。 MA2。子权利是对一个或多个实体的资格/修改(附加信息)。 MA3。要插入子句,我们在我们想要扩展的实体旁边放一个逗号(提供更多信息)并附加子句,我将其称为扩展名 - 并在扩展名结束时再添加一个逗号。
鉴于此模型,该算法至少可以直接解决简单案例。
嗯,这是我们的算法。是的,这听起来像一个黑客。它是。但是我现在正在学习的是,如果你在一个程序中使用一个技巧它是一个黑客,如果它可以处理更多的东西,这是一种技术。
因此,让我们稍微扩展并使情况复杂化。
复合案件: 示例2. John是公司的首席执行官,与首席财务官Ram一起打高尔夫。
在我写这篇文章时,我注意到我已经省略了首席财务官的“谁是”这句话! 这让我们看到了我们的算法失败的复杂情况。去那儿之前 让我创建一个更简单的2版本。
示例3. John是该公司的首席执行官,与担任首席财务官的Ram一起打高尔夫球。
示例4.公司首席执行官约翰与首席财务官Ram一起打高尔夫。
等等我们还没有完成!
示例5.当时担任首席财务官的首席执行官约翰和拉姆扮演高尔夫,这是一款引人入胜的游戏。
为此,我需要扩展我的模型假设:
MA4。同样可以扩展多个实体,但不应该引起混淆,因为 扩展条款发生在被通知的实体旁边。 (例如3)
MA5。可以省略'who was'短语,因为它可以由听众推断。 (例如4)
MA6。一些实体是人,他们将使用“谁”扩展,而某些实体是事物,使用“哪个”扩展。可以省略这些扩展头中的任何一个。
现在我们如何在算法中处理这些复杂情况?
试试这个:
SPLIT-句子INTO-BASE-AND-EXTENSIONS: 如果句子包含逗号,请查找以下逗号,并将其中的任何内容提取到扩展句中。继续,直到找不到结束逗号或打开逗号。 此时,您应该有基本句子和一个或多个扩展句子的列表。
PROCESS_EXTENSIONS: 对于每个分机,如果它有“谁是”或“哪个是”,请在分机词前加上名称。 如果扩展名没有'who is'或'which is',请放置前导词和a。是
PRINT:首先是所有扩展句子,然后是基本句子。
不可怕。
当我在接下来的几天里得到一些时间时,我将添加一个python实现。
谢谢
Ravi Annaswamy
答案 2 :(得分:4)
在一般情况下,您不可能使用任何已知算法解决此问题 - 这会进入强AI领域。即便是人类也无法很好地解析语法!
请注意,对于您的简化程度以及您愿意做出的假设,问题非常模糊。你可以进一步举例说:
约翰被认为是存在的名字。约翰的种族不明。约翰出场了 高尔夫在过去的某个时刻。假设高尔夫球是指球 这场比赛叫做高尔夫,但约翰所打的高尔夫球的变种还不得而知。 在过去的某个时刻,约翰是一家公司的首席执行官。首席执行官被认为是 在公司的背景下意味着“首席执行官”,但这是 未标明。该公司未知。
如果课程不明显:你试图确定单词的确切含义越多,你开始打开的蠕虫就越多......它需要人类的判断和解释水平。知道什么时候停止。
您可以使用各种基于Java的NLP工具解决一些更简单的案例:请参阅Is there a good natural language processing library
答案 3 :(得分:1)
我相信AlchemyApi是您最好的选择。仍然需要你做很多工作来完成你所需要的工作,以及大多数评论员如何告诉你,很可能你不会得到100%的质量结果。