WordCloudで遊んでみた：病床六尺とアメリカ独立宣言

### 環境
OS: windows 10.0
python: 3.7.3
Anaconda: conda 4.10.1

### 実施日
2021/07/03

### インストール

Anaconda Prompt を管理者として実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/58a833a5-7ab0-3733-fb75-c5166cf19508.png)



```
pip install wordcloud
```

### インストール後の確認
wordcloud: 1.8.1


```
conda list
# packages in environment at C:\ProgramData\Anaconda3:
#
# Name                    Version                   Build  Channel
（中略）
wordcloud                 1.8.1                    pypi_0    pypi
（後略）
```
Jupyter notebook だと、入力 [1] はインストール前、入力 [2] はインストール後です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/10482996-b20e-e045-da09-b48b6f1843ad.png)

### インプットデータを決める
今日は7月3日だから、青空文庫から正岡子規が119年前（1902年）の同じ日に綴った「病床六尺」の記事をインプットデータにしてみます。

https://www.aozora.gr.jp/cards/000305/card43537.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/05ee4931-155b-d372-4398-85230e6fe359.png)

### 手動でデータを加工する

青空文庫の zip ファイルや html をダウンロードしてフラットなテキストに変換するところは今日の目的じゃあないので、ブラウザに表示された内容から目視で7月3日の記事を探してテキストエディタに流します。

https://www.aozora.gr.jp/cards/000305/files/43537_41508.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/744f6050-ce59-0fcd-edc8-1ef706156a7e.png)

そこからテキストファイルに出力します。
出力のときの文字コードセットは Shift-JIS(CP932) にしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/e85adb36-3522-0184-a4b1-21be3d9e4fcd.png)


### 加工したデータを読み込んで確認しておく

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/e75e4dcd-3d2b-9e8a-dc97-4b92cec0d2da.png)

データを格納した同じフォルダで確認してみます。

```
bun = ""
with open('43537_41508.txt') as f:
    for line in f.readlines():
        bun = bun + line.strip() 
print(bun)
```

大丈夫そうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/8f7407b6-a2ff-2aef-5add-a3c2516d4932.png)



### このままWordCloudにかけてみます
これをそのまま WordCloud に渡すとどうなるか試してみます。

```
import wordcloud
import matplotlib.pyplot as plt

wc = wordcloud.WordCloud(width=1000, height=600, background_color="white",
                        font_path=r"C:\windows\Fonts\meiryo.ttc")
wc.generate(bun)
plt.imshow(wc)
plt.axis("off")
```

エラーを出さずに動いてくれたけれど、英語のようにスペースで区切らないとこうなるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/ef3419eb-e8c2-785c-1e65-5229bf2434bf.png)



### 分かち書きでやってみる
じゃあ、分かち書きにしてそれを WordCloud に渡してやってみます。

まず分かち書きから。

```
import MeCab

wakati = MeCab.Tagger('-Owakati')
wakati_bun = wakati.parse(bun)
print(wakati_bun)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/9802aef5-8fc9-b71f-9cd6-f7aeb96dcea8.png)


WordCloud に渡すと、どうなるかな。

```
wc.generate(wakati_bun)
plt.imshow(wc)
plt.axis("off")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/bd5a0a68-ea72-eeb3-9b27-cbd9f1819cc1.png)



それらしくなりました。
でもやっぱり「の」とか「は」とかの助詞が多いから省きたい。
名詞と動詞だけが抜き出せればいいかな。形容詞もあったほうがいいかも。

### 形態素解析で分類してみる

```
tagger = MeCab.Tagger()
word_kaiseki = tagger.parse(wakati_bun)
print(word_kaiseki)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/fb10cd18-28b2-fad0-a953-21826e76d992.png)



```
日本	名詞,固有名詞,地域,国,*,*,日本,ニッポン,ニッポン
の	助詞,連体化,*,*,*,*,の,ノ,ノ
芝居	名詞,サ変接続,*,*,*,*,芝居,シバイ,シバイ
ばかり	助詞,副助詞,*,*,*,*,ばかり,バカリ,バカリ
見	動詞,自立,*,*,一段,連用形,見る,ミ,ミ
て	助詞,接続助詞,*,*,*,*,て,テ,テ
ゐる	動詞,自立,*,*,一段,基本形,ゐる,ヰル,イル
人	名詞,一般,*,*,*,*,人,ヒト,ヒト
が	助詞,格助詞,一般,*,*,*,が,ガ,ガ
西洋	名詞,一般,*,*,*,*,西洋,セイヨウ,セイヨー
の	助詞,連体化,*,*,*,*,の,ノ,ノ
芝居	名詞,サ変接続,*,*,*,*,芝居,シバイ,シバイ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
話	名詞,サ変接続,*,*,*,*,話,ハナシ,ハナシ
など	助詞,副助詞,*,*,*,*,など,ナド,ナド
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
聞い	動詞,自立,*,*,五段・カ行イ音便,連用タ接続,聞く,キイ,キイ
て	助詞,接続助詞,*,*,*,*,て,テ,テ
その	連体詞,*,*,*,*,*,その,ソノ,ソノ
仕組	名詞,一般,*,*,*,*,仕組,シクミ,シクミ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
違	名詞,一般,*,*,*,*,*
ふ	動詞,自立,*,*,五段・ラ行,体言接続特殊２,ふる,フ,フ
の	名詞,非自立,一般,*,*,*,の,ノ,ノ
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
驚く	動詞,自立,*,*,五段・カ行イ音便,基本形,驚く,オドロク,オドロク
事	名詞,非自立,一般,*,*,*,事,コト,コト
が	助詞,格助詞,一般,*,*,*,が,ガ,ガ
ある	動詞,自立,*,*,五段・ラ行,基本形,ある,アル,アル
。	記号,句点,*,*,*,*,。,。,。

（中略）

しかし	接続詞,*,*,*,*,*,しかし,シカシ,シカシ
これ	名詞,代名詞,一般,*,*,*,これ,コレ,コレ
も	助詞,係助詞,*,*,*,*,も,モ,モ
先	名詞,一般,*,*,*,*,先,サキ,サキ
づ	名詞,一般,*,*,*,*,*
芝居	名詞,サ変接続,*,*,*,*,芝居,シバイ,シバイ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
発明	名詞,サ変接続,*,*,*,*,発明,ハツメイ,ハツメイ
といふ	助詞,格助詞,連語,*,*,*,といふ,トイフ,トユウ
て	助詞,接続助詞,*,*,*,*,て,テ,テ
善から	形容詞,自立,*,*,形容詞・アウオ段,未然ヌ接続,善い,ヨカラ,ヨカラ
う	助動詞,*,*,*,不変化型,基本形,う,ウ,ウ
。	記号,句点,*,*,*,*,。,。,。
EOS
```

###名詞、動詞、形容詞だけを抽出する
カンマで区切った7番目の原型を採用するようにしてみます。
```
lines = word_kaiseki.split('\n')
selected = []
for line in lines:
    feature = line.split('\t')
    if len(feature) == 2:
        info = feature[1].split(',')
        hinshi = info[0]
        if hinshi in ('名詞', '動詞', '形容詞'):
            selected.append(info[6])
print(selected)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/8f584672-a983-4502-dfb7-4620a247dca1.png)

### あらためてWordCloudに渡してみる

品詞に分解した単語を半角スペースでつないで、WordCloudに渡します。

```
wc.generate(" ".join(selected))
plt.imshow(wc)
plt.axis("off")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/673af8c5-a1c3-f547-a935-f60002bea7df.png)

うん、いいんじゃないでしょうか。
ソースを整理して完成させてみます。
分かち書きにしておかなくても形態素解析はできるので、その箇所は省きます。

```
import wordcloud
import matplotlib.pyplot as plt
import MeCab

bun = ""
with open('43537_41508.txt') as f:
    for line in f.readlines():
        bun = bun + line.strip() 
wc = wordcloud.WordCloud(width=1000, height=600, background_color="white",
                        font_path=r"C:\windows\Fonts\meiryo.ttc")
tagger = MeCab.Tagger()
word_kaiseki = tagger.parse(bun)
lines = word_kaiseki.split('\n')
selected = []
for line in lines:
    feature = line.split('\t')
    if len(feature) == 2:
        info = feature[1].split(',')
        hinshi = info[0]
        if hinshi in ('名詞', '動詞', '形容詞'):
            selected.append(info[6])
wc.generate(" ".join(selected))
plt.imshow(wc)
plt.axis("off")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/ead6c487-d88e-5f46-6355-24911a40472f.png)

### 明日はどっちだ
明日の7月4日はアメリカの独立記念日なので

https://ja.wikisource.org/wiki/%E3%82%A2%E3%83%A1%E3%83%AA%E3%82%AB%E7%8B%AC%E7%AB%8B%E5%AE%A3%E8%A8%80

から口語の箇所をテキストにして

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/478a89bf-dc63-9e50-9808-2c36e4f4eae5.png)


```
with open('43537_41508.txt') as f:
```
のところを

```
with open('independent.txt') as f:
```

に差し替えて実行してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/e1c1a80d-8042-b0f9-f4b0-98475ed1e937.png)

うん、いい感じでできました。