NLP4J [006-034] NLP4J で言語処理100本ノック #34 「AのB」


Indexに戻る

やってみます。

34. 「AのB」

2つの名詞が「の」で連結されている名詞句を抽出せよ.

Maven

現在開発中のバージョンを利用します。

<dependency>
    <groupId>org.nlp4j</groupId>
    <artifactId>nlp4j-core</artifactId>
    <version>1.1.1.0-SNAPSHOT</version>
</dependency>

Text Data

デフォルトで利用している形態素解析(Yahoo! Japan デベロッパーネットワーク 日本語形態素解析) では、リクエストサイズの上限が900KBであり、回数に制限もあるので小さなサイズのテキストファイルを利用しています。

一

 吾輩は猫である。
名前はまだ無い。

 どこで生れたかとんと見当がつかぬ。
何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。
吾輩はここで始めて人間というものを見た。
しかもあとで聞くとそれは書生という人間中で一番獰悪な種族であったそうだ。
この書生というのは時々我々を捕えて煮て食うという話である。
しかしその当時は何という考もなかったから別段恐しいとも思わなかった。
ただ彼の掌に載せられてスーと持ち上げられた時何だかフワフワした感じがあったばかりである。
掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というものの見始であろう。
この時妙なものだと思った感じが今でも残っている。
第一毛をもって装飾されべきはずの顔がつるつるしてまるで薬缶だ。
その後猫にもだいぶ逢ったがこんな片輪には一度も出会わした事がない。
のみならず顔の真中があまりに突起している。
そうしてその穴の中から時々ぷうぷうと煙を吹く。
どうも咽せぽくて実に弱った。
これが人間の飲む煙草というものである事はようやくこの頃知った。


Java Code

package nlp4j.nokku.chap4;

import java.util.List;

import nlp4j.Document;
import nlp4j.DocumentAnnotator;
import nlp4j.DocumentAnnotatorPipeline;
import nlp4j.Keyword;
import nlp4j.crawler.Crawler;
import nlp4j.crawler.TextFileLineSeparatedCrawler;
import nlp4j.impl.DefaultDocumentAnnotatorPipeline;
import nlp4j.index.DocumentIndex;
import nlp4j.index.SimpleDocumentIndex;
import nlp4j.yhoo_jp.YJpMaAnnotator;

public class Nokku31 {
    public static void main(String[] args) throws Exception {
        // NLP4Jが提供するテキストファイルのクローラーを利用する
        Crawler crawler = new TextFileLineSeparatedCrawler();
        crawler.setProperty("file", "src/test/resources/nlp4j.crawler/neko_short_utf8.txt");
        crawler.setProperty("encoding", "UTF-8");
        crawler.setProperty("target", "text");
        // ドキュメントのクロール
        List<Document> docs = crawler.crawlDocuments();
        // NLPパイプライン(複数の処理をパイプラインとして連結することで処理する)の定義
        DocumentAnnotatorPipeline pipeline = new DefaultDocumentAnnotatorPipeline();
        {
            // Yahoo! Japan の形態素解析APIを利用するアノテーター
            DocumentAnnotator annotator = new YJpMaAnnotator();
            pipeline.add(annotator);
        }
        // アノテーション処理の実行
        pipeline.annotate(docs);
        // キーワードをカウントするためにDocumentIndexを利用します。
        SimpleDocumentIndex index = new SimpleDocumentIndex();
        // ドキュメントの追加
        index.addDocuments(docs);
        List<Keyword> kwds = index.getKeywordsWithoutCount();

        // 「AのB」を探す
        String meishi_a = null;
        String no = null;

        for (Keyword kwd : kwds) {
            if (meishi_a == null && kwd.getFacet().equals("名詞")) {
                meishi_a = kwd.getLex();
            } //
            else if (meishi_a != null && no == null && kwd.getLex().equals("の")) {
                no = kwd.getLex();
            } //
            else if (meishi_a != null && no != null && kwd.getFacet().equals("名詞")) {
                System.err.println(meishi_a + no + kwd.getLex());
                meishi_a = null;
                no = null;
            } //
            else {
                meishi_a = null;
                no = null;
            }
        }
    }
}

結果

彼の掌
掌の上
書生の顔
はずの顔
顔の真中
穴の中

続き

この記事には続きがあります。
NLP4J [006-034b] NLP4J で言語処理100本ノック #34 「AのB」の Annotator を作ってみる

まとめ

NLP4J を使うと、Javaで簡単に自然言語処理ができますね!

プロジェクトURL

https://www.nlp4j.org/


Indexに戻る