英語で書かれた文章内の単語の出現回数をカウントする

# はじめに
テーブルデータを扱っていると、ときどき「備考」のようなカラムがあります。このようなカラムには文章が入っていることが多く、分析しにくいのですが、ますはどんな単語が入っているか、特徴的な単語があるかといった観点でアプローチすることがあると思います。ここでは英単語をスペースと改行分割して単語に分割し、出現回数をカウントします。

# 参考
- [単語の出現回数をpythonでカウントする](http://www.freia.jp/taka/blog/356/index.html)
- [collections --- コンテナデータ型](https://docs.python.org/ja/3/library/collections.html#collections.Counter)

# 環境
- python==3.6.7

# 手順
## データ準備
せっかくなので単語が沢山入っているデータを使います。
[Project Gutenberg](http://www.gutenberg.org/wiki/Main_Page)から夏目漱石の「坊つちやん」の英語版テキストをダウンロードします。このサイトはパブリックドメインの小説などを電子化して収集しているサイトです。

>プロジェクト・グーテンベルク（Project Gutenberg、略称PG）は、著者の死後一定期間が経過し、（アメリカ著作権法下で）著作権の切れた名作などの全文を電子化して、インターネット上で公開するという計画。1971年創始であり、最も歴史ある電子図書館。印刷の父、ヨハネス・グーテンベルクの名を冠し、人類に対する貢献を目指している。(出典：Wikipedia-プロジェクト・グーテンベルク)

[サイト](http://www.gutenberg.org/ebooks/8868)にアクセスし、「Plain Text UTF-8」をクリックしzipファイルをダウンロードします。解凍して中に入っていたファイルは`botchan.txt`とリネームしました。

<img width="1431" alt="スクリーンショット 2019-03-13 21.37.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/211712/b5895c34-953f-1099-e9d3-40754d10ecbb.png">


## 単語カウント
単語のカウントは以下のコードで

```python
# データ読み込み-------------------------
# ファイルを開く
with open('botchan.txt') as f:
    # ファイルの内容を読み出す
    data = f.read()  
    # data = data.lower()  # 小文字にするならこのタイミングが楽


# 単語カウント-------------------------
# 単語を数える辞書を作成
words = {}
# split()でスペースと改行で分割したリストから単語を取り出す
for word in data.split():
    # 単語をキーとして値に1を足していく。
    # 辞書に単語がない、すなわち初めて辞書に登録するときは0+1になる。
    words[word] = words.get(word, 0) + 1  #

# リストに取り出して単語の出現回数でソート
d = [(v, k) for k, v in words.items()]
d.sort()
d.reverse()

# 標準出力-------------------------
for count, word in d[:100]:
    print(count, word)

# 以下は出力
# 2480 the
# 1661 I
# 1427 to
# 1254 and
# 1237 of
# 1175 a
# 732 was
# 720 in
# 495 it
# 459 that
# 431 my
# 414 with
# 398 he
# 397 not
# 396 is
# 366 as
# 347 for
# 335 be
# 333 but
# 297 at
# 293 on
# 285 or
# 284 you
# 281 me
# 281 had
# 255 would
# 245 The
# 243 his
# 231 this
# 226 have
# 224 by
# 193 one
# 190 so
# 186 if
# 177 they
# 177 Red
# 171 from
# 166 all
# 160 about
# 145 were
# 139 no
# 137 him
# 136 there
# 134 like
# 134 are
# 122 out
# 118 when
# 116 which
# 115 Shirt
# 113 up
# 113 do
# 111 we
# 111 them
# 111 If
# 108 been
# 106 could
# 103 such
# 103 Porcupine
# 101 did
# 99 said
# 97 she
# 97 He
# 96 who
# 96 get
# 96 an
# 95 any
# 93 what
# 92 It
# 91 may
# 90 will
# 88 some
# 86 should
# 85 more
# 80 their
# 78 old
# 77 Project
# 76 than
# 75 only
# 75 her
# 73 going
# 73 go
# 71 make
# 69 two
# 69 But
# 68 school
# 67 house
# 67 asked
# 66 teacher
# 66 other
# 66 am
# 63 three
# 63 might
# 63 made
# 62 thought
# 62 me.
# 62 come
# 61 your
# 60 room
# 60 into
# 59 told
```

グラフ化してみました。

```python
import matplotlib.pyplot as plt

x = [d[:100][i][1] for i in range(0,100)]
y = [d[:100][i][0] for i in range(0,100)]

plt.figure(figsize=(17,5))
plt.bar(x, y)
plt.xticks(rotation=90)
plt.xlim(-1,100)
plt.show()
```

![ダウンロード.png](https://qiita-image-store.s3.amazonaws.com/0/211712/6ac25aa2-3cf6-23ee-94e7-161215331d60.png)

品詞で分類していないので、動詞や名詞など入り乱れています。出現回数上位は冠詞やbe動詞、多義をもつ動詞です。有意と思えるものは(177, Red)、(115, Shirt)、(103, Porcupine)、(77, Project)、(68, school)、(66, teacher)こんなところでしょうか。[あらすじ紹介サイト](https://honcierge.jp/articles/shelf_story/6171)によると、登場人物に「赤シャツ」なる人物がいます。Porcupineはヤマアラシという動物です（下画像 出典Wikipedia-Porcupine）。登場人物に「山嵐」と呼ばれている数学教師がいます。

![PorcupineCabelasSpringfield0511.jpg](https://qiita-image-store.s3.amazonaws.com/0/211712/88d2ae11-b357-1539-9098-f268a9d50477.jpeg)

主人公である坊ちゃんは、教師なのでteacherとschoolが出てくるのもわかります。ProjectはProject Gutenbergが引っかかっており、前処理をしていないために、本文以外に記載されているメタ的な情報も現れています。

## 追記
@shiracamus さんにご指摘いただきました。
単語カウントの部分は`collections.Counter`でも同じことができます。

```python
# 単語カウント-------------------------
import collections

# 引数にiterableオブジェクトまたはmappingオブジェクトを渡すと
# 要素と出現回数の組み合わせのオブジェクトを返す
counter = collections.Counter(data.split())

# 出現回数が大きい順に並べたタプルのリストを返す
# 例：[('the', 2480), ('I', 1661), ('to', 1427)]
d = counter.most_common()
```
最初の方法は(回数,単語)だったのに対し（例[(2480, 'the'), (1661, 'I'), (1427, 'to')]）、こちらの方法は(単語,回数)になります。

# おわりに
今回は単純な単語カウントを行いました。
実際はデータから不要な文章を削除したり、記号を削除したり、小文字に統一したりまだまだ必要な処理があります。