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

[Indexに戻る](https://qiita.com/oyahiroki/items/ba79a759c599d3459d29) : [[002]構文解析](https://qiita.com/oyahiroki/items/4ad7084f492bf8d77541) > [003]品詞の統計処理 > [[004]構文解析の統計処理](https://qiita.com/oyahiroki/items/257b2d730fc71366fbcc)
 


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

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

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

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

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

#Maven
```xml
<dependency>
  <groupId>org.nlp4j</groupId>
  <artifactId>nlp4j</artifactId>
  <version>1.0.0.0</version>
</dependency>
```

#Code1

```java
public class HelloTextMiningMain1 {
	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 YJpMaAnnotator();
// 形態素解析処理
		annotator.annotate(docs);

// キーワードインデックス（統計処理）の用意
		Index index = new SimpleDocumentIndex();
// キーワードインデックス作成処理
		index.addDocuments(docs);
		{
			// 共起性の高いキーワードの取得
			List<Keyword> kwds = index.getKeywords("名詞", "item=Nissan");
			System.out.println("Keywords(名詞) for Nissan");
			for (Keyword kwd : kwds) {
				System.out.println(String.format("%.1f,%s", kwd.getCorrelation(), kwd.getLex()));
			}
		}
		{
			// 共起性の高いキーワードの取得
			List<Keyword> kwds = index.getKeywords("名詞", "item=Toyota");
			System.out.println("Keywords(名詞) for Toyota");
			for (Keyword kwd : kwds) {
				System.out.println(String.format("%.1f,%s", kwd.getCorrelation(), kwd.getLex()));
			}
		}
		{
			// 共起性の高いキーワードの取得
			List<Keyword> kwds = index.getKeywords("名詞", "item=Honda");
			System.out.println("Keywords(名詞) for Honda");
			for (Keyword kwd : kwds) {
				System.out.println(String.format("%.1f,%s", 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
```
Keywords(名詞) for Nissan
3.0,EV
3.0,ルノー
3.0,提携
1.0,軽自動車
0.6,自動車
Keywords(名詞) for Toyota
3.8,ハイブリッド
3.8,カー
1.5,自動車
Keywords(名詞) for Honda
2.5,バイク
1.7,軽自動車
1.0,自動車
```

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

#Indexに戻る
[NLP4J のご紹介 - [000] Javaで自然言語処理 Index](https://qiita.com/oyahiroki/items/ba79a759c599d3459d29)

#プロジェクトURL
https://www.nlp4j.org/
<img width="64" alt="NLP4J_N_128.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/4f59b21b-4b43-187d-0aac-7b99c0fd4bac.png">



---