Разделить текст неразрывными фразами

У меня есть список, содержащий несколько неразрывных слов, таких как

List<String> lookUp = new ArrayList<>();
lookUp.add("New York");
lookUp.add("Big Apple");

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

String sentence = "New York is also called Big Apple";

это должно вернуть меня

["New York", "is", "also", "called", "Big Apple"]

Я начал писать алгоритм, который сначала разделяет предложение по пробелам, а затем я делаю цикл: для каждого слова я проверяю, встречается ли это слово и его правый сосед в списке lookUp, и, если это правда, анализирует эти слова вместе.

1) Представьте, что мой lookUp-список также содержит неразрывные фразы с более чем двумя словами, например, "Джордж Буш" -> мой алгоритм будет искать только "Джордж У." и "W. Bush" и не найдет его в списке поиска, поэтому он разделит его на 3 слова.

2) Более важный вопрос (для которого вы можете игнорировать вопрос 1): уже есть библиотека или даже плагин GATE (чтобы мне не пришлось изобретать велосипед)? И это также существует для немецких фраз? Я не мог найти один =(

1 ответ

Решение

Еще одна реализация на Java 7 который не использует regular expressions:

    List<String> lookUp = new ArrayList<>();
    lookUp.add("New York");
    lookUp.add("New Jersey");
    lookUp.add("Big Apple");
    lookUp.add("George W. Bush");

    String sentence = "New York is also called Big Apple . New Jersey is located near to New York . George W. Bush doesn't live in New Mexico`";

    String currentPhrase = "";
    List<String> parseResult = new ArrayList<>();

    for (String word : sentence.split("\\s+")) {
        currentPhrase += (currentPhrase.isEmpty() ? "" : " ") + word;
        if (lookUp.contains(currentPhrase)) {
            parseResult.add(currentPhrase);
            currentPhrase = "";
            continue;
        }
        boolean phraseFound = false;
        for (String look : lookUp)
            if (look.startsWith(currentPhrase)) {
                phraseFound = true;
                break;
            }

        if (!phraseFound) {
            parseResult.addAll(Arrays.asList(currentPhrase.split("\\s+")));
            currentPhrase = "";
        } 
    }

    System.out.println(parseResult);

Выход:

[New York, is, also, called, Big Apple, ., New Jersey, is, located, near, to, New York, ., George W. Bush, doesn't, live, in, New, Mexico]
Другие вопросы по тегам