【问题标题】:Adding a new line character at the end of the sentence在句尾添加换行符
【发布时间】:2012-05-17 15:51:07
【问题描述】:

我有一个字符串,它是一本书的片段(大约 1 章) 这个字符串都是一行。 我想在每个句子的末尾换一个新行

我通过一个不那么复杂的代码解决了它

text = text.replaceAll("\\.","\\.\n"); //same for ? same for !

当然这不会产生很好的结果。 我不需要它是完美的,但我可以做得越好。

我想在创建换行符之前至少检查以下内容:

the word before the . is longer then 2 characters
there are no dots before the . in the same "word"
the character before the . is not a number
the character after the dot (and possibly a whitespace after that dot) is not a (

非常感谢任何其他建议,以及实现它的实际代码。

类似的问题: Here

更新:

虽然在我的优先级列表中并不高,因为我的书不包含很多直接引语或直接演讲,但处理其中的句子的规则也是有序的,这样来自同一个 qoute 的句子就不会出现在换行

【问题讨论】:

  • 那你的句子不都是以短词开头的吗?我希望此评论中的两个句子都算作句子,但它们都不是以长于两个字符的单词开头的。
  • (另外,考虑以问号结尾的问题,以及句号后面可能有双引号的演讲。)
  • 你将如何处理所有的缩写、直接引语或省略号?例如,句子:'Dr.史密斯问:“你好吗?”,但我暂时没有回答。
  • 谢谢,这是一个错字。我想说在点之前而不是之后(我知道这会使某些句子不起作用。但它们中的大多数不会以 2 个字符或更短的单词结尾)
  • 这个线程看起来很有希望:stackoverflow.com/questions/4373612/…

标签: java nlp


【解决方案1】:

Stanford's CoreNLP 工具包有一个做句子分割的类。查看更多here

如果你说new DocumentPreprocessor(new StringReader(s)).iterator() 其中s 是一个包含文本的字符串,它会给你一个句子的迭代器。

请注意,这也会标记句子。如果您希望句子看起来像它开始的方式,您可以仅使用此输出作为拆分指南,或运行PTBTokenizer -untok 命令(参见与上面相同的链接)以使每个标记化的句子再次看起来正常。

这几乎肯定会比您的规则列表更有效,因为您的规则没有考虑到许多重要情况。

【讨论】:

  • 谢谢如果我下载 下载 Stanford CoreNLP 版本 1.3.1 它将包含 Stanford English Tokenizer 对吗?我现在正在下载它,我不想下载错误的 250 MB 文件
  • 好吧,一旦我开始工作,我就接受你的回答。只是想看看它有多好:)
【解决方案2】:

如果我正确理解了您的要求,请尝试以下操作:

text = text.replaceAll("[^\\.]{1,}\\D\\.\\s?[^\\(]","\\.\n");

【讨论】:

  • 你能解释一下你的代码吗?它是否真的检查我指定的内容。
  • [^\\.]{1,}\\D 匹配一个或多个字符(点除外),后跟任何其他字符(数字除外)。 \\s?[^\\(] 匹配一个可能的空格,后跟任何字符,( 除外
  • 这使我的整个字符串只是句点。在使用 \\. 转义句点字符之前,我遇到了这个问题。但这似乎已经准备好了......不知道是什么问题有什么建议
【解决方案3】:
String newline = System.getProperty("line.separator");
String yourLine = yourLine.append(newline);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    相关资源
    最近更新 更多