我编写了这片代码,该代码将字符串拆分并将其存储在字符串数组中: -

String[] sSentence = sResult.split("[a-z]\\.\\s+");

但是,我添加了[AZ],因为我想处理一些缩写问题。但是随后我的结果出现了: -

此外,埃弗里特(Everett

我看到我失去了拆分函数中指定的模式。我可以失去这个时期,但是失去了这个词的最后一句话扰乱其含义。

有人可以帮助我,此外,还可以帮助我处理缩写吗?例如,由于我基于周期拆分字符串,所以我不想丢失缩写。

有帮助吗?

解决方案

即使对于像英语这样的拉丁语言,解析句子远非琐碎的任务。像您在问题中概述的一种天真方法一样,经常会失败,以至于在实践中将被证明是无用的。

更好的方法是使用 断路器 配置为正确的语言环境。

BreakIterator iterator = BreakIterator.getSentenceInstance(Locale.US);
String source = "This is a test. This is a T.L.A. test. Now with a Dr. in it.";
iterator.setText(source);
int start = iterator.first();
for (int end = iterator.next();
    end != BreakIterator.DONE;
    start = end, end = iterator.next()) {
  System.out.println(source.substring(start,end));
}

产生以下结果:

  1. 这是一个测试。
  2. 这是TLA测试。
  3. 现在有一位博士。

其他提示

在所有情况下,都很难获得正则表达式工作,但是要解决您的直接问题,您可以使用LOWBEHIND:

String sResult = "This is a test. This is a T.L.A. test.";
String[] sSentence = sResult.split("(?<=[a-z])\\.\\s+");

结果:

This is a test
This is a T.L.A. test.

请注意,有些缩写不会以大写字母的结尾,例如Abbrev。,Mr.等...而且还有一些句子在时期内没有结束!

如果可以的话,请使用自然语言处理工具,例如 lingpipe. 。使用正则表达式,例如(例如例如 :-)), 先生。, 缩写, 省略 (...), 等等.

有一个很容易遵循的教程 句子检测 在Lingpipe网站上。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top