【问题标题】:Find text between two tags and replace it with the uppercase version of the same text在两个标签之间查找文本并将其替换为相同文本的大写版本
【发布时间】:2016-09-14 10:49:22
【问题描述】:

我正在编写代码,在大写的句子中为我提供专有名词。我正在使用 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>

我希望我的输出是 -

詹姆斯·默里去了洛杉矶

【问题讨论】:

    标签: java regex stanford-nlp


    【解决方案1】:

    你正在给它整个模式,试着给它一个m1.group(1)(这是詹姆斯默里)和m1.group(2)(这是洛杉矶)。或者您可以执行另一个正则表达式并从最终结果中删除所有标签(PERSON 和 LOCATION - 这些是标签,堆栈也会删除它们)。

    【讨论】:

    • 但我不确定一个句子会有多少个标签,我该如何解释呢?
    【解决方案2】:

    为了将来的验证,我考虑过您将来可能会使用与&lt;PERSON&gt;&lt;LOCATION&gt; 不同的标签。您可以执行以下操作以捕获格式为 &lt;tag&gt;&lt;/tag&gt; 的标签之间的单词:

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

    这将专门找到标签并捕获它们之间的组。但我会推荐第一种方式。

    【讨论】:

    • 非常感谢。这非常有用!我正在使用后一种方法,但我真正想做的是确保将 Murray 和 Angel 大写并附加到句子中。我必须迭代可能有 1000 多个可能有专有名词大写的句子。
    • @serendipity 您很可能必须遍历单词以检查它们的大小写,除非您可以在正则表达式中找到一种方法。
    【解决方案3】:

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

    //打印“James Murray 去了洛杉矶”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      • 2021-08-14
      • 2011-07-31
      • 1970-01-01
      • 2021-07-21
      相关资源
      最近更新 更多