Регулярное выражение, чтобы найти конец предложения - PullRequest
5 голосов
/ 10 марта 2011

Я делаю регулярное выражение, чтобы найти конец предложений в тексте.Здесь я предполагаю, что любое предложение может заканчиваться либо.!?Иногда, хотя люди как два пишут !!!!!!на и их предложения.Поэтому я хочу заменить любые повторяющиеся точки, восклицательные знаки или вопросительные знаки.Но я хочу разрешить использование «...».Как я могу включить это исключение?Пожалуйста, сообщите, спасибо!

Pattern p = null;
    try {
    //([!?.] with optional spaces), followed by ([!?.] with optional spaces) repeated 1 or more times
        p = Pattern.compile("([!?.]\\s*)([!?.]\\s*)+");
    }
    catch (PatternSyntaxException pex) {
        pex.printStackTrace();
        System.exit(0);
    }

    //get the matcher
    Matcher m = p.matcher(this.sentence);
    int index = 0;
    while(m.find(index))
    {
        System.out.println(this.sentence);
        System.out.println(p.toString());
        String toReplace = sentence.substring(m.start(), m.end());
        toReplace = toReplace.replaceAll("\\.","\\\\.");
        toReplace =toReplace.replaceAll("\\?","\\\\?");
        String replacement = ""+sentence.charAt(m.start());
        this.sentence = this.sentence.replaceAll(toReplace, replacement);
        System.out.println("");
        index = m.end();
        System.out.println(this.sentence);
    }

Ответы [ 4 ]

2 голосов
/ 10 марта 2011

Отказ от ответственности: мой ответ будет не по теме (без регулярных выражений).

Если он не слишком тяжелый, попробуйте использовать Apache OpenNLP . НЛП означает «обработка естественного языка». Проверьте документацию по определения предложений .

Соответствующий бит кода:

String sentences[] = sentenceDetector.sentDetect("  First sentence. Second sentence. ");

Вы получите массив из двух Strings. Первым будет «Первое предложение», вторым будет «Второе предложение».

Перед использованием вышеупомянутой строки кода нужно написать больше кода, но вы поймете общую идею.

0 голосов
/ 27 января 2014

Я работаю над чем-то вроде этого. До сих пор похоже, что я могу разбить свои абзацы (сгруппированные на основе пустых строк между текстом) на предложения путем поиска символов [.?!], За которыми следует а) один или два пробела, а затем слово (не одна буква) с начальными буквами или б) ничего, так как это конец абзаца. В моем случае у меня нет встроенного цитируемого текста, но это случай, который я бы хотел исключить, если найду его. Я обрабатываю юридические / финансовые документы, поэтому я не уверен, что «НЛП» будет полезным; язык вряд ли естественный. Но я могу взглянуть. Создание подходящего RegEx выглядит сложным, поэтому подход НЛП может сэкономить время.

0 голосов
/ 10 марта 2011

Самое простое решение регулярных выражений для случая "..." - просто использовать квантифицированное совпадение:

someString.split("(\\.{1,2})|(\\.{4,})|(\\?+)|(!+)");

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

0 голосов
/ 10 марта 2011

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

Послевместо этого замените все множественные вхождения ваших символов конца предложения одиночными.

Затем найдите конец предложений с вашими символами конца предложения + специальный символ, который вы использовали для замены "... "(если вы хотите, чтобы" ... "означало конец предложения)

Наконец, снова замените специальный символ на" ... ".

Я не программист javaпоэтому я не могу дать вам конкретный код Java, чтобы сделать это, но самый простой способ для такого типа проблем, как правило, состоит в том, чтобы несколько операторов split / join не заменял.

так что-то вроде:

str.split("...").join("<special char>")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...