log_in_buttonとlogin_button、どちらが正しい？　それ、Ngram Viewerに聞こう

ログインボタンって、変数名にすると `log_in_button` かな、 `login_button` かな？

![login-button.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305052/87fbd052-0354-2ceb-7c69-66b5316d3675.png)

`login_button` だね。Google先生、ありがとう。

`user_data` の配列作らなきゃ。名付けて…… `user_datas`！

![data.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305052/e1d6ecbf-7a6f-83e8-31c3-16590a15fe35.png)

あ、dataはsつけちゃダメだったね。Google先生、ごめんなさい。

# [Google Books Ngram Viewer](https://books.google.com/ngrams)とは

[Google Books Ngram Viewer](https://books.google.com/ngrams) は、Googleが公開している検索ツール。
名前からも分かるとおり、普通のGoogle検索とは違って、「本のフレーズ検索」に特化したツールである。
数百万冊にも及ぶ本をスキャン・構文解析して、どんなフレーズがどんな頻度で出現するかのトレンドを検索できるようにするという、まさにGoogleスケールのプロジェクトだ。
（Ngram (エヌ・グラム) というのは単語の連なりとか、フレーズとかをカッコつけて言っただけのものなので、別に身構える必要はない。）

例えば、次のグラフ:

![ai-vs-ml.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305052/ef9e205b-00fb-fe61-898c-a34d6273ca9c.png)
([artificial intelligence vs machine learning](https://books.google.com/ngrams/graph?content=artificial+intelligence%2Cmachine+learning&year_start=1970&year_end=2019&corpus=26&smoothing=3&direct_url=t1%3B%2Cartificial%20intelligence%3B%2Cc0%3B.t1%3B%2Cmachine%20learning%3B%2Cc0#t1%3B%2Cartificial%20intelligence%3B%2Cc0%3B.t1%3B%2Cmachine%20learning%3B%2Cc0))

Artificial intelligence (人工知能) というフレーズは1980年代から登場頻度が上がりはじめ、1988年頃にピークをむかえたあとに10年ほど横ばいを続け、2012年頃からまた右肩上がりになっていると分かる。
時を同じくして、machine learning (機械学習) というフレーズがartificial intelligenceを追い抜いて、急成長を遂げているのも分かる。
このように、時系列に沿って言葉やフレーズのトレンドを比べるときに使うのが主な使い方だが、コードを書いているときによくある「どっちの英語が正しいんだっけ？」問題をサクッと解決してくれるツールであったりもする。

# 実用例

## [information vs informations](https://books.google.com/ngrams/graph?content=information%2Cinformations&year_start=2005&year_end=2019&corpus=26&smoothing=3&direct_url=t1%3B%2Cinformation%3B%2Cc0%3B.t1%3B%2Cinformations%3B%2Cc0)

![information.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305052/09d693df-355e-df63-06cb-78b381d376bf.png)
（[information vs informations](https://books.google.com/ngrams/graph?content=information%2Cinformations&year_start=2005&year_end=2019&corpus=26&smoothing=3&direct_url=t1%3B%2Cinformation%3B%2Cc0%3B.t1%3B%2Cinformations%3B%2Cc0)）

Dataと同じく、情報を専門に扱う人間にとって切っても切れない関係の単語だが、不可算名詞なのでinformationsとはならない。

## [user name vs username](https://books.google.com/ngrams/graph?content=user+name%2Cusername&year_start=2005&year_end=2019&corpus=26&smoothing=3&direct_url=t1%3B%2Cuser%20name%3B%2Cc0%3B.t1%3B%2Cusername%3B%2Cc0)

![username.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305052/ab2ebf3d-0f76-a0cf-b1b4-cf2a4604a972.png)
（[user name vs username](https://books.google.com/ngrams/graph?content=user+name%2Cusername&year_start=2005&year_end=2019&corpus=26&smoothing=3&direct_url=t1%3B%2Cuser%20name%3B%2Cc0%3B.t1%3B%2Cusername%3B%2Cc0)）

大きな差はあるものの、user nameというフレーズも出現することにはするので、こちらが間違っているとは言い難い。
既存のコードで `user_name` とか `userName` とか使われていたらそれにならっても良さそうかな。
使われていなかったら、長いものに巻かれて `username` としておこう。

## [WebView vs Webview](https://books.google.com/ngrams/graph?content=WebView%2CWebview&year_start=2005&year_end=2019&corpus=26&smoothing=3&direct_url=t1%3B%2CWebView%3B%2Cc0%3B.t1%3B%2CWebview%3B%2Cc0)

![web_view.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305052/fc1bf08e-5c71-1c39-72f6-641e0639df56.png)
（[WebView vs Webview](https://books.google.com/ngrams/graph?content=WebView%2CWebview&year_start=2005&year_end=2019&corpus=26&smoothing=3&direct_url=t1%3B%2CWebView%3B%2Cc0%3B.t1%3B%2CWebview%3B%2Cc0)）

大文字・小文字の区別をして検索することもできるので、こういう比較もできる。

## [meta data vs metadata](https://books.google.com/ngrams/graph?content=meta+data%2Cmetadata&year_start=2005&year_end=2019&corpus=26&smoothing=3&direct_url=t1%3B%2Cmeta%20data%3B%2Cc0%3B.t1%3B%2Cmetadata%3B%2Cc0)

![meta-data.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305052/5cc538cb-eca5-7439-8d14-8fb4cb6c6397.png)
（[meta data vs metadata](https://books.google.com/ngrams/graph?content=meta+data%2Cmetadata&year_start=2005&year_end=2019&corpus=26&smoothing=3&direct_url=t1%3B%2Cmeta%20data%3B%2Cc0%3B.t1%3B%2Cmetadata%3B%2Cc0)）

ぼく「メタデータは1単語だから、スネークケースなら `metadata` 、キャメルケースなら `Metadata` だね。」
SQLAlchemy「は？」

```python
from sqlalchemy import *

metadata = MetaData()
```
([抜粋: SQLAlchemy 1.4 Documentation](https://docs.sqlalchemy.org/en/14/core/metadata.html#module-sqlalchemy.schema)）

ライブラリがこういう変化球を投げてきたら、思考停止してそっちに合わせるのが無難かな。

## [referrer vs referer](https://books.google.com/ngrams/graph?content=referrer%2Creferer&year_start=2005&year_end=2019&corpus=26&smoothing=3&direct_url=t1%3B%2Creferrer%3B%2Cc0%3B.t1%3B%2Creferer%3B%2Cc0#t1%3B%2Creferrer%3B%2Cc0%3B.t1%3B%2Creferer%3B%2Cc0)

![referrer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305052/8f58c3a4-91c1-4fb8-7734-f26dfe7da758.png)
（[referrer vs referer](https://books.google.com/ngrams/graph?content=referrer%2Creferer&year_start=2005&year_end=2019&corpus=26&smoothing=3&direct_url=t1%3B%2Creferrer%3B%2Cc0%3B.t1%3B%2Creferer%3B%2Cc0#t1%3B%2Creferrer%3B%2Cc0%3B.t1%3B%2Creferer%3B%2Cc0)）

悪名高きHTTPヘッダ `Referer` 。
間違ったスペルのまま仕様が通ってしまったからといって、あなたまでスペルを間違える必要はないのでは？

## [an SQL vs a SQL](https://books.google.com/ngrams/graph?content=an+SQL%2Ca+SQL&year_start=1980&year_end=2019&corpus=26&smoothing=3)

![a-sql.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305052/96233bd4-d3d5-ce9a-aada-862a3effaa35.png)
（[an SQL vs a SQL](https://books.google.com/ngrams/graph?content=an+SQL%2Ca+SQL&year_start=1980&year_end=2019&corpus=26&smoothing=3)）

SQLは1文字ずつ「エス・キュー・エル」と発音するのが僕の周りでは主流だが、英語の講演とかYouTube動画とかを聞いているとほとんどの人が「シークエル (sequel)」と発音する。
母音から始まる発音の場合 (`an SQL` ) と子音から始まる発音の場合 (`a SQL`) の頻度を比較すると、上のような面白い結果になった。
1980年から1995年の間は「エス・キュー・エル」の発音が優勢だったが、1995年頃から急激に「シークエル」の発音の頻度が上昇し、それから今に至るまで優勢を保っている。
もっとも、最近では大きな差はなくなってきているが。

つまり、結局どちらが正しいか？
味気ない結論だが、「文化・環境に合わせる」のが正解だろう。
変数名に `a` とか `an` の冠詞をつけるのは一般的でないし、英語でコメントを書くとき以外は悩む必要もなさそうだが。

# あとがき

ここで紹介した例は2つのフレーズの比較のみだが、3つ以上の比較もできるし、その他いろいろな検索オプションがあるので、色々と実験してみるのもいいだろう:

![code.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305052/ed462b43-6bc7-a507-4d63-3d55354e569d.png)
([Python・JavaScript・Java・C・Rubyの比較](https://books.google.com/ngrams/graph?content=C+code%2CJava+code%2CPython+code%2CJavaScript+code%2CCOBOL+code%2CRuby+code&year_start=2005&year_end=2019&corpus=26&smoothing=3&direct_url=t1%3B%2CC%20code%3B%2Cc0%3B.t1%3B%2CJava%20code%3B%2Cc0%3B.t1%3B%2CPython%20code%3B%2Cc0%3B.t1%3B%2CJavaScript%20code%3B%2Cc0%3B.t1%3B%2CCOBOL%20code%3B%2Cc0%3B.t1%3B%2CRuby%20code%3B%2Cc0#t1%3B%2CC%20code%3B%2Cc0%3B.t1%3B%2CJava%20code%3B%2Cc0%3B.t1%3B%2CPython%20code%3B%2Cc0%3B.t1%3B%2CJavaScript%20code%3B%2Cc0%3B.t1%3B%2CCOBOL%20code%3B%2Cc0%3B.t1%3B%2CRuby%20code%3B%2Cc0)）

こういうグラフを作って、Pythonの伸びっぷりを視覚化したりするのも一興。
あくまで、「英語圏の出版業界における伸び」だが。

また、グラフの下の `Search in Google Books` 欄のリンクから、検索したフレーズが実際に本の中で使われている部分を見に行くこともできる。
工夫次第で色々な使い方ができるので、あなたの情報探索の道具箱に入れておくことをオススメする。