janomeを使ってYahoo!ニュースの傾向を調べる

こんにちは!ポテトヘッド(@potato_head0809)です!

f:id:potato_head0809:20210116013642p:plain

前回はYahoo!ニュースのタイトルをスクレイピングして表示するということをしました。
potato-head0809.hatenablog.com



今回はそれを応用してYahoo!ニュースに出てくるワードの出現回数について調べてみたいと思います!



そのためにまずは「janome」をインストールする必要があります。



以下のコードを実行してください。



$ pip install janome




Janomeとは...??



ここで「janome」について少しだけ説明を...。


janome」とはPython形態素解析です。


日本語の文章を単語に分割したりできます!



ではまず全体のコードを見ていきましょう!


後ほど詳細に説明しますのでまずは見てみてください!

from bs4 import BeautifulSoup
import janome.analyzer as analyzer
import janome.tokenfilter as tokenfilter
import lxml
import requests


response = requests.get('https://news.yahoo.co.jp/')

soup = BeautifulSoup(response.text, "lxml")

tag_list = soup.find_all('div', class_="newsFeed_item_title")

title_list = []


for tag in tag_list:
   
    title_list.append(tag.text)

titles = ''.join(map(str, title_list))


words = {}

token_filters = [tokenfilter.POSKeepFilter('名詞'), tokenfilter.TokenCountFilter()]

a = analyzer.Analyzer(token_filters = token_filters)


for word, count in a.analyze(titles):
    
    words[word] = count

words = sorted(words.items(), key=lambda x:x[1], reverse=True)


for key, value in words:
   
    print(f'{key}: {value}')


これでファイルを実行すると単語と出現回数が出力されます。


では詳細に説明していきます!

from bs4 import BeautifulSoup
import janome.analyzer as analyzer
import janome.tokenfilter as tokenfilter
import lxml
import requests

こちらのコードは様々なライブラリをインポートしています。

「BeautifulSoup」は前回も使いましたね!これを使ってWebページから取得したテキストを解析してくれます。


「requests」も前回使用しました。Webページの情報を取得してくれます!


「lxml」は前回「html.parser」を使いましたが、それの代わりのようなものです!

新しくインストールする必要があるのでインストールしてください。

$ pip install lxml


そして「janome」ですね〜!

今回は「analyzer」と「tokenfilter」というものを使用します。


response = requests.get('https://news.yahoo.co.jp/')

soup = BeautifulSoup(response.text, "lxml")

tag_list = soup.find_all('div', class_="newsFeed_item_title")

こちらのコードは前回行った流れと同じです。


「requests」で情報を取得したいURLを指定し、それをresponseという変数に入れておきます。


そして「BeautifulSoup」を使って解析をしていきます。

先程の変数responseに.textを加えてテキストを取得し、今回は「lxml」を指定します。それをsoupという変数に入れます!


そして取得し解析したものを('div', class_="newsFeed_item_title")に絞って抽出します。


Webページの検証方法はこちらから!
potato-head0809.hatenablog.com




今回は複数取得したいのでfind_all()を使用しています!

その流れをtag_listという変数に入れます!

title_list = []


for tag in tag_list:
   
    title_list.append(tag.text)

まずは情報を格納するための空リストを作成します。


そして格納するための情報をfor文で取得し、append()で先程作ったリストに追加しています。


for文についてはこちら↓↓↓
https://potato-head0809.hatenablog.com/entry/2020/04/26/232416potato-head0809.hatenablog.com

titles = ''.join(map(str, title_list))

上記のコードはmap関数を使っています。


◯map関数とは...??



map関数の使い方としては


文法

map(関数, イテラブル)


第1引数に関数を入れます。

第2引数にイテラブルを指定します。


これによって指定したイテラブルを第1引数に指定した関数に渡して処理を行ってくれます。


では上記のコードを例に説明していきます!

titile_list(先程作成したリスト)をに入っている情報をstr(文字列型)に変換してくれています!


全てを文字列型に変換してからjoin()を使って全てを繋げています。

words = {}

上記のコードで空の辞書型を作っています。


token_filters = [tokenfilter.POSKeepFilter('名詞'), tokenfilter.TokenCountFilter()]

a = analyzer.Analyzer(token_filters = token_filters)

「TokenCountFilter」を使うと単語出現頻度を数えられます!

「tokenfilter.POSKeepFilter('名詞')」とすることで名詞に絞っています。

この流れをtoken_filtersという変数に入れてます。

for word, count in a.analyze(titles):
    
    words[word] = count

ここでもfor文です!!

引数にtitlesを指定してそれらを「単語:出現回数」という形にしています!


words = sorted(words.items(), key=lambda x:x[1], reverse=True)

こちらはsorted()で並び替えをしています!


「words.items()」で先程の辞書型を指定します。


「key=lambda x:x[1]」でkey引数というものを使って特定のキーに従ってソートするようにしています。

今回の場合は「単語:出現回数」の「出現回数」の方ですね!


lambda 関数というのは名前の無い関数です。

特にdefで定義するまでもない(失礼)関数など簡単に使いたい時などに使用すると便利です!


lambda関数についてもう少し見たい方はこちらへ!!
potato-head0809.hatenablog.com




デフォルトは昇順になっていますので、reverseでTrueを指定して、降順にしています!

for key, value in words:
   
    print(f'{key}: {value}')


そして最後は出力です。

print(f'{}:{})というようにfをつけることで変数を指定してそのまま出力できます。

a = 'Potato'

b = 'Head'

print(f'{a} and {b}')

#出力結果 
Potato and Head

興味が湧きましたらぜひ調べてみたいURLから情報を取得してきて解析してみてください!