Да, полезно упомянуть, что вы работаете с немецким :)
Детектор предложений на основе регулярных выражений со списком сокращений можно найти в GATE. Он использует три файла, расположенных здесь. Регулярные выражения довольно просты:
//more than 2 new lines
(?:[\u00A0\u2007\u202F\p{javaWhitespace}&&[^\n\r]])*(\n\r|\r\n|\n|\r)(?:(?:[\u00A0\u2007\u202F\p{javaWhitespace}&&[^\n\r]])*\1)+
//between 1 and 3 full stops
\.{1,3}"?
//up to 4 ! or ? in sequence
(!|\?){1,4}"?
Код, который использует эти 3 файла, можно найти здесь.
Я бы улучшил регулярные выражения тем, что можно найти в Интернете, например этим< /а>.
Тогда я бы подумал обо всех немецких переводах слов в списке GATE. Если этого недостаточно, я бы просмотрел несколько из этих списков сокращений: 1, 2, и создать список самостоятельно.
РЕДАКТИРОВАТЬ:
Если производительность так важна, я бы не стал использовать весь GATE для разделителя предложений — потребовалось бы время и память, чтобы переключиться на их документы, создать аннотации, затем разобрать их обратно и т. д.
Я думаю, что лучший способ для вас — получить код из класса RegexSentenceSplitter (ссылка выше) и настройте его в соответствии с вашим контекстом.
Я думаю, что код слишком длинный, чтобы вставить его сюда. Вы должны увидеть метод execute(). В общем, он находит все совпадения для внутренних, внешних и блокирующих регулярных выражений, затем повторяет и использует только те внутренние и внешние, которые не пересекаются ни с одним из блокирующих.
Вот некоторые фрагменты, которые вы должны посмотреть/повторно использовать:
Как разбираются файлы
// for each line
if(patternString.length() > 0) patternString.append("|");
patternString.append("(?:" + line + ")");
//...
return Pattern.compile(patternString.toString());
В методе execute, как заполняются разделители блокировки:
Matcher nonSplitMatcher = nonSplitsPattern.matcher(docText);
//store all non split locations in a list of pairs
List<int[]> nonSplits = new LinkedList<int[]>();
while(nonSplitMatcher.find()){
nonSplits.add(new int[]{nonSplitMatcher.start(), nonSplitMatcher.end()});
}
Также проверьте метод veto, который «Проверяет, наложено ли вето на возможное совпадение нерасщепленным совпадением. На возможное совпадение наложено вето, если оно не пересекается с областью вето».
Надеюсь это поможет.
person
Yasen
schedule
10.04.2014