OpenNLP Toolsによる英語の解析: 構文解析編

以前のエントリで、Java自然言語処理ライブラリOpenNLP Toolsを使った英語の品詞解析(POS tagging)について書いたんですが、構文解析についても方法を知りたがっている方が多いようなので、手順を簡単に説明します。

1. OpenNLP Toolsのダウンロード

以下のOpenNLPのサイトからOpenNLP Toolsをダウンロードします。

redirect

2. モデルファイルのダウンロード

http://opennlp.sourceforge.net/models/english/parser/

上記ページ内の全てのファイルをダウンロードして、1つのディレクトリに保存します。

3. opennlp.tools.lang.english.TreebankParserの使用

以下が、TreebankParserを使って"I am a student."を構文解析するサンプルです。1でダウンロードしたOpenNLP Tools中のjarファイルとsrcディレクトリ以下をクラスパスに追加する必要があります。また、2のファイルをC:\opennlpに保存してあるものとします。

import opennlp.tools.lang.english.TreebankParser;
import opennlp.tools.parser.Parse;
import opennlp.tools.parser.ParserME;
import opennlp.tools.util.Span;

public class Test {
    public static void main(String[] args) throws Exception {
        ParserME parser = TreebankParser.getParser("C:\\opennlp", true, false,
                ParserME.defaultBeamSize,
                ParserME.defaultAdvancePercentage);

        String input = "I am a student.";
        Parse[] parses = TreebankParser.parseLine(input, parser, 1);
        for (Parse parse : parses) {
            output(parse);
        }
    }

    private static void output(Parse parse) {
        if (parse.getChildCount() == 0) {
            Span span = parse.getSpan();
            String word = parse.getText().substring(
                    span.getStart(), span.getEnd());
            System.out.print(word);
        } else {
            System.out.print("(" + parse.getType() + " ");
            for (Parse child : parse.getChildren()) {
                output(child);
            }
            System.out.print(")");
        }
    }
}

プログラムを実行すると、以下の出力が得られます。

(TOP (S (NP (PRP I))(VP (VBP am)(NP (DT a)(NN student.)))))

これが、"I am a student."を解析した結果の構文木になります。NP, PRP, VPといったラベルの意味は品詞解析のときと同じで、Penn Treebank準拠です。