2016-09-14 11 views
0

Ich schreibe Code, der mir richtige Substantive in einem Satz in Großbuchstaben gibt. Ich verwende einen NER-Tagger, um Tags wie PERSON und LOCATION zu erhalten. Ich möchte, dass mein Code den Text zwischen den Tags in Großbuchstaben ausgibt. Ich mache es auf die folgende Weise, aber es funktioniert nicht:Suchen Sie Text zwischen zwei Tags und ersetzen Sie es durch die Großbuchstabe desselben Textes

Hier ist sb ein String-Puffer. Sie ein Beispiel geben:

James Murray nach Los Angeles ging

als

<PERSON>James murray</PERSON> went to <LOCATION>Los angeles</LOCATION> 

analysiert wird, und ich möchte, dass meine ausgegeben werden -

James Murray ging nach Los Angeles

.

Antwort

0

Sie geben es das ganze Muster, versuchen Sie es geben Sie eine m1.group(1) (die James Murray ist) und m1.group(2) (die Los Angeles ist). Oder Sie können eine andere Regex machen und alle Tags aus Ihrem Endergebnis entfernen (PERSON und LOCATION - das sind Tags, stapeln sie auch).

+0

Aber ich bin nicht sicher, wie viele Tags ein Satz wird so haben, wie kann ich das erklären? – serendipity

0

Aus Gründen der Zukunftssicherheit habe ich in Erwägung gezogen, dass Sie in der Zukunft möglicherweise Tags verwenden, die sich nur von <PERSON> und unterscheiden. Sie können die folgenden Aktionen Wörter zwischen den Tags zu erfassen, die von der Form sind <tag></tag>:

public static void main(String[] args){ 

    String in = "<PERSON>James murray</PERSON> went to <LOCATION>Los angeles</LOCATION>"; 

    Matcher m1 = Pattern.compile(">(.*?)<").matcher(in); 

    while (m1.find()) { 
     for (int i = 1; i <= m1.groupCount(); i++) { 
      System.out.println("matched text: "+ m1.group(i)); 
     } 
    } 
} 

Ausgang:

matched text: James murray 
matched text: went to 
matched text: Los angeles 

Sie diese verwenden können, zu tun, was Sie mit den aufgenommenen Worte wollen.

Eine andere Lösung ist es, eine nicht-einfangende Gruppe zu verwenden, so etwas wie dieses (nicht getestet) zu tun:

Matcher m1 = Pattern.compile("(?:<PERSON>|<\\/PERSON>|<LOCATION>|<\\/LOCATION>)?([\\w ]+)").matcher(in); 

Dies wird speziell die Tags finden und die Gruppen zwischen ihnen zu erfassen. Aber ich würde den ersten Weg empfehlen.

+0

Vielen Dank. Das ist sehr nützlich! Ich benutze die letztere Methode, aber was ich wirklich tun möchte, ist sicherzustellen, dass Murray und Angeles groß geschrieben und an den Satz angehängt werden. Ich muss über 1000 Sätze von Sätzen iterieren, die möglicherweise dekomprimierte Eigennamen haben. – serendipity

+0

@Serendipity werden Sie höchstwahrscheinlich die Wörter durchlaufen müssen, um die Groß-/Kleinschreibung zu prüfen, es sei denn, Sie können einen Weg finden, dies in Regex zu tun. – px06

0

Versuchen Sie es mit jsoup und apache.commons.lang WordUtils

Beispiel:

import org.apache.commons.lang3.text.WordUtils; 
import org.jsoup.Jsoup; 
import org.jsoup.nodes.Document; 
import org.jsoup.nodes.Element; 
import org.jsoup.select.Elements; 

public class ExtractInfo { 

    public static void main (String [] args) { 
     String html = "<PERSON>James murray</PERSON> went to <LOCATION>Los angeles</LOCATION>"; 
     Document doc = Jsoup.parse(html); 
     Elements es = doc.select("person,location"); 
     for(Element e : es){ 
      String eText = e.text(); 
      e.text(replace(eText)); 
     } 
     System.out.println(doc.text()); 
    } 
    public static String replace(String str){ 
     return WordUtils.capitalize(str); 
    } 
} 

// prints "James Murray nach Los Angeles ging"

Verwandte Themen