masato-ka's diary

日々思ったこととか、やったことの備忘録。

Javaライブラリ、KuromojiとKumoで日本語 Word cloudを作成する。

この記事について

この記事ではJavaでWordCloudを作るためのライブラリKumoの使い方を紹介しています。Word cloudは文章中の単語を並べ、各単語の出現頻度にしたがって文字の大きさを変化させる画像です。これにより、直感的に文章の内容や特徴を捉えることができます。

Kumoの概要と日本語形態素解析の検討

JavaのWord cloudライブラリを探したところKumoというライブラリを発見しました。このライブラリはJavaのみで完結しています。

github.com

また、ラテン系文字だけでなく、中国語の形態素解析もできるようです。しかし、日本語については形態素解析器が含まれていません。そこで、日本語解析はJava形態素解析器としてKuromojiを利用します。

www.atilika.com

使い方

それでは早速使い方を見ていきましょう。

Javaプロジェクトの依存関係へ追加

前述の通り、日本語の形態素解析にはKuromojiを追加します。まずはMavenまたはGradleの依存関係へKumoとKuromojiを追加しましょう。Kumoはkumo-coreを依存関係に設定すると形態素解析部分を除いたWord cloud作成ライブラリのみをインストールすることができます。Kuromojiについて今回はipadic版を利用します。たの辞書を使う場合もこの後の利用方法に変更はありません。

<dependency>
    <groupId>com.kennycason</groupId>
    <artifactId>kumo-core</artifactId>
    <version>1.17</version>
</dependency>
<dependency>
    <groupId>com.atilika.kuromoji</groupId>
    <artifactId>kuromoji-ipadic</artifactId>
    <version>0.9.0</version>
</dependency>

Kuromojiの形態素解析の実行

Kuromojiの形態素解析後Map<String,Long>という型でデータをまとめます。Keyは抽出した単語、Valueは文章中での出現回数です。 inputTextは文章などが入っている想定です。また、以下の例では固有名詞のみを抜き出しています。

public Map<String,Long> tokenize(String inputText){
    List<Token> tokens = tokenizer.tokenize(inputText);
    Map<String,Long> dataSet = tokens.stream()
          .filter(t -> t.getPartOfSpeechLevel2().equals("固有名詞"))
          .map(t -> t.getSurface())
          .collect(Collectors.groupingBy(e->e,Collectors.counting()));
}

実際にWord cloudを作成するためにはkumo-coreライブラリで提供されているWordFrequencyオブジェクトのListを後述するWordCloudオブジェクトへ渡す必要があります。そのために以下のように変換を行います。

List<WordFrequency> wordFrequencies = dataSet.entrySet()
                .stream()
                .map(data -> new WordFrequency(data.getKey(), data.getValue().intValue()))
                .collect(Collectors.toList());

KumoでWord cloudの作成

実際にWord cloud を作成するにはkumo-coreで提供されるWordCloudクラスを使います。

final Dimension dimension = new Dimension(300,300);//  (1)
final WordCloud wordCloud = new WordCloud(dimension, CollisionMode.PIXEL_PERFECT);// (2)
wordCloud.setPadding(2);
wordCloud.setBackground(new CircleBackground(200)); // (3)
wordCloud.setBackgroundColor(Color.white); // (4)
wordCloud.setColorPalette(new LinearGradientColorPalette(Color.RED, Color.BLUE, Color.GREEN,
         30, 30)); // (5)
wordCloud.setFontScalar(new LinearFontScalar(10, 40)); // (6)
wordCloud.build(this.wordFrequencies); // (7)
BufferedImage resultImage = wordCloud.getBufferedImage(); // (8)
  • (1) Dimensionオブジェクトで作成する画像のサイズを決めるここでは300 X 300
  • (2) コンストラクタへ(1)のDimensionオブジェクトを渡してコンストラクタを作成する。
  • (3) 半径200の円状にWord cloudを作成する。四角や指定したテンプレート画像に沿った形状にすることもできる。
  • (4) 作成画像の背景を白に変更
  • (5) 文字のグラデーションを設定
  • (6) フォントサイズの設定
  • (7) 作成元のデータが入っているListオブジェクトを渡しビルドする。
  • (8) 作成された画像をBufferedImageとして 取得する。

最終的に出力されたBufferedImageオブジェクトをファイルに保存します。画像の拡張子はデフォルトでpngとなっていますが、設定で変更できるようです。

作成してみたWord cloudの画像

試しに、このブログに対して処理をかけてみたのが以下の結果です。見事に横文字単語だけで構成されています。あんまり日本語の形態素解析をしたありがたみがないです。

f:id:masato-ka:20190312230457p:plain
WordCloudをこのブログにかけてみた

ニュース記事なんかで試してみるといいかもしれませんね。

まとめ

自分のブログにWord Cloudを実行すると今までにどんなブログを書いていたのかわかりやすくなります。今後のブログ内容や自分の興味関心などをアバウトに把握できていい感じです。