この記事はリクルートライフスタイル Advent Calendar 2015 - Qiita の17日目です。
こんにちは。現在、ホットペッパーグルメのエンジニアをやっている敷地@shikicheeです。
gitで英語のコミットメッセージどう書けばいいの?
と思ったことはありませんか?
英語で書きたいなーって思っても、いざ書くとなると躊躇しますよね。
ネイティブはどう書いてるのでしょうか。
そこで、github上で実際に使われているコメントを解析し、
よく使われている例をまとめてみました。
解析したデータ
github上で1万スター以上を獲得している169リポジトリのコミットメッセージを対象としました。
bootstrap、jquery、react、d3、docker、node、tensorflowなどの有名なプロジェクトばかりなので、良いコメントが期待できます。
解析するコミットメッセージは、全部で134万8703行にもなりました。
世界中の一流エンジニアたちは、どんなコメントを書いているのでしょうか。
頻出英単語TOP100
コミットメッセージ中の頻出英単語順にワードクラウド表示した結果がこちらです。
動詞と名詞に限定して表示しています。
add、fix、remove、useあたりがよく用いられているみたいですね。
コミットメッセージを書くのに重要なのは動詞です。
動詞を見ていきましょう。
頻出動詞TOP20
順位 | 英単語 | 意味 | 出現回数 |
---|---|---|---|
1 | fix/fixed/fixes | 修正する | 165084/35773/19813 |
2 | add/added | 追加する | 141711/35282 |
3 | remove/removed | 取り除く | 81124/12528 |
4 | use | 用いる | 75767 |
5 | update/updated | 更新する | 57004/11761 |
6 | support | サポートする | 43808 |
7 | merge | マージする | 34762 |
8 | make | 作成する | 31425 |
9 | move | 移動させる | 22208 |
10 | don't | しない | 21431 |
11 | check | チェックする | 16882 |
12 | change | 変更する | 14594 |
13 | allow | 許す | 14352 |
14 | cleanup/clean | 一掃する | 12217/8405 |
15 | set | セットする | 13132 |
16 | convert | 変換する | 11633 |
17 | rename | リネームする | 10703 |
18 | do | する | 10028 |
19 | revert | リバートする | 9268 |
20 | avoid | 避ける | 8822 |
シンプルな単語が多いようです。 | |||
modifyが入っていないのは意外でした。20位以降は、improveや、handle、replaceなどの動詞が続きます。 |
しかし、動詞が分かっただけでは、英語でコメント書けませんよね。
これらの動詞とセットでよく用いられる単語を分析してみます。
頻出動詞とセットでよく用いられている単語とコメント集
頻出動詞とセットで用いられた単語、それぞれTOP10を解析し、
その中から、有用な組み合わせと実際のコメントを列挙していきます。
1位.fix
単語のセット | 代表例 | 意味 | 実際のコメント |
---|---|---|---|
fix,in | Fix A in B | Bの箇所のAを修正 | Fix typo in docs |
fix,for | Fix for A | Aに対する修正 | fix for #4183 |
fix,to | Fix A to B | BへのAを修正 | Fix link to the spec |
fix,of | Fix A of B | BのAを修正 | fix location of favicon |
fixは、いろいろな前置詞と用いられています。 | |||
fixだけではないのですが、forの後には、issueのIDなどがよく用いられています。 |
2位.add
単語のセット | 代表例 | 意味 | 実際のコメント |
---|---|---|---|
add,to | Add A to B | BにAを追加 | add .js to import |
add,for | Add A for B | B用にAを追加 | Add test for bug #3116 |
addは、toがよく用いられています。 |
3位.remove
単語のセット | 代表例 | 意味 | 実際のコメント |
---|---|---|---|
remove,from | Remove A from B | BからAを除去 | Remove Debug from tests |
remove,in | Remove A in B | Bの箇所のAを除去 | Remove duplication in render function |
remove,unused | Remove unused A | 不必要なAを除去 | Remove unused code |
unusedはremoveに限らず使えそうです。 |
4位.use
単語のセット | 代表例 | 意味 | 実際のコメント |
---|---|---|---|
use,to | to use A | Aを用いるために | Change syntax to use dots |
use,of | Use A instead of B | Bの代わりにAを用いる | Use ++ instead of += 1 |
use,in | Use A in B | Bの箇所のAを用いる | Use stub in testing. |
use,for | Use A for B | BのためにAを用いる | use Ruby for mocking |
use,remove | Remove use of B | Bを用いるのを除去 | Remove use of deprecated method |
useは、不定詞として用いられていていました。 | |||
また、名詞としても用いられていますね。instead ofは、useに限らず使えそうです。 |
5位.update
単語のセット | 代表例 | 意味 | 実際のコメント |
---|---|---|---|
update,to | Update to A Update A to B |
Aにアップデート AをBにアップデート |
Update to Unicode 6.3.0 Update Modernizr to v1.6 |
update,for | Update A for B | Bに対してAをアップデート | update History.md for #1563 |
6位.support
単語のセット | 代表例 | 意味 | 実際のコメント |
---|---|---|---|
support,add | Add A support Add support for A |
Aサポートを追加 Aに対するサポートを追加 |
Add Travis CI Support Add support for callbacks |
supportは、名詞的にも使われていることが多いようです。 |
8位.make
単語のセット | 代表例 | 意味 | 実際のコメント |
---|---|---|---|
make,of | Make use of A | Aを使用する | make use of Ember.isNone explicit in Ember.isEmpty |
make,it | Make it A Make it Aの比較級 |
Aにする よりAにする (Aには、possible,simple,easy,clearなど) |
Make it possible to have IDs per request Make it easy to check platform requirements in a command Make it easier to debug the release script |
make,sure | Make sure to A Make sure (that) A |
必ずAするようにする | Make sure to reset default_url_options Make sure all packages rebuild. |
make単体では、Make A Bといった、AをBにするという形式がよく用いられますが、 | |||
他の単語との組み合わせで見てみると、Make it possible,Make it easierなどの使い方がされています。 |
9位.move
単語のセット | 代表例 | 意味 | 実際のコメント |
---|---|---|---|
move,from | Move A from B | BからAを移動させる | Move fix_fname from buffer.c |
move,to | Move A to B | AをBに移動させる | Move strings to strings.js |
move,in | Move A in B | B内のAを移動させる | Move quotes in nav-main.html |
10位.don't
単語のセット | 代表例 | 意味 | 実際のコメント |
---|---|---|---|
don't,use | Don't use A | Aを用いない | Don't use "assert_not_nil" |
don'tは、様々な動詞と用いられますが、useが多く用いれていました。 |
11位.check
単語のセット | 代表例 | 意味 | 実際のコメント |
---|---|---|---|
check,for | Check for A | Aに対するチェック | Check for weak dependency correctly. |
check,in | Check A in B | B内のAをチェック | check ID in os-release instead |
chcek,fix | Fix A check | Aチェックを修正 | Fix html extension check |
check,add | Add A check | Aチェックを追加 | Add null check |
remove,check | Remove A check | Aチェックを除去 | remove useless nil check |
checkは、結構名詞的な使われ方もしていて、if文の修正によく使われているようです。 |
12位.change
単語のセット | 代表例 | 意味 | 実際のコメント |
---|---|---|---|
change,to | Change A to B Change to B |
AをBに変更 Bに変更 |
Change copyright to 2013 change to lazy Unmount |
change,for | Chage A for B | Bに対してAを変更 | Change API for sending handles |
change,in | Change A in B | B中のAを変更 | change rm usage in docs |
13位.allow
単語のセット | 代表例 | 意味 | 実際のコメント |
---|---|---|---|
allow,to | Allow A to B | AがBするのを許す | Allow the user to drag faster |
15位.set
単語のセット | 代表例 | 意味 | 実際のコメント |
---|---|---|---|
set,to | Set A to B | AをBにセット | Set default kernel to Gaussian. |
set,for | Set A for B | Bに対してAをセット | Set release date for 0.10.1 |
16位.convert
単語のセット | 代表例 | 意味 | 実際のコメント |
---|---|---|---|
convert,to | Convert A to B Convert to B |
AをBに変換 Bに変換 |
convert time to string convert to boolean |
17位.rename
単語のセット | 代表例 | 意味 | 実際のコメント |
---|---|---|---|
rename,to | Rename A to B | AをBにリネーム | Rename hero.html to jumbotron.html |
20位.avoid
単語のセット | 代表例 | 意味 | 実際のコメント |
---|---|---|---|
avoid,to | Avoid A to B to avoid A |
BするためにAを避ける Aを避けるために |
avoid method call to compact Remove methods to avoid warnings. |
動詞単体では, Avoid Aや、Avoid ~ingでよく用いられています。 |
18位のdoは、主にdo notで用いられていたため省略しています。
7位のmerge、13位のcleanup、19位のrevertはセットでよく使われている単語はあまり出てきませんでした。
解析方法
データの収集
github上のリポジトリから、一括でコミットメッセージを取得するのには以下のプログラムを参考にしました。
参考URL
https://github.com/minamijoyo/commit-crawler
github APIのアクセストークンを登録するだけで、一括でコミットメッセージを取得することができます。
解析と可視化
英語のコミットメッセージなので、日本語とは違いスペースで区切るだけで簡単に単語ごとに分解できます。
分解した単語の出現頻度をカウントするプログラムをpythonで書きました。
ただ単純に頻度の多い単語を分析していっても、aやtheなどの意味のない単語が多いので、ある程度絞る必要があります。自然言語処理のライブラリであるnltkを用いて、品詞の分析をし、名詞と動詞の抽出しました。抽出した結果のワードクラウド表示は、以下の参考URLで簡単にできました。
参考URL
英語前処理サーベイ
nltkとpytagcloudで英語のワードクラウド
感想
github上のコメントは解析してみると、シンプルな単語が用いられており、
小難しい単語はあまり見受けられません。
中学校で習う単語と文法ばかりですし、書くときは考えすぎずに書いてよさそうです。
ちなみに、「Yes」や、「Oops」だけのコメントもあったりします。笑
分析に関して
Merge BranchやMerge pull requestなどのgithubが自動で生成するようなコメントは除いています。しかし、リポジトリごとに特有のコミットメッセージが存在
また、useや、supportなどは名詞としても用いられるため、動詞の用法としての順位は変わってくる可能性が大いにあります。
今回は行いませんでしたが、形容詞や副詞に関して分析するのも面白そうです。
ということで、番外編に結果を載せたいと思います。
(番外編1)頻出形容詞TOP20
順位 | 英単語 | 意味 | 実際のコメント |
---|---|---|---|
1 | new | 新しい | New URL. |
2 | unused | 使用されていない | Remove unused $$ |
3 | static | 静的な | Build static executable. |
4 | empty | 空の | Add empty line |
5 | old | 古い | Fix old links |
6 | small | 小さな | Small typo |
7 | initial | 最初の | Initial commit |
8 | local | ローカルの | Updates local dev guide |
9 | wrong | 間違った | Fix wrong id |
10 | common | 共通の | Optimize the most common resolver case. |
11 | other | 他の | Change other example fields |
12 | dead | 死んだ | Remove dead link |
13 | rid | (get rid ofで) 取り除く |
get rid of EmptyComponent |
14 | possible | 可能性のある | possible regression fix |
15 | unneeded | 不必要な | Remove unneeded @ |
16 | same | 同じ | Use same colors for disabled buttons |
17 | global | グローバルの | Fix global leaks |
18 | invalid | 不正な | Fix invalid timer test |
19 | specific | 特定の | Remove linux specific calls |
20 | extra | 余分な | Remove extra whitespace |
簡単な英単語ばかりですね。
ridは、get rid ofでよく使われるようです(形容詞ではないですが)。
また、possibleは 「possible + (何か悪いこと、例えばcrashやmemory leakなど)を修正する」という文脈で使われていました。他にも、if possible (文末に付けて: 可能なら)や、as early as possible(できるだけ早く)、make it possible(可能にする)などで使われていました。
ちなみに、enable,variable,disable,clear,separateも入っていましたが、形容詞以外の使われ方の方が多いようなので除いています。
(番外編2)頻出名詞TOP20
名詞も並べてみます。タイポ多いですね。笑
順位 | 英単語 | 意味 | 出現回数 |
---|---|---|---|
1 | test/tests | テスト | 30306/20073 |
2 | code | コード | 25839 |
3 | error | エラー | 22700 |
4 | function/functions | ファンクション | 14464/9640 |
5 | driver | ドライバー | 14386 |
6 | version | バージョン | 13231 |
7 | typo | タイポ | 12167 |
8 | docs | ドキュメント | 11865 |
9 | bug | バグ | 11518 |
10 | return | リターン | 11296 |
11 | tag | タグ | 14352 |
12 | default | デフォルト | 10556 |
13 | device | デバイス | 10381 |
14 | handling | ハンドリング | 10147 |
15 | files | ファイル | 9195 |
16 | type | タイプ | 9166 |
17 | auto | オート | 9268 |
18 | name | 名前 | 8765 |
19 | data | データ | 8511 |
20 | warning | 警告 | 8448 |