考虑这段文字如何将段落拆分成句号(。)分隔的句子,除非句号是缩写的一部分?
保护组织称20年禁令是美国偶像的重要保护。采矿业和一些共和党议员表示,这对亚利桑那州的经济和国家的能源独立是不利的。“尽管采矿业面临巨大压力,但总统和秘书萨拉扎并没有退缩,”美国公共土地总监简·达诺维茨说。为皮尤环境集团。
在上面的例子中,它很容易在句点(。)中分割句子,但它在美国处理句号时会导致错误的结果。假设我有一个缩写列表,如
String abbrev[] ={"u.s.a", "u.a.e", "u.k", "p.r.c","u.s.s.r", };
String regex= "\\.";
Pattern pattern = Pattern.compile(regex,Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(sx);
int beginIndex=0;
// Check all occurance
int index=0;
while (matcher.find()) {
System.out.print("Start index: " + matcher.start());
System.out.print(" End index: " + matcher.end() + " ");
String group=matcher.group();
System.out.println("group: " + group);
int dotIndex= group.indexOf(".");
String sub= sx.substring(beginIndex, matcher.start()+dotIndex);
beginIndex= matcher.start()+dotIndex;
System.out.println(sub);
}
我可以做一个蛮力匹配周围dotIndex所有的缩写。有更好的方法吗?
你能利用正规句子后面的空间,还是有其他边界条件? – 2012-01-09 20:12:33
@JoshG:我想过,但其他情况如何呢?这个例子有'eg'和一个空格。您需要根据之前的内容来验证(或否定),比如'(?<!\。[az])\。\ s'(需要一个句点和一个空格,前面没有句号和一个字母) – 2012-01-09 20:14:44
你打算如何区分句子中间的缩写与句尾的缩写?例如,“我住在美国” – 2012-01-09 20:45:31