段落使用Stanford CoreNLP

时间:2013-11-16 06:55:22

标签: java nlp stanford-nlp

有没有办法从Stanford CoreNLP中提取段落信息?我目前正在使用它从文档中提取句子,但我也有兴趣确定文档的段落结构,我理想情况下CoreNLP会为我做。我在源文档中将段落作为双换行符。我查看了CoreNLP的javadoc,似乎有一个ParagraphAnnotation类,但文档似乎没有指定它包含的内容,我看不到任何关于如何使用它的例子。有人能指出我正确的方向吗?

作为参考,我目前的代码是这样的:

    List<CoreMap> sentences = document.get(SentencesAnnotation.class);
    List<Sentence> convertedSentences = new ArrayList<> ();
    for (CoreMap sentence : sentences)
    {
        convertedSentences.add (new Sentence (sentence));
    }

其中Sentence的构造函数从句子中提取单词。我如何扩展这个以便获得额外的数据级别,即我当前的文档范围“convertedSentences”列表由“convertedParagraphs”列表补充,每个条目包含一个“convertedSentences”列表?

我尝试了对我来说最明显的方法:

List<CoreMap> paragraphs = document.get(ParagraphsAnnotation.class);
for (CoreMap paragraph : paragraphs)
{
        List<CoreMap> sentences = paragraph.get(SentencesAnnotation.class);
        List<Sentence> convertedSentences = new ArrayList<> ();
        for (CoreMap sentence : sentences)
        {
            convertedSentences.add (new Sentence (sentence));
        }

        convertedParagraphs.add (new Paragraph (convertedSentences));
}

但这不起作用,所以我想我误解了一下这应该如何运作。

2 个答案:

答案 0 :(得分:5)

似乎CoreNLP中存在ParagraphsAnnotation类是一个红色的鲱鱼 - 实际上没有使用这个类(参见http://grepcode.com/search/usages?type=type&id=repo1.maven.org%24maven2@edu.stanford.nlp%24stanford-corenlp@3.2.0@edu%24stanford%24nlp%24ling@CoreAnnotations.ParagraphsAnnotation&k=u - 从字面上看,除了它的定义之外没有对这个类的引用)。因此,我必须自己打破段落。

关键是要注意SentencesAnnotation中包含的每个句子都包含CharacterOffsetBeginAnnotation。我的代码就变成了这样的东西:

    List<CoreMap> sentences = document.get(SentencesAnnotation.class);
    List<Sentence> convertedSentences = new ArrayList<> ();
    for (CoreMap sentence : sentences)
    {
        int sentenceOffsetStart = sentence.get (CharacterOffsetBeginAnnotation.class);
        if (sentenceOffsetStart > 1 && text.substring (sentenceOffsetStart - 2, sentenceOffsetStart).equals("\n\n") && !convertedSentences.isEmpty ())
        {
            Paragraph current = new Paragraph (convertedSentences);
            paragraphs.add (current);
            convertedSentences = new ArrayList<> ();
        }           
        convertedSentences.add (new Sentence (sentence));
    }
    Paragraph current = new Paragraph (convertedSentences);
    paragraphs.add (current);

答案 1 :(得分:0)

我会通过识别带有正则表达式的段落来实现这一点,如果用双线换行定义它们应该没问题。然后,您可以将Paragraphs实现为只有一个字段的自己的类(带有段落中句子的ArrayList),或者只是简单地使用句子列表来表示段落。