NLP4J [004] Javaで自然言語処理と構文解析の統計処理を使ってテキスト分析をしてみる


Indexに戻る : [003]品詞の統計処理 > [004]構文解析の統計処理 > [005-1] NLP4J+Twitter4J(データ収集)

NLP4Jを使って形態素解析の結果と簡単な統計処理を利用してテキスト分析をしてみます。

繰り返しになりますが、
「形態素解析」や「構文解析」は料理で言うと「包丁の使い方」に近い感じです。
「形態素解析」や「構文解析」に加えて「統計処理」を入れるとテキスト分析=料理に近くなるのではないかなと思います。
ここでの統計処理は簡単なものを利用しますが、機械学習や複雑な統計処理を入れてみるのもよいと思います。

さて、ここで以下のような文書があったとします。1行が1レコードです。

"Toyota", "ハイブリッドカーを作っています。"
"Toyota", "ハイブリッドカーを売っています。"
"Toyota", "自動車を作っています。"
"Toyota", "自動車を売っています。"
"Nissan", "EVを作っています。"
"Nissan", "EVを売っています。"
"Nissan", "自動車を売っています。"
"Nissan", "ルノーと提携しています。"
"Nissan", "軽自動車を売っています。"
"Honda", "自動車を作っています。"
"Honda", "自動車を売っています。"
"Honda", "バイクを作っています。"
"Honda", "バイクを売っています。"
"Honda", "軽自動車を売っています。"
"Honda", "軽自動車を作っています。"

文書を「Toyota」「Nissan」「Honda」に分けて考えたとき、「特徴的な”係り受け”キーワード」は何でしょうか?
特徴的なキーワードをNLP4Jを使って出してみます。(難しい処理はしていません)
構文解析を使い、統計処理を「SimpleDocumentIndex」クラスを使って行っているところがポイントです。

Maven

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

Code1

public class HelloTextMiningMain2B {
    public static void main(String[] args) throws Exception {
        // ドキュメントの用意(CSVを読み込むなどでも可)
        List<Document> docs = new ArrayList<Document>();
        {
            docs.add(createDocument("Toyota", "ハイブリッドカーを作っています。"));
            docs.add(createDocument("Toyota", "ハイブリッドカーを売っています。"));
            docs.add(createDocument("Toyota", "自動車を作っています。"));
            docs.add(createDocument("Toyota", "自動車を売っています。"));
            docs.add(createDocument("Nissan", "EVを作っています。"));
            docs.add(createDocument("Nissan", "EVを売っています。"));
            docs.add(createDocument("Nissan", "自動車を売っています。"));
            docs.add(createDocument("Nissan", "ルノーと提携しています。"));
            docs.add(createDocument("Nissan", "軽自動車を売っています。"));
            docs.add(createDocument("Honda", "自動車を作っています。"));
            docs.add(createDocument("Honda", "自動車を売っています。"));
            docs.add(createDocument("Honda", "バイクを作っています。"));
            docs.add(createDocument("Honda", "バイクを売っています。"));
            docs.add(createDocument("Honda", "軽自動車を売っています。"));
            docs.add(createDocument("Honda", "軽自動車を作っています。"));
        }
        // 形態素解析アノテーター+構文解析アノテーター
        DocumentAnnotator annotator = new YjpAllAnnotator(); // 形態素解析+構文解析
        {
            System.err.println("形態素解析+構文解析");
            long time1 = System.currentTimeMillis();
            // 形態素解析+構文解析
            annotator.annotate(docs);
            long time2 = System.currentTimeMillis();
            System.err.println("処理時間[ms]:" + (time2 - time1));
        }
        // キーワードインデックス(統計処理)の用意
        Index index = new SimpleDocumentIndex();
        {
            System.err.println("インデックス作成");
            long time1 = System.currentTimeMillis();
            // キーワードインデックス作成処理
            index.addDocuments(docs);
            long time2 = System.currentTimeMillis();
            System.err.println("処理時間[ms]:" + (time2 - time1));
        }
        {
            // 「名詞...動詞」でNissanに共起性の高いキーワードの取得
            List<Keyword> kwds = index.getKeywords("名詞...動詞", "item=Nissan");
            System.out.println("名詞...動詞 for Nissan");
            for (Keyword kwd : kwds) {
                System.out.println(String.format("count=%d,correlation=%.1f,lex=%s", kwd.getCount(),
                        kwd.getCorrelation(), kwd.getLex()));
            }
        }
        {
            // 「名詞...動詞」でToyotaに共起性の高いキーワードの取得
            List<Keyword> kwds = index.getKeywords("名詞...動詞", "item=Toyota");
            System.out.println("名詞...動詞 for Toyota");
            for (Keyword kwd : kwds) {
                System.out.println(String.format("count=%d,correlation=%.1f,lex=%s", kwd.getCount(),
                        kwd.getCorrelation(), kwd.getLex()));
            }
        }
        {
            // 「名詞...動詞」でHondaに共起性の高いキーワードの取得
            List<Keyword> kwds = index.getKeywords("名詞...動詞", "item=Honda");
            System.out.println("名詞...動詞 for Honda");
            for (Keyword kwd : kwds) {
                System.out.println(String.format("count=%d,correlation=%.1f,lex=%s", kwd.getCount(),
                        kwd.getCorrelation(), kwd.getLex()));
            }
        }
    }
    static Document createDocument(String item, String text) {
        Document doc = new DefaultDocument();
        doc.putAttribute("item", item);
        doc.setText(text);
        return doc;
    }
}

Output

形態素解析+構文解析
処理時間[ms]:9618
インデックス作成
処理時間[ms]:3
名詞...動詞 for Nissan
count=1,correlation=3.0,lex=EV...売る
count=1,correlation=3.0,lex=EV...作る
count=1,correlation=1.5,lex=軽自動車...売る
count=1,correlation=1.0,lex=自動車...売る
名詞...動詞 for Toyota
count=1,correlation=3.8,lex=カー...売る
count=1,correlation=3.8,lex=カー...作る
count=1,correlation=3.8,lex=ハイブリッド...売る
count=1,correlation=3.8,lex=ハイブリッド...作る
count=1,correlation=1.9,lex=自動車...作る
count=1,correlation=1.3,lex=自動車...売る
名詞...動詞 for Honda
count=1,correlation=2.5,lex=バイク...売る
count=1,correlation=2.5,lex=軽自動車...作る
count=1,correlation=2.5,lex=バイク...作る
count=1,correlation=1.3,lex=自動車...作る
count=1,correlation=1.3,lex=軽自動車...売る
count=1,correlation=0.8,lex=自動車...売る

簡単ですね!
このような結果になりました!
人間の感覚と合っているでしょうか?


Indexに戻る : [003]品詞の統計処理 > [004]構文解析の統計処理 > [005-1] NLP4J+Twitter4J(データ収集)

プロジェクトURL

https://www.nlp4j.org/