2014-09-24 1 views
2

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

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-список содержит содержательные фразы с более чем двумя словами, такими как «George W. Bush» -> мой алгоритм будет искать только «George W.» и «У. Буш» и не найдет его в списке поиска, поэтому он разделил бы его на 3 слова.

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

+0

Это настолько тривиальный вопрос, поэтому я считаю: там не является какой-либо специальной библиотекой для этого. – Andremoniy

+1

Что делать, если вы получаете «abc» и имеете «ab» и «bc» в вашем поиске? – aioobe

+0

Альтернативный подход: 1) Разделить на записи 'lookUp', 2) Итерации, для каждого видят, это смотровое слово, 3) Если да, продолжайте, 4) Если нет, разделите o n пробелов. – jensgram

ответ

0

Другой реализацию на 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] 
+0

Работает! А теперь представьте, у вас есть «George W.» _and_ «George W. Bush» в вашем списке lookup: его следует разобрать «Джорджу У. Бушу» (не: «Джордж W», «Буш») .... но это выходит далеко за рамки моего вопроса: D – Munchkin

+0

I немного поиграл с ним. Когда мой список поиска содержит много элементов, он терпит неудачу. Чтобы быть конкретным: если вы добавите еще 100 фраз для поиска, тогда он разделит предложение на слово (да, предложение содержит фразы из поиска!) Я смущен об этом =/ – Munchkin

+1

Забудьте о моем последнем комментарии, это было моя ошибка: P – Munchkin