11
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

AIRS-LabAdvent Calendar 2021

Day 21

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

Last updated at Posted at 2021-12-20

1.はじめに

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

2.今回参考にさせていただいた資料

3.実行手順

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

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

4.実際にやってみよう

実際にコードを書いて実行してみます。
まずは、MeCabとUniDicをダウンロードします。

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

4-1.スクレイピング

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

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ファイルにしてデータを蓄積したかったのですが、うまくできなかったのでそのまま文字列に入れて形態素解析をしていきます。後日できたら更新していきます...。

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

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

何件か出力されましたが、長かったので割愛します...。

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

今回は、'名詞'、'動詞'、'形容詞'の3種類に分けます。
こちらの記事を参考に品詞別に分けました。

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単語を出力してみます。

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を使用して頻出率を可視化してみます。
こちらの記事を参考にしました。

# 出力されるワードの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

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

5.終わりに

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

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

11
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?