首先,我正在使用OpenNLP,但是不需要有关它的知识,但可能很有用。
将字符串输入到方法 FindName 中
String input = "Billy Smith the chicken crossed the road to visit Fred Jones";
它由分词器处理,为名称查找器提供输入:
String[] tokenized = "Billy","Smith","the","chicken","crossed","the","road","to","visit","Fred","Jones";
搜索名称,结果以两个字符串的形式给出,在"for"循环中生成
"[0..2) person","[9..11) person"
现在如何将原始名称("比利·史密斯"和"弗雷德·琼斯")放入数组列表或类似的字符串数组中?
到目前为止,我已经尝试过:
for(Span s: nameSpans){
numbers = s.toString().replace("[", "");
//is "[0..2) person" and "[9..11) person"
sect = numbers.split("\) ");
}
int x;
for(x=0;x<sect.length;x++){
if(x%2 == 0){
String[] numb = sect[x].split("..");
int n;
int first, second;
first = Integer.parseInt(numb[0]);
second = Integer.parseInt(numb[1]);
for(n=first;n<second;n++){
if(sentence.hashCode() == n){
name.add(sentence[n]);
}
但没有运气。
Span 对象有一个内置的静态方法,可以执行您想要的操作。看到这个答案。OpenNLP 名称实体识别器输出
可以通过将
输出字符串解析为整数,然后使用原始输入字符串创建一个字符串数组来创建单词来完成,然后我可以使用正确的数字调用这些单词,从而给出全名和介于两者之间的任何中间名。
工作代码:
for(Span s: nameSpans){
String a = s.toString().replace("[", "").replace(")", "");
String[] b = a.split("\s");
String[] c = b[0].split("\..");
int first = Integer.parseInt(c[0]);
int second = Integer.parseInt(c[1]);
String[] word = input.split("\s");
int n;
for(n=first;n<second;n++){
names.add(word[n]);
System.out.println(word[n]);
}
}