2012-01-09 2 views
3

Рассмотрим этого текст пунктКак разделить абзац на предложения, разделенные точкой (.), За исключением случаев, когда период является частью аббревиатуры?

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

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

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

+0

Можете ли вы просто воспользоваться пространством после обычного предложения или существуют другие граничные условия? –

+0

@JoshG: Я думал об этом, но как насчет других случаев, например. этот пример с «например» и пробелом. Вам нужно будет проверить (или отрицать) в зависимости от того, что перед ним, например '(?

+1

Как вы планируете выделить аббревиатуру в середине предложения по сравнению с одним в конце предложения? Например, «Я живу в США». –

ответ

2

Мое предположение было бы что-то вроде: (?<!\.[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 

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

Demo

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

+0

как насчет аббревиатуры от – insipid

+0

@insipid: вы можете либо изменить квантификатор, чтобы принять '{1,2}' (исходя из того, что предложение обычно не заканчивается двухбуквенными словами), либо записывать слово до каждый экземпляр и протестируйте его против списка исключений (включая аббревиатуры типа 'vs'), прежде чем приступать к его анализу. –

+0

@Brad: А как насчет дюйма (как в дюймах)? Это может быть одно. Достаточно добавить его в белый список. – cHao

1

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

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

Смежные вопросы