Разделить текст неразрывными фразами
У меня есть список, содержащий несколько неразрывных слов, таких как
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]