Как разделить абзац на предложения, разделенные точкой (.), Кроме случаев, когда точка является частью сокращения? - PullRequest
3 голосов
/ 10 января 2012

Считайте этот текст параграфом

Группы по сохранению называют 20-летний запрет важнейшей защитой американской иконы.Горнодобывающая промышленность и некоторые республиканские члены Конгресса говорят, что это наносит ущерб экономике Аризоны и энергетической независимости страны. «Несмотря на значительное давление со стороны горнодобывающей промышленности, президент и секретарь Салазар не отступили», - сказала Джейн Дановитц, директор государственных земель США.для Pew Environment Group.

В приведенном выше предложении легко разбить предложения по периоду (.), но это приведет к неверным результатам при обработке периода в США.Предположим, у меня есть список сокращений, таких как

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.Есть ли лучший подход?

Ответы [ 2 ]

2 голосов
/ 10 января 2012

Моим лучшим предположением было бы что-то вроде: (?<!\.[a-zA-Z])\.(?![a-zA-Z]\.), что означало бы:

(?<!\.[a-zA-Z])    # can't be preceded by a period followed by a single letter
\.
(?![a-zA-Z]\.)     # nor can it be followed by a letter and another preiod

Тогда вы можете выполнить замену оттуда.

Демо

Это потребовало бы гораздо больше усилий, если бы вам нужно было поймать период в кавычках, который не учитывается в приведенном выше паттерне.

1 голос
/ 10 января 2012

Эта проблема не может быть решена с помощью регулярных выражений. Узнать, заканчивается ли предложение в любой данный период, непросто. Сокращения могут быть или не быть концом предложения. Эллипсы могут быть записаны как три периода (или, в некоторых случаях, четыре, в зависимости от преобладающего стиля). Приговоры иногда заканчиваются после закрывающей кавычки, которая следует после периода, отмечающего конец предложения (опять же в зависимости от преобладающего стиля).

Вы можете использовать эвристику, чтобы получить правильный ответ большую часть времени. Но это скорее статистическая проблема, чем проблема регулярных выражений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...