2017-02-01 15 views
1

Приведенная строка, представляющая такое предложение, за которым следует пометка строки с использованием OpenNLP.Регулярное выражение по помеченным словам

String sentence = "His plays remain highly popular, and are constantly studied.";

Я получаю это ниже. Мой вопрос: как я могу применить регулярное выражение к нему, чтобы отфильтровать теги? То, что меня выбрасывает, - это слово, добавленное к каждому дефису. Если бы это были только теги, я мог бы сделать что-то вроде (VBP|VBN)+, например, слова впереди менялись бы.

His_PRP$ plays_NNS remain_VBP highly_RB popular,_JJ and_CC are_VBP constantly_RB studied._VBN

Например, как бы я написать регулярное выражение, чтобы сохранить все NN и CC? Итак, с учетом помеченной строки, как показано выше, как я могу получить plays_NNS and_CC?

+0

Просьба подробно рассказать о проблеме с помощью одного примера. – EngineeredBrain

+0

@AnwarShaikh Надежда, которая помогает. –

+0

Да. Спасибо, надеюсь, что мой пост ниже отвечает на ваш вопрос. – EngineeredBrain

ответ

1

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

String text = "His_PRP$ plays_NNS remain_VBP highly_RB popular,_JJ and_CC are_VBP constantly_RB studied._VBN"; 
String pattern = "([^\\s]+_(NNS|CC))"; 
String resultText = ""; 

    // Create a Pattern object 
    Pattern r = Pattern.compile(pattern); 

    // Now create matcher object. 
    Matcher m = r.matcher(text); 
    while (m.find()) 
    { 
     resultText = resultText + m.group(0) + " "; 
    } 

    System.out.println("RESULT: " + resultText); 

    /* 
    #### OUTPUT ##### 
    RESULT: plays_NNS and_CC 
    */ 
+0

Хорошее решение, что делает эта часть, '[^ \\ s] + _' совпадением? Использует ли это в основном регулярное выражение '(NN | CC)' или что бы это ни было в тексте, где каждое «слово» в тексте представлено символами после '_'? Надеюсь, это достаточно ясно, чтобы понять. –

+0

Спасибо. Он соответствует любому символу, кроме пробела. Если вы считаете это решением своего вопроса, то, пожалуйста, примите его в качестве ответа и ответа. – EngineeredBrain

+0

Можно ли написать регулярное выражение для соответствия NNP, за которым следует NNS? –

0
[^\s]+_(NNS|CC) 

Это регулярное выражение поможет вам извлечь только теги NNS и CC. Вы можете поиграть с регулярным выражением здесь: https://regex101.com/r/x1VxL0/1

0

Решение без регулярного выражения с использованием метода фильтрации.

public static void main(String []args){ 

    String inputText = "His_PRP$ plays_NNS remain_VBP highly_RB popular,_JJ and_CC are_VBP constantly_RB studied._VBN"; 

    String[] tags = {"_NN", "_CC"}; 
    String[] found = filter(inputText, tags); 

    for(int i = 0; i < found.length; i++){ 
    System.out.println(found[i]); 
    } 
} 

private static String[] filter(String text, String[] tags){ 

    String[] words = text.split(" "); // Split words by spaces 
    ArrayList<String> results = new ArrayList<String>(); 

    // Save all words that match any of the provided tags 
    for(String word : words){ 
    for(String tag : tags){ 
     if(word.contains(tag)){ 
     results.add(word); 
     break; 
     } 
    } 
    } 
    return results.toArray(new String[0]); // Return results as a string array 
} 

печать на консоль:

plays_NNS                                       
and_CC 
+0

Когда вы вернетесь, он возвращает адрес памяти. Кроме того, когда вы возвращаете найденный индекс в 0, вы получаете только один тег. Это не правильно, но мне очень нравится этот подход. –

+0

Он не возвращается в индекс 0. Я включил 'new String [0]' в качестве параметра 'results.toArray()', потому что '.toArray()' возвращает массив типа 'Object' по умолчанию, и если вы включаете 'new String [0]' он возвращает 'String []' –

+0

Я знаю, что он не возвращает найденный в индекс 0, я переключил его на это, чтобы проверить его содержимое. Кажется, он не возвращает массив, содержащий эти две строки: «play_NNS», «and_CC». –