Google Colaboratoryで形態素解析してみた

# 1.はじめに
社会人一年目のyappiです。今回はGoogle Colaboratoryを使ってGoogle Newsのトップニュースをスクレイピングして形態素解析してみました。

# 2.今回参考にさせていただいた資料
- [Google Colab環境でWebスクレイピングを行うためのメモ。スクレイピングした情報をGoogle Driveに書き込むまでの流れ](https://qiita.com/safa/items/90c370ebefbecbcfecac)  
- [pythonでスクレイピングを行う方法](https://techacademy.jp/magazine/18875)  
- [pythonのlxmlライブラリの使い方](https://techacademy.jp/magazine/19063)  
- [pythonを用いたcsvファイルの書き込み及び読み込み](https://okazukun5.com/122/)
- [[python]MeCabでだれでも簡単にできる分かち書きをする方法](https://sleepless-se.net/2018/08/24/python-mecab-wakatigaki/)
- [Beautiful Soup のfind_all( ) と select( ) の使い方](https://gammasoft.jp/blog/difference-find-and-select-in-beautiful-soup-of-python/)
- [Pythonで文章中の頻出単語を抽出する方法](https://analysis-navi.com/?p=2167)
- [python:Google Colaboratoryでワードクラウドを作る](https://zenn.dev/barusu/articles/3061889e82b33b)

# 3.実行手順
1. Google Newsからトップニュースをスクレイピング
1. ~~スクレイピングしたものをcsvファイルにしてドライブに格納~~
1. ~~格納されたcsvファイルのデータを読み取って、形態素解析~~
1. 品詞別にカウントを行い、最も多く出現した単語を表示
1. WordCloudを使用して頻出率を可視化

※csvファイルで保存できなかったため、そのまま文字列に入れて形態素解析をしていきます。

# 4.実際にやってみよう
実際にコードを書いて実行してみます。 
まずは、MeCabとUniDicをダウンロードします。  

```ruby
!pip install mecab-python3
!pip install unidic
!python -m unidic download
```

## 4-1.スクレイピング
今回はGoogle Newsをスクレイピングしていきます。 
ページから検証を行い、取得したい要素を調べて設定します。  

```ruby
import requests
from bs4 import BeautifulSoup

url = "https://news.google.com/?hl=ja&gl=JP&ceid=JP:ja"

r = requests.get(url)
soup = BeautifulSoup(r.text, 'html.parser')
# 今回取得するのは'a'の要素とclassが'DY5T1d'
elems = soup.find_all('a', class_='DY5T1d')
```

## 4-2.取得した値を文字列に変換
csvファイルにしてデータを蓄積したかったのですが、うまくできなかったのでそのまま文字列に入れて形態素解析をしていきます。後日できたら更新していきます...。

```ruby
news = ''
for e in elems:
  news += e.getText() + '\n'

print(news)
# 大阪ビル放火の容疑者、先月下旬にガソリン購入…周到に準備か
# 大阪北新地ビル放火・谷本容疑者の兄が涙ながらに「罪を償ってほしい」 母が亡くなってから…（スポニチアネックス） - Yahoo!ニュース
# 大阪のビル放火殺人事件 防犯カメラに容疑者とみられる姿
# 容疑者、先月ガソリン購入 居住先近くのＧＳで 大阪・北新地ビル火災
# ...
# イヤフォンを次のステージへ Acoustune初のフラッグシップ「SHO-笙-」の衝撃
# 貼るコタツ。デスク用パネルヒーターを買って「足元サムイ」にさよなら
# 世界をだませ。『アリスギア』×『シュタゲ』の細かすぎるこだわりポイント10選…いくつ気づいてた？
```
何件か出力されましたが、長かったので割愛します...。

## 4-3.形態素解析して品詞ごとに分類

今回は、'名詞'、'動詞'、'形容詞'の3種類に分けます。 
[こちら](https://analysis-navi.com/?p=2167)の記事を参考に品詞別に分けました。

```ruby
import MeCab
import unidic

mecab = MeCab.Tagger('')
node = mecab.parseToNode(news)
words = []
while node:
  cotegory = node.feature.split(',')[0]
  word = node.surface
  if cotegory in ['名詞', '動詞', '形容詞']:
    origin = word
    words.append(origin)

  node = node.next
```

## 4-4.単語をカウント
単語のカウントを行なって上位30単語を出力してみます。

```ruby
import collections
count = collections.Counter(words)
# 最も使われている回数が多い単語
print(count.most_common(30))
# 結果かなり多かったので一部抜粋します。
#[('ニュース', 10), ('Yahoo', 8), ('月', 8), ('2021', 6), ('年', 6), ('12', 6), ('ビル', 5), ('容疑', 5), ('20', 5), ('台風', 5), ('大阪', 4), ('オランダ', 4), ('1', 4), ('香港', 4), ('フィリピン', 4), ('号', 4), ('し', 4), ('30', 4), ('米軍', 4), ('感染', 4), ('放火', 3), ('先月', 3), ('ガソリン', 3), ('購入', 3), ('世界', 3), ('ロック', 3), ('ダウン', 3), ('コロナ', 3), ('株', 3), ('投票', 3)]
```

## 4-5.単語の頻出率を可視化
WordCloudを使用して頻出率を可視化してみます。 
[こちら]((https://zenn.dev/barusu/articles/3061889e82b33b))の記事を参考にしました。

```ruby
# 出力されるワードのfont styleをダウンロード
!apt-get -y install fonts-ipafont-gothic
# 可視化
import matplotlib.pyplot as plt
from wordcloud import WordCloud
import random
import codecs
fpath = './fonts/IPAfont00303/ipagp.ttf'

def show_word_cloud(ws):
    ws_show = []
    for i in range(len(ws)):
        word_times = ws[i][1]
        if word_times>0:
            for j in range(word_times):
                ws_show.append(ws[i][0])
    random.shuffle(ws_show)
    # スペース区切り
    texts = ' '.join(ws_show)
    
    # 描画
    wc = WordCloud(background_color="white", font_path=fpath, 
                   width=820, height=312, regexp=r"[\w']+").generate(texts)
    plt.figure(figsize=(15,12))
    plt.imshow(wc)
    plt.axis('off')
    plt.show()

# 上位40単語を可視化
show_word_cloud(count.most_common(40))
```

結果は、![スクレイピング.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/746815/2755fa70-fd6e-fd87-06f5-f4d2e2fba5d0.png)

ちょっと情報の加工が必要そうですが...。一応無事出力されました。

# 5.終わりに
今回、初めてスクレイピングや形態素解析、WordCloudを使用して可視化してみました。様々な記事を参考にさせていただいて、無事実装することができました。参考にさせていただいた記事の投稿者のみなさまありがとうございます。
今後は、不要な情報の削除などを行なってその後に解析を行うことやYahooニュースなど様々なニュースから情報取得してトレンドを探し出すなどを行なっていきたいと思います。また、csvファイルに保存をするなどをして分析の蓄積なども行なっていきたいと思います。

最後になりますが、今回の記事において、至らない点や間違いなどもあるかと思いますが、その際はぜひご指摘いただけますでしょうか。また、これから学習を始める方の参考になれば幸いです。