2017-02-01 8 views
1

Gegeben eine Zeichenfolge, die einen Satz wie diesen darstellt, gefolgt von der Markierung der Zeichenfolge mit OpenNLP.Regulärer Ausdruck auf markierten Wörtern

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

ich dieses unten. Meine Frage ist, wie kann ich einen regulären Ausdruck darauf anwenden, um Tags herauszufiltern? Was mich abschreckt, ist das Wort, das jedem Bindestrich vorangestellt wird. Wenn es nur Tags wären, könnte ich etwas wie (VBP|VBN)+ zum Beispiel machen, die Wörter vorne würden variieren.

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

Zum Beispiel, wie würde ich schreiben einen regulären Ausdruck alle NN und CC zu halten? Also gegeben die markierte Zeichenfolge wie oben gezeigt, wie bekomme ich plays_NNS and_CC?

+0

Bitte erläutern Sie das Problem anhand eines Beispiels. – EngineeredBrain

+0

@AnwarShaikh Hoffnung, die hilft. –

+0

Ja. Danke, hoffe mein Post unten beantwortet Ihre Frage. – EngineeredBrain

Antwort

1

Ich glaube, Sie reguläre Ausdrücke und extrahieren Sie die gewünschten Teil verwenden können, die Ihr Muster übereinstimmt und verketten resultierende Zeichenfolge erforderlich zu erhalten.

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

Schöne Lösung, was macht dieser Teil, '[^ \\ s] + _' übereinstimmen? Bezieht sich dies grundsätzlich auf einen regulären Ausdruck '(NN | CC)' oder was immer es für den Text sein könnte, wo jedes "Wort" im Text durch die Zeichen nach dem '_' dargestellt wird? Hoffentlich ist das klar genug um es zu verstehen. –

+0

Danke. Es entspricht jedem Zeichen außer Leerraum. Wenn Sie es als eine Lösung für Ihre Frage finden, dann akzeptieren Sie es bitte als Antwort und Upvote. – EngineeredBrain

+0

Ist es möglich, eine Regex zu schreiben, die einem NNP gefolgt von NNS entspricht? –

0

Nicht-Regex-Lösung mit einer Filtermethode.

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 
} 

Drucke auf der Konsole:

plays_NNS                                       
and_CC 
+0

Wenn Sie found zurückgeben, wird eine Speicheradresse zurückgegeben. Auch wenn Sie bei Index 0 gefunden haben, erhalten Sie nur ein einziges Tag. Es ist nicht korrekt, aber ich mag diesen Ansatz sehr. –

+0

Es wird nicht am Index 0 gefunden. Ich habe 'new String [0]' als Parameter von 'results.toArray()' eingefügt, weil '.toArray()' standardmäßig ein Array vom Typ 'Object' zurückgibt und wenn Sie einschließen 'new String [0]' es gibt eine 'String []' –

+0

zurück Ich weiß, dass es nicht zurückgegeben wird, um den Index 0 gefunden, ich habe es darauf um den Inhalt davon zu überprüfen. Es scheint jedoch kein Array zurückzugeben, das diese beiden Strings "plays_NNS", "and_CC" 'enthält. –