NLP4J [002] Javaで Yahoo! デベロッパーネットワーク 日本語係り受け解析(V1)を利用して日本語の構文解析をしてみる


Indexに戻る : [001]形態素解析 > [002]構文解析 > [003]品詞の統計処理

■追記

Yahoo! の構文解析APIについてV1が終了しましたのでこの記事は参考としてのみ置いておきます。
詳しくは
【重要】テキスト解析Web APIにおける日本語係り受け解析API仕様変更のお知らせ - Yahoo!デベロッパーネットワーク
https://developer.yahoo.co.jp/changelog/web_apiapi.html
をご覧ください。


NLP4J を使ってJavaで日本語の構文解析(係り受け解析)をしてみます。

構文解析ができると「車が急に止まった」というテキストから
・「車が→止まった」
・「急に→止まった」
というような情報を抽出することができます。

Maven

<dependency>
  <groupId>org.nlp4j</groupId>
  <artifactId>nlp4j</artifactId>
  <version>1.0.0.0</version>
</dependency>

Code1

import nlp4j.Keyword;
import nlp4j.KeywordWithDependency;
import nlp4j.impl.DefaultNlpServiceResponse;
import nlp4j.yhoo_jp.YJpDaService;
public class HelloNLP4JDA {
        // 自然文のテキスト
        String text = "車が急に止まった。";
        // 係り受け解析
        YJpDaService service = new YJpDaService();
        // 係り受け解析の結果を取得する
        DefaultNlpServiceResponse response = service.process(text);
        for (Keyword kwd : response.getKeywords()) {
            if (kwd instanceof KeywordWithDependency) {
                // 係り受け解析の結果を出力する
                System.err.println(((KeywordWithDependency) kwd).toStringAsDependencyTree());
            }
        }
}

Output1

このような感じで出力できます。簡単ですね!

-sequence=6,lex=null,str=。
    -sequence=5,lex=null,str=た
        -sequence=4,lex=null,str=止まっ
            -sequence=2,lex=null,str=が
                -sequence=1,lex=null,str=車
            -sequence=3,lex=null,str=急に

Code2

キーワードのオブジェクトを操作することで細かい結果を調べることができます。

    public static void main(String[] args) throws Exception {
        // 自然文のテキスト
        String text = "車が急に止まった。";
        // 係り受け解析
        YJpDaService service = new YJpDaService();
        // 係り受け解析の結果を取得する
        DefaultNlpServiceResponse response = service.process(text);
        for (Keyword kwd : response.getKeywords()) {
            if (kwd instanceof KeywordWithDependency) {
                // 係り受け解析の結果を出力する
                print((KeywordWithDependency) kwd, 0);
            }
        }
    }

    static void print(KeywordWithDependency kwd, int depth) {
        System.err.println(depth + ":" + kwd.getStr());
        for (KeywordWithDependency kwd2 : kwd.getChildren()) {
            print(kwd2, depth + 1);
        }
    }

Output2

0:。
1:た
2:止まっ
3:が
4:車
3:急に

簡単ですね!

Indexに戻る

NLP4J のご紹介 - [000] Javaで自然言語処理 Index

プロジェクトURL

https://www.nlp4j.org/