如何将PTBTokenizer的结果拆分成句子?

时间:2015-11-13 01:26:19

标签: stanford-nlp

我知道我可以使用DocumentPreprocessor将文本拆分成句子。但是,如果想要将标记化文本转换回原始文本,则它不能提供足够的信息。所以我必须使用PTBTokenizer,它有invertible选项。

但是,PTBTokenizer只返回文档中所有标记(CoreLabel s)的迭代器。它不会将文档拆分成句子。

The documentation说:

  

可以对PTBTokenizer的输出进行后处理,将文本分成句子。

但这显然不是微不足道的。

Stanford NLP库中是否有一个类可以将CoreLabel s的序列作为输入并输出句子?这就是我的意思:

List<List<CoreLabel>> split(List<CoreLabel> documentTokens);

1 个答案:

答案 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());
            }
        }
    }

}