Простой синтаксический анализатор предложений Java - PullRequest
3 голосов
/ 20 января 2010

Есть ли простой способ создания парсера предложений в простой Java без добавления каких-либо библиотек и банок.

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

После анализа в БД или файле могут храниться только реальные слова, а не специальные символы.

спасибо большое всем заранее :) 1007 *

Ответы [ 5 ]

8 голосов
/ 20 января 2010

Возможно, вы захотите начать с изучения класса BreakIterator .

Из JavaDoc.

Класс BreakIterator реализует методы для определения местоположения границы в тексте. Экземпляры BreakIterator поддерживает текущий позиционировать и сканировать возвращаемый текст индекс символов где границы случаются. Внутренне BreakIterator сканирует текст, используя CharacterIterator, и, таким образом, может сканировать текст, удерживаемый любым объектом реализуя этот протокол. StringCharacterIterator используется для проверять объекты String, переданные в setText.

Вы используете предоставленные заводские методы этим классом для создания экземпляров различные типы итераторов разрыва. В в частности, используйте getWordIterator, getLineIterator, getSentenceIterator, и getCharacterIterator для создания BreakIterators, которые выполняют слово, строка, предложение и граница символа анализ соответственно. Один BreakIterator может работать только на одном единица (слово, строка, предложение и т. д. на). Вы должны использовать другой итератор для каждой единицы анализа границ вы хочу выполнить.

Линейный анализ границ определяет где текстовая строка может быть разбита, когда линия Упаковочное. Механизм правильно обрабатывает пунктуацию и переносы слова.

Анализ границ предложений позволяет выбор с правильной интерпретацией периодов в пределах чисел и сокращения и трейлинг знаки препинания, такие как кавычки знаки и скобки.

Анализ границы слова используется функции поиска и замены, а также как в приложениях для редактирования текста которые позволяют пользователю выбирать слова с двойным кликом. Выбор слова обеспечивает правильное толкование знаки препинания внутри и после слова. Персонажи, которые не являются частью слово, такое как символы или знаки препинания пометки, есть разрывы слов с обеих сторон.

Анализ границ символов позволяет пользователи взаимодействуют с персонажами как они ожидают, например, когда перемещая курсор по тексту строка. Анализ границ персонажа обеспечивает правильную навигацию по строки символов, независимо от того, как персонаж сохраняется. Например, акцентированный символ может быть сохранен как базовый характер и диакритический отметка. Что пользователи считают символ может отличаться между языки.

BreakIterator предназначен для использования с только естественные языки. Не использовать этот класс для токенизации программирования язык.

См. Демонстрацию : BreakIteratorDemo.java

4 голосов
/ 29 августа 2013

Основываясь на ответе @ Джаррода Роберсона , я создал метод util, который использует BreakIterator и возвращает список предложений.

public static List<String> tokenize(String text, String language, String country){
    List<String> sentences = new ArrayList<String>();
    Locale currentLocale = new Locale(language, country);
    BreakIterator sentenceIterator = BreakIterator.getSentenceInstance(currentLocale);      
    sentenceIterator.setText(text);
    int boundary = sentenceIterator.first();
    int lastBoundary = 0;
    while (boundary != BreakIterator.DONE) {
        boundary = sentenceIterator.next();         
        if(boundary != BreakIterator.DONE){
            sentences.add(text.substring(lastBoundary, boundary));
        }
        lastBoundary = boundary;            
    }
    return sentences;
}
1 голос
/ 20 января 2010

Просто используйте регулярное выражение (\s+ - оно будет применяться к одному или нескольким пробелам (пробелам, табуляциям и т. Д.)), Чтобы разбить строку на массив.

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

И перед сохранением любого слова используйте еще раз регулярное выражение для удаления всех не алфавитно-цифровых символов.

0 голосов
/ 20 января 2010

Конечно, используйте StringTokenizer

import java.util.StringTokenizer;

public class Token {
    public static void main(String[] args) {

        String sentence = "Java! simple ?sentence parser.";
        String separator = "!?.";

        StringTokenizer st = new StringTokenizer( sentence, separator, true );

        while ( st.hasMoreTokens() ) {
            String token = st.nextToken();
            if ( token.length() == 1 && separator.indexOf( token.charAt( 0 ) ) >= 0 ) {
                System.out.println( "special char:" + token );
            }
            else {
                System.out.println( "word :" + token );
            }

        }
    }
}
0 голосов
/ 20 января 2010

Tokenizer

Сканер

Ex.

StringTokenizer tokenizer = new StringTokenizer(input, " !?.");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...