我知道我可以使用DocumentPreprocessor
将文本拆分成句子。但是,如果想要将标记化文本转换回原始文本,则它不能提供足够的信息。所以我必须使用PTBTokenizer
,它有invertible
选项。
但是,PTBTokenizer
只返回文档中所有标记(CoreLabel
s)的迭代器。它不会将文档拆分成句子。
可以对PTBTokenizer的输出进行后处理,将文本分成句子。
但这显然不是微不足道的。
Stanford NLP库中是否有一个类可以将CoreLabel
s的序列作为输入并输出句子?这就是我的意思:
List<List<CoreLabel>> split(List<CoreLabel> documentTokens);
答案 0 :(得分:1)
我建议您使用StanfordCoreNLP类。以下是一些示例代码:
import java.io.*;
import java.util.*;
import edu.stanford.nlp.io.*;
import edu.stanford.nlp.ling.*;
import edu.stanford.nlp.pipeline.*;
import edu.stanford.nlp.trees.*;
import edu.stanford.nlp.semgraph.*;
import edu.stanford.nlp.ling.CoreAnnotations.*;
import edu.stanford.nlp.util.*;
public class PipelineExample {
public static void main (String[] args) throws IOException {
// build pipeline
Properties props = new Properties();
props.setProperty("annotators","tokenize, ssplit, pos");
StanfordCoreNLP pipeline = new StanfordCoreNLP(props);
String text = " I am a sentence. I am another sentence.";
Annotation annotation = new Annotation(text);
pipeline.annotate(annotation);
System.out.println(annotation.get(TextAnnotation.class));
List<CoreMap> sentences = annotation.get(SentencesAnnotation.class);
for (CoreMap sentence : sentences) {
System.out.println(sentence.get(TokensAnnotation.class));
for (CoreLabel token : sentence.get(TokensAnnotation.class)) {
System.out.println(token.after() != null);
System.out.println(token.before() != null);
System.out.println(token.beginPosition());
System.out.println(token.endPosition());
}
}
}
}