2016-09-14 2 views
0

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

Matcher m1 = Pattern.compile("<PERSON>(.+?)</PERSON>|<LOCATION>(.+?)</LOCATION>").matcher(NER); 
     while(m1.find()) 
     { String newDecapTitle = m1.appendReplacement(sb, decapTitle.get(m1.group().toUppercase())); 
........ 
} 

Здесь sb представляет собой строковый буфер. Чтобы дать вам пример:

Джеймс Мюррей отправился в Лос-Анджелес

получает разобрано как

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

, и я хочу, чтобы мой выход будет -

Джеймс Мюррей отправился в Лос-Анджелес

.

ответ

0

Вы даете ему весь узор, попробуйте дать ему m1.group(1) (это Джеймс Муррай) и m1.group(2) (это Лос-Анджелес). Или вы можете сделать еще одно регулярное выражение и вырезать все теги из вашего конечного результата (PERSON и LOCATION - теги, стеки их тоже).

+0

Но я не знаю, как много тегов предложение будет так, как я могу это объяснить? – serendipity

0

Для будущей проверки я рассмотрел, что вы можете использовать теги в будущем, которые могут отличаться от <PERSON> и <LOCATION>. Вы можете сделать следующее, чтобы захватить слова между тегами, которые имеют форму <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)); 
     } 
    } 
} 

Выход:

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

Вы можете использовать это, чтобы делать все, что вы хотите с захваченными словами.

Другим решением является использование без захвата группы, чтобы сделать что-то вроде этого (непроверенные):

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

Найдет специфически теги и захватить группы между ними. Но я бы порекомендовал первый способ сделать это.

+0

Большое спасибо. Это очень полезно! Я использую последний метод, но то, что я действительно хочу сделать, это убедиться, что Мюррей и Анджелесе капитализированы и добавлены к предложению. Я должен перебирать более 1000 предложений, которые могут иметь надлежащие nounns, декапитализированные. – serendipity

+0

@serendipity вам, скорее всего, придется перебирать слова, чтобы проверить их, если вы не можете найти способ сделать это в регулярном выражении. – px06

0

Попробуйте с jsoup и apache.commons.lang WordUtils

Пример:

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); 
    } 
} 

// печатает "Джеймс Мюррей отправился в Лос-Анджелес"