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