2016-02-14 5 views
0

Есть ли способ сопоставления начало и конец предложения на Java? Самый простой случай заканчивается простой (.) Точкой. В некоторых других случаях он может заканчиваться colum (:) или ярлык, заканчивающийся colum (. :).Регулярное выражение для начала и конца предложения

Например, некоторые случайный текст новости:

скалы рухнули в Новой Зеландии во время землетрясения в городе Крайстчерч на Южном острове. Никаких серьезных повреждений или смертей не были зарегистрированы в день землетрясения в День Святого Валентина, который ударил в 13:13 по местному времени раз. На основе med. сообщают, что все в порядке.

Моя цель - получить ярлык слова + контекст его, но, если возможно, только предложение, в котором используется ярлык.

Так преуспевающим выход для меня будет, если я мог бы получить что-то вроде этого:

выбранное слово -> развалилась

контекст -> скалы рухнули в Нью Зеландии во время землетрясения в городе Крайстчерч на Южном острове.

выбранное слово -> med. KG

контексте -> Основано на med. сообщают, что все в порядке.

Благодаря

+1

Нет регулярных выражений, извините. Вам нужен более мощный инструмент. –

+0

Любые предложения или с чего начать? – user2670818

+0

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

ответ

2

Вы заметили фразу легко. Он начинается с прописной буквы и заканчивается одним из символов .:!?, за которым следует пробел и другая заглавная буква или доходит до конца всей строки.

Сравните разницу time. Based и med. report.

Таким образом, регулярное выражение захватывая все предложение должно выглядеть следующим образом:

([A-Z][a-z].*?[.:!?](?=$| [A-Z])) 

Посмотрите! Regex101

2

Что вы ищете, это набор инструментов для обработки естественного языка. для java вы можете использовать: CoreNLP и у них уже есть примерные примеры на странице их учебников. вы можете, конечно, сделать выражение регулярного выражения, которое выглядит для всех символов Inbetween набора символов (:.? ... и т.д.), и это будет выглядеть примерно так:

\.*?(?=[\.\:])\ 

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

+0

Спасибо, что указали мне на использование набора инструментов NLP – user2670818

3

Код:

import java.util.HashMap; 
import java.util.Map; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class Main { 

    public static void main(String[] args) { 
     final Map<String, String> dict = new HashMap<>(); 
     dict.put("med", "medical"); 
     final String text = 
     "Cliffs have collapsed in New Zealand during an earthquake in the " 
     + "city of Christchurch on the South Island. No serious damage or " 
     + "fatalities were reported in the Valentine's Day quake that struck " 
     + "at 13:13 local time. Based on the med. report everybody were ok."; 
     final Pattern p = Pattern.compile("[^\\.]+\\W+(\\w+)\\."); 
     final Matcher m = p.matcher(text); 
     int pos = 0; 
     while((pos < text.length()) && m.find(pos)) { 
     pos = m.end() + 1; 
     final String word = m.group(1); 
     if(dict.containsKey(word)) { 
      final String repl   = dict.get(word); 
      final String beginOfSentence = text.substring(m.start(), m.end()); 
      final String endOfSentence; 
      if(m.find(pos)) { 
       endOfSentence = text.substring(m.start() - 1, m.end()); 
      } 
      else { 
       endOfSentence = text.substring(m.start() - 1); 
      } 
      System.err.printf("Replace '%s.' in '%s%s' with '%s'\n", 
       word, beginOfSentence, endOfSentence, repl); 
      final String sentence = 
       (beginOfSentence + endOfSentence).replaceAll(word+'.', repl); 
      System.err.println(sentence); 
     } 
     } 
    } 
} 

Исполнение:

Replace 'med.' in 'Based on the med. report everybody were ok.' with 'medical' 
Based on the medical report everybody were ok. 
+0

Я думаю, вы должны подчеркнуть тот факт, что ему нужны все сокращения в тексте, который будет известен заранее, что далеко не тривиально , Также я думаю, что это не удастся, если бы текст содержал десятичные числа. – Aaron

+0

Я чувствую, что изменение всех сокращенных слов - это бессмысленность. Поэтому вы не можете применить его к тексту без ручного обновления словаря. –

Смежные вопросы