GitHubで使われている実用英語コメント集

この記事は[リクルートライフスタイル Advent Calendar 2015 - Qiita](http://qiita.com/advent-calendar/2015/recruitlifestyle) の17日目です。

こんにちは。現在、ホットペッパーグルメのエンジニアをやっている敷地[@shikichee](https://twitter.com/shikichee)です。

## gitで英語のコミットメッセージどう書けばいいの？
と思ったことはありませんか？
英語で書きたいなーって思っても、いざ書くとなると躊躇しますよね。
ネイティブはどう書いてるのでしょうか。
そこで、github上で実際に使われているコメントを解析し、
よく使われている例をまとめてみました。

# 解析したデータ
github上で1万スター以上を獲得している169リポジトリのコミットメッセージを対象としました。
**bootstrap、jquery、react、d3、docker、node、tensorflow**などの有名なプロジェクトばかりなので、良いコメントが期待できます。

解析するコミットメッセージは、全部で**134万8703行**にもなりました。
世界中の一流エンジニアたちは、どんなコメントを書いているのでしょうか。

# 頻出英単語TOP100
コミットメッセージ中の頻出英単語順にワードクラウド表示した結果がこちらです。

![word_cloud_Verbal.png](https://qiita-image-store.s3.amazonaws.com/0/506/3d6792c8-3126-04f4-0a92-e2734209e31b.png "word_cloud_Verbal.png")

動詞と名詞に限定して表示しています。
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 <br> Update A to B | Aにアップデート<br>AをBにアップデート | Update to Unicode 6.3.0<br>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<br>Add support for A| Aサポートを追加<br>Aに対するサポートを追加 | Add Travis CI Support<br>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<br>Make it Aの比較級 | Aにする<br>よりAにする<br>(Aには、possible,simple,easy,clearなど) | Make it possible to have IDs per request <br>Make it easy to check platform requirements in a command<br>Make it easier to debug the release script |
| make,sure | Make sure to A<br>Make sure (that) A | 必ずAするようにする |Make sure to reset default_url_options<br>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<br>Change to B | AをBに変更<br>Bに変更 | Change copyright to 2013<br>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<br>Convert to B | AをBに変換<br>Bに変換 | convert time to string<br>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<br>to avoid A | BするためにAを避ける<br>Aを避けるために | avoid method call to compact<br>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**
[英語前処理サーベイ](http://yusuke0h.hatenablog.com/entry/2013/10/15/123832)
[nltkとpytagcloudで英語のワードクラウド](http://moguranosenshi.hatenablog.com/entry/2014/09/14/nltk%E3%81%A8pytagcloud%E3%81%A7%E8%8B%B1%E8%AA%9E%E3%81%AE%E3%83%AF%E3%83%BC%E3%83%89%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89)
# 感想
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で)<br>取り除く  |  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 |