青空文庫の自然言語処理をサクッとやる


#実行環境
今回はGoogle Colaboratoryで実行します。
もちろんJupyterでも同じことはできるのですが、手軽に形態素解析ツールのMeCabが使える上、
クラウド上で実行するので計算も早いし使うデータの容量もほぼ気にならないのでColabをオススメします。



#青空文庫データの取得
Web上からスクレイピングして取得する方法でもいいのですが、
git cloneでgit上からもデータを楽に取得できます。

```
!git clone --branch master --depth 1 https://github.com/aozorabunko/aozorabunko.git
```

#MeCabのインストール
形態素解析ツールMeCabをインストールします。
こちらの記事を参考にさせていただきました。

[ColaboratoryでMeCabを使えようにする。](https://qiita.com/pytry3g/items/897ae738b8fbd3ae7893)

Colabではこちらのコードを打つだけでMeCabが使えるようになります。

```
!apt install aptitude
!aptitude install mecab libmecab-dev mecab-ipadic-utf8 git make curl xz-utils file -y
!pip install mecab-python3==0.7
```

早速試しにMeCabで形態素解析をしてみましょう。

```python
import MeCab
mecab = MeCab.Tagger("-Ochasen")
text = mecab.parse ("すもももももももものうち")
print(text)
```
実行結果

```
すもも	スモモ	すもも	名詞-一般		
も	モ	も	助詞-係助詞		
もも	モモ	もも	名詞-一般		
も	モ	も	助詞-係助詞		
もも	モモ	もも	名詞-一般		
の	ノ	の	助詞-連体化		
うち	ウチ	うち	名詞-非自立-副詞可能		
EOS
```
見事に難解な（？）この文章の解析をしてくれました。

分かち書きだけ抽出したい場合はTaggerメソッドの引数を"-0wakachi"にします。

```python
mecab_wakachi = MeCab.Tagger("-Owakati")
text_2 = mecab_wakachi.parse ("すもももももももものうち")
print(text_2)
```

実行結果

```
すもも も もも も もも の うち 
```

#ドライブをマウント
次に、Colabのプログラム上から青空文庫のデータを読み込む為にGoogleドライブへのマウントを実行します。
出てくるURLに飛ぶとアカウントの認証画面が出てくるので、アカウントを選択し認証コードを貼り付けて実行してください。

```python
from google.colab import drive
drive.mount('/content/drive')
```

画面左の「ファイル」メニューに、drive上に保存したデータが表示されてアクセスできるようになります。
<img width="662" alt="Screenshot at Jul 28 23-08-17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445029/e449dcf1-55c9-c4cf-257b-9351f880bbb7.png">

#解析するファイルを選択

ダウンロードした'aozorabunko'ディレクトリの中の'cards'ディレクトリに小説のデータがhtml
などの形式で保存されています。
解析したいhtmlのパス(小説が書いてあるファイルのパス)を指定します。
今回は芥川龍之介の「羅生門」で解析してみます。

```python
path_to_html='aozorabunko/cards/000879/files/127_15260.html'
```

#BeautifulSoupでスクレイピング
BeautifulSoupを使ってhtmlファイルの中から小説の本文のみを取得します。

```python
from bs4 import BeautifulSoup

with open(path_to_html, 'rb') as html:
  soup = BeautifulSoup(html, 'lxml')

main_text = soup.find("div", class_='main_text')

#ルビが振ってあるのを削除
for yomigana in main_text.find_all(["rp","h4","rt"]):
  yomigana.decompose()
  
sentences = [line.strip() for line in main_text.text.strip().splitlines()]

print(sentences)
```
実行結果

```
['ある日の暮方の事である。一人の下人が、羅生門の下で雨やみを待っていた。', '広い門の下には、...(略)]
```
リスト形式で本文を取得できました。これを解析の為にstr型に変換します。

```python

rashomon_text=','.join(sentences)
```

#WordCloud実行の為の準備


つぎに、WordCloudを用いて「羅生門」の本文の特徴を可視化してみましょう。
実行の為に、本文を分かち書きします。

```python

mecab_wakachi = MeCab.Tagger("-Owakati")
rashomon_text_wakachi = mecab_wakachi.parse(rashomon_text)
print(rashomon_text_wakachi)
```
実行結果

```
ある 日 の 暮方 の 事 で ある 。 一 人 の 下人 が 、 羅生門 の 下 で 雨 やみ を 待っ て い た 。 , 広い 門 の 下 に は 、 この 男 の ほか に 誰 も ...(略)
```

#WordCloudの取得・実行
WordCloudをインストールします。

```
!pip install wordcloud
```

WordCloudの画像を表示します。

```python

from wordcloud import WordCloud
import matplotlib.pyplot as plt
f_path = '/usr/share/fonts/opentype/ipafont-gothic/ipagp.ttf' #日本語フォントの取得
wordcloud = WordCloud(background_color="white", 
                      font_path=f_path, 
                      width=700, 
                      height=600).generate(rashoumon_text_wakachi)
plt.figure(figsize=(12,10))
plt.imshow(wordcloud)
plt.axis("off") #メモリの非表示
plt.show()
```
![ダウンロード (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445029/4fa1fbb3-26b5-96a6-0ad6-46cd118fefa7.png)

WordCloudが表示されました(^o^)