gitのコミットメッセージに含まれる単語を集計してみる

  • 16
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

こんばんは(こんにちは?)。
freeeのエンジニアの@nanjakkunです。
この記事は freee Engineers Advent Calendar 2015 の23日目の記事です。


背景

freeeでは、バージョン管理システムにgitを使っており、業務に関連するソースコードはほぼ全てGitHubにホスティングされています。
そしてコードレビューはGitHub上で行われています。

昨日のfreeeアドベントカレンダーで @yebihara から
【神出鬼没のレビューコメントで糞コードを斬りまくるレビュー侍】
との有難い二つ名を拝承したので、コメントについて書きたいと思います。
でもレビューコメントじゃなくてコミットコメントの方です。

gitのログを加工する

普段freeeのメンバーがどんなコミットメッセージを書いているのか、軽く集計したいと思います。
まずはgitのログを適当な形に加工します。

ログを出力したいディレクトリに移動します(今回は会計freeeのリポジトリです)。
そこで適当にフォーマットを指定してgitのログをテキストファイルに出力します。

$ git log --pretty=format:"[%an] %s" > git.log

これでコミットした人とコミットメッセージがファイルに出力されます。
ちなみに約6万行ありました。

$ wc -l git.log   # 59423 git.log

集計

形態素解析して単語の集計でもしましょう。
ちなみにテキストマイニングネタは
@kompirohttp://qiita.com/kompiro/items/11be7339c1723d477ebe
@krt皆が忘年会やってる中、ひとりでサポートチケットからテキストマイニング祭りをしてみる
に引き続きfreeeアドベントカレンダー2015では三本目(?)

freeeのメイン言語はrubyなので言語はrubyを使います。
形態素解析器はigo-rubyを使いましょう。

/dic以下にあらかじめ辞書ファイルは存在しているものとします。

require 'igo-ruby'

def initialize_tagger
  @tagger = Igo::Tagger.new('dic')
end

def count_word(file_name)
  open(file_name).each do |line|
    next unless line.match(/\A\[(.+?)\]\s(.+)/)

    begin
      @tagger.parse($2).each{|i|
        if @res[i.surface]
          @res[i.surface] += 1
        else
          @res[i.surface] = 1
        end
      }
    # 稀にparseに失敗します
    rescue => e
      puts $2
      puts e
    end
  end
end

@res = {}
initialize_tagger
count_word('git.log')
@res.sort {|(k1, v1), (k2, v2)| v2 <=> v1 }

これで出現頻度順に単語が取得できます。
なお、igo-rubyを用いただけだと英単語は活用を考慮されませんが、今回はあまり気にしません(例: fixとfixedが別に扱われている)。
そのへんまで考慮したいなら英語の形態素解析器Stanford POS Taggerあたりを併用すればいけそうです。

頻出単語TOP 20

集計が取れたので単語の出現頻度でも見ていきましょう。
(※記号は除いてあります)

  1. Merge
  2. from
  3. request
  4. pull
  5. fix
  6. develop
  7. 修正
  8. branch
  9. into
  10. する
  11. ない

mergeコミットのメッセージが含まれているのでMerge, from, request等の単語が上位に来ているのが特徴的ですね。

頻出単語TOP 20改

mergeコミットに含まれる単語や助詞、助動詞ばかりだと面白くないのでそれらを除きます。

  1. fix
  2. 修正
  3. する
  4. 追加
  5. of
  6. add
  7. spec
  8. com
  9. CFO
  10. for
  11. to
  12. 変更
  13. 表示
  14. 削除
  15. deal
  16. 対応
  17. エラー
  18. こと
  19. 場合

英語と日本語が混じってるあたりカオスです。
英語でコメント書く人、日本語で書く人、混ぜて書く人、様々です
(私は混ぜて書く人・・英語で書こうとして書けない時に日本語で書いてしまう)。
CFOという単語は見慣れないと思いますがfreeeの旧社名です。
ちなみに社名かつサービス名の【freee】は次点の21位でした。惜しい。

バトンタッチ

明日は元31歳東大卒無職で法学博士の @hiraguri の番です。