将复合句拆分成简单句

Anu*_*pta 5 nlp chatbot

我正在寻找一个可以将复合句拆分成简单句的句子分割器。

例子:

Input: Andrea is beautiful but she is strict.
(expected) Output: Andrea is beautiful. she is strict.

Input: i am andrea and i work for google. 
(expected) Output: i am andrea. i work for google.

Input: Italy is my favorite country; i plan to spend two weeks there next year.
(expected) Output: Italy is my favorite country. i plan to spend two weeks there next year.
Run Code Online (Sandbox Code Playgroud)

有什么建议吗?我尝试了 NLTK、spacy、segtok、nlp-compromise,但它们不适用于这些复杂的示例(我知道这是一个难题,因此没有简单的解决方案)。

Jas*_*gel 3

首先,你需要从语言(语法)的角度更好地定义“简单句子”对你意味着什么。例如,你可以说这个简单的句子是:

  • 只是文本,中间没有标点符号(句号、逗号、冒号等)
  • 那些只有一个动词的人。在这种情况下,您将处理层次结构,其中一个句子通过重用另一个句子来“完成”。
  • 类似于短语的文本,其中连词也可以充当分隔符。

简而言之,您有很多选择来定义它,并且根据您的需要,您的“规则”应该更加(或不太)严格,因为它将影响您的算法设计和(当然)您的输出。

我建议你 2 条基本说明

  1. 按标点符号分割,因此您将得到“更简单的句子”(例如您的输入3)
  2. 将其中的每一个输入到依赖项解析器(例如 Spacy),并利用依赖项链接作为分隔符。

使用您提供的示例进行演示:
Spacy 输出这些树input1input2。您可能会注意到,使用conj作为分隔符并合并剩余的子树,它会返回您期望的输出。正如我上面提到的,在按标点符号分割后,您可以对 input3 执行相同的操作。

最后,这不是一个简单的任务,您可能可以接受这些简单的规则,但如果您需要更好的结果,请首先改进您对“复合”或“简单”句子含义的定义,并使用以下命令查看更复杂的算法机器学习。

虽然这是一个非常古老的问题,但很高兴知道这是否有帮助:)