在两个标签之间查找文本,并将其替换为相同文本的大写版本

时间:2016-09-14 10:49:22

标签: java regex stanford-nlp

我正在编写代码,用大写的句子给出了正确的名词。我正在使用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>

我希望我的输出是 -

  

James Murray去了洛杉矶

3 个答案:

答案 0 :(得分:0)

你正在给它整个模式,尝试给它一个m1.group(1)(詹姆斯默里)和m1.group(2)(这是洛杉矶)。或者你可以做另一个正则表达式并从你的最终结果中剥离所有标签(PERSON和LOCATION - 那些是标签,堆叠它们也是如此)。

答案 1 :(得分: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);

这将特别找到标签并捕获它们之间的组。但我会建议第一种方法。

答案 2 :(得分: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);
   }
}

//打印&#34; James Murray去了洛杉矶&#34;