给定一段字符串,如 [0..2) 如何找到等效的字符串?
Given a span of string like [0..2) how to find string equivalent?
我在 java.I 中使用 apache open nlp 工具包希望在给定文本中仅显示名称实体,如地理图形、人物等。以下代码片段给出了字符串跨度
try {
System.out.println("Input : Pierre Vinken is 61 years old");
InputStream modelIn = new FileInputStream("en-ner-person.bin");
TokenNameFinderModel model = new TokenNameFinderModel(modelIn);
NameFinderME nameFinder = new NameFinderME(model);
String[] sentence = new String[]{
"Pierre",
"Vinken",
"is",
"61",
"years",
"old",
"."
};
Span nameSpans[] = nameFinder.find(sentence);
for(Span s: nameSpans)
System.out.println("Name Entity : "+s.toString());
}
catch (IOException e) {
e.printStackTrace();
}
输出:
输入:Pierre Vinken 61 岁
名称实体:[0..2) 人
我怎样才能得到等效的字符串而不是跨度,有没有 api 的?
Span
has the method getCoveredText(CharSequence text)
将执行此操作。但是我不明白为什么你需要一个 API 方法来获取对应于跨度的文本。跨度明确提供开始(包括)和结束(不包括)整数偏移量。所以以下就足够了:
StringBuilder builder = new StringBuilder();
for (int i = s.getStart(); i < s.getEnd(); i++) {
builder.append(sentences[i]).append(" ");
}
String name = builder.toString();
您可以使用 Span
class 本身。
以下 class 方法 return 对应于来自另一个 CharSequence
text
的 Span
实例的 CharSequence
:
/**
* Retrieves the string covered by the current span of the specified text.
*
* @param text
*
* @return the substring covered by the current span
*/
public CharSequence getCoveredText(CharSequence text) { ... }
请注意,此 class 也有两个静态方法,它们分别接受 Span
数组和 CharSequence
或标记数组 (String[]
) 到 return 等价于 String
.
的数组
/**
* Converts an array of {@link Span}s to an array of {@link String}s.
*
* @param spans
* @param s
* @return the strings
*/
public static String[] spansToStrings(Span[] spans, CharSequence s) {
String[] tokens = new String[spans.length];
for (int si = 0, sl = spans.length; si < sl; si++) {
tokens[si] = spans[si].getCoveredText(s).toString();
}
return tokens;
}
public static String[] spansToStrings(Span[] spans, String[] tokens) { ... }
希望对您有所帮助...
我在 java.I 中使用 apache open nlp 工具包希望在给定文本中仅显示名称实体,如地理图形、人物等。以下代码片段给出了字符串跨度
try {
System.out.println("Input : Pierre Vinken is 61 years old");
InputStream modelIn = new FileInputStream("en-ner-person.bin");
TokenNameFinderModel model = new TokenNameFinderModel(modelIn);
NameFinderME nameFinder = new NameFinderME(model);
String[] sentence = new String[]{
"Pierre",
"Vinken",
"is",
"61",
"years",
"old",
"."
};
Span nameSpans[] = nameFinder.find(sentence);
for(Span s: nameSpans)
System.out.println("Name Entity : "+s.toString());
}
catch (IOException e) {
e.printStackTrace();
}
输出:
输入:Pierre Vinken 61 岁 名称实体:[0..2) 人
我怎样才能得到等效的字符串而不是跨度,有没有 api 的?
Span
has the method getCoveredText(CharSequence text)
将执行此操作。但是我不明白为什么你需要一个 API 方法来获取对应于跨度的文本。跨度明确提供开始(包括)和结束(不包括)整数偏移量。所以以下就足够了:
StringBuilder builder = new StringBuilder();
for (int i = s.getStart(); i < s.getEnd(); i++) {
builder.append(sentences[i]).append(" ");
}
String name = builder.toString();
您可以使用 Span
class 本身。
以下 class 方法 return 对应于来自另一个 CharSequence
text
的 Span
实例的 CharSequence
:
/**
* Retrieves the string covered by the current span of the specified text.
*
* @param text
*
* @return the substring covered by the current span
*/
public CharSequence getCoveredText(CharSequence text) { ... }
请注意,此 class 也有两个静态方法,它们分别接受 Span
数组和 CharSequence
或标记数组 (String[]
) 到 return 等价于 String
.
/**
* Converts an array of {@link Span}s to an array of {@link String}s.
*
* @param spans
* @param s
* @return the strings
*/
public static String[] spansToStrings(Span[] spans, CharSequence s) {
String[] tokens = new String[spans.length];
for (int si = 0, sl = spans.length; si < sl; si++) {
tokens[si] = spans[si].getCoveredText(s).toString();
}
return tokens;
}
public static String[] spansToStrings(Span[] spans, String[] tokens) { ... }
希望对您有所帮助...