📜

WordCloudで己のコードを懐古する

に公開

はじめに

自分の GitHub のプロフィールや X のバナーを全く更新してないことを思い出し、なにか使える画像を作りたくなりました。

GitHub のリポジトリ数もじりじりと増え、同時に途中で折れた残骸たちも散らかりはじめた今日この頃。プロフィールに載せるのだから、自分がどんなコードを書いてきたのか一目で分かる WordCloud が良いのではないかと考えました。

今回作成したツールは、config.jsonの設定と font の指定で誰でも使えます。
もし良ければ使っていただけると幸いです。

https://github.com/Oya-Tomo/repos-wordcloud

下の画像は、筆者のリポジトリを指定して生成した画像です。
拙いながらも、なんだかんだ色々書いたなぁという印象です。

image

ツールの使い方

事前準備

  • docker compose が使える環境

クローン

git clone https://github.com/Oya-Tomo/repos-wordcloud
cd repos-wordcloud

フォントファイルの配置

  • お好みのフォントファイルを入手 (ttf, otf)
  • fontディレクトリを作成し、フォントファイルを配置する
mkdir font

ツールの設定

  • config.jsonを作成
  • フォントのファイル名を設定
  • 画像のサイズを設定
  • 画像内に描画する単語の最大数を設定
  • リポジトリの URL を列挙 (2 つ以上)
touch config.json
{
  "font": "font/[font file name].ttf",
  "size": {
    "width": 1500,
    "height": 500
  },
  "max_words": 400,
  "repos": [
    "https://github.com/Oya-Tomo/repos-wordcloud",
    "https://github.com/..."
  ]
}

プログラムの実行

必要なライブラリの調達や環境構築、コードの実行まで全てやってくれます。

docker compose up

出力

docker コンテナが終了すると、exportディレクトリが生成されます。
その中にwordcloud.pngがあるはずです。

実装

コードが短いので、気になる方は読んでいただいたほうが速いかと思います。

ここではざっくり解説を行います。

TF-IDF について

WordCloud の文字サイズを決めるスコアとして利用されているのが TF-IDF (Term Frequency-Inverse Document Frequency) です。

計算式は以下のように表されます。

\text{TF-IDF}_{d,w} = \text{TF}_{d,w} \times \text{IDF}_{w}
\text{TF}_{d,w} = \frac{\text{文書d中の単語wの出現回数}}{\text{文書d中の全単語の出現回数の和}}
\text{IDF}_{w} = log (\frac{\text{全文書数}}{\text{単語wを含む文章数}})

この TF-IDF とは、一般に複数の文章に登場する単語やトピックの出現頻度や傾向から、その単語の重要度を測る指標です。

まず基本的に単語の重要度は出現回数が多いほうが高くなります。これを\text{TF}_{d,w}で求めます。
しかし、単純に、沢山出てくる単語を重要だとして扱うと、例えばプログラムで必ず登場するimportなどは重要単語になってしまいます。
このような問題を防ぐため、\text{IDF}_{w}で全文章にどれほど登場するかを考慮することで補正を行います。

TF-IDF は、少ない文章に何度も出現する単語の重要度を高く評価する指標なのです。

gensim

上で述べた、TF-IDF の算出を行ってくれる機能があります。
提供されているDictionaryクラスを用いてコーパスを作成し、 TfidfModelでスコアを算出しました。

wordcloud

wordcloud の作成にも便利なライブラリがあります。
テキストと TF-IDF スコアを渡すだけで簡単に画像が作成できます。

docker compose

ツールとして配布するときに、docker があれば便利かと思ったので作成しました。
docker の使える環境さえあれば、コマンド一つで簡単にコードを実行することが出来ます。

おわりに

リポジトリの数が将来どんどん増えていくことを期待しているので、定期的に画像を生成してみて触れた技術の変遷を感じたいと思います。

Discussion