【Python】URLからブログ記事の本文を取得しワードクラウドを作成する

みなさん,こんにちは。
シンノユウキ(shinno1993)です。

今回は,URLから本文を取得し,それをワードクラウドとして表示するというスクリプトを紹介したいと思います.Pythonを用いて,JanomeやWordCloudなどのライブラリを活用し,実装していきたいと思います.

では行きましょう!

「ワードクラウド」って?

ワードクラウドを知らないという方のために,少し解説しておきます.ワードクラウドというのは,テキストマイニングの結果を表示する際の魅せ方の1つで,単語の出現頻度などから,単語の大きさや色を決定し,それを並べたものです.

と,つらつらと説明するよりは,実際に見てもらった方が早いと思います.

今回の記事を読んでいただくと,以下のようなワードクラウドを作成できるようになります.

このワードクラウドは,以下のブログ記事の本文を解析した結果です.

【Python/Keras】VGG16をFine-tunignして100種類の食事画像を認識してみよう!【UECFOOD-100】
以前の記事でVGG16を用いて画像を認識・分類する方法を紹介しました。 しかし栄養士である私としては,やはり食事画像認識をやりたいなーと思っていまいた。 ということで,VGG16をFine-tuningし,食事画像を認識できるようなプログラ...

画像や学習,コード中に頻繁に出現するimportなどが目に付きますね.その他,modelだったり,VGG,下の方にはUECFOODという単語も見受けられます.文章をこのように図示することで,特徴を見つけられるのでは?というアプローチがワードクラウドです.

では,さっそくPythonでこれを作成する方法を紹介していきます.

 

使うライブラリの紹介

今回使用するライブラリを紹介します.

from bs4 import BeautifulSoup
import requests as req
from wordcloud import WordCloud
from janome.tokenizer import Tokenizer
import matplotlib.pyplot as plt
  • BeautifulSoup:HTMLなどから特定の要素を抽出するライブラリ
  • requests:HTTP通信を行うためのライブラリ
  • WordCloud:ワードクラウドを作成するためのライブラリ
  • janome:形態素解析を行うためのライブラリ

これらのライブラリの使い方などについては,後ほど解説しますので,とりあえずインストール・インポートしておいてください.

 

URLから本文を取得しよう!

まずは,ワードクラウドを作成するための本文を取得しましょう.テキストファイルなどから取得してももちろん問題ないのですが,今回は特定のURLから取得したいと思います.

以前,Pythonを用いて,URLからブログ記事の本文を取得する記事を書きました.詳しくはこちらをご参照ください:

その部分のコードは以下のようになります:

url = 'https://www.y-shinno.com/vgg16-finetuning-uecfood100/'
html = req.get(url).content
soup = BeautifulSoup(html, 'html.parser')
text = soup.find(class_='entry-content').get_text()

これで,本文を取得できます.

soup.find(class_='entry-content').get_text()の部分を変更することで別のブログサービスなどでも本文を取得できます.違うURLで試したいという方は,この部分を変更してください.

 

本文を“わかち書き”に変えよう!

次に,ワードクラウドを作成するために,本文をわかち書きの形に変更します.分かち書きというのは,たとえば英語のように,単語と単語の間にスペースが挿入された書き方になります.

ワードクラウドを作成するためには,わかち書きの形式にする必要があります.英語の場合だと何の苦労もないのですが,日本語の場合は単語と単語の区切りが曖昧なので,それはこちらで処理する必要があります.

そして,それをどのように行うのか.これは,Pythonのライブラリ:Janomeを使います.Janomeは以前の記事で解説しています.詳しくはそちらを参照してください:

Janomeは形態素解析を行うためのライブラリです.これにより,文章を単語ごとに区切ることができます.また,品詞を判別することができるので,名詞以外の接続詞や副詞など,特別そのブログの特徴を表していないと考えられる単語を除外することもできます.

その部分のコードは以下のようになります:

t = Tokenizer()
tokens = t.tokenize(text)

words = []

for token in tokens:
    word = token.surface
    part_of_speech = token.part_of_speech.split(',')[0]
    part_of_speech2 = token.part_of_speech.split(',')[1]
    if part_of_speech == "名詞":
        if(part_of_speech2 != "非自立") and (part_of_speech2 != "代名詞"):
            words.append(word)

word_list=" ".join(words)

本文から名詞でかつ非自立でも代名詞でもない単語を抽出し,それを変数word_listにスペース区切りで結合しています.これにより,本文をわかち書きにして,なおかつ重要度の高い可能性の高い単語を抽出できました.

 

ワードクラウドを描こう!

では,いよいよワードクラウドを描いていきましょう.これには,ライブラリ:WordCloudを使用します.

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

wordcloud = WordCloud(
    font_path='C:\Windows\Fonts\meiryo.ttc',
    width=2000, height=1000, 
    background_color="white",
).generate(word_list)

plt.figure(figsize=(100,50))
plt.imshow(wordcloud)
plt.axis("off")
plt.show()

これを実行することで,いい感じのワードクラウドを作成することができます.WordCloudの引数を変更することで調整できます.

1つ注意することは,font_pathです.これを指定しないと日本語は文字化けしてしまいます.私の環境では,C:\Windows\Fonts\に格納されていますが,Macなど別の環境の方はこちらを変更してください.

これでワードクラウドを作成することができました!

 

まとめ

今回は,URLからブログ記事の本文を取得し,それのワードクラウドを作成する方法を紹介しました.ビジュアル化に特化した方法なので,詳しいテキスト解析の結果とはいえませんが,インパクトのある魅せ方ができるのではないでしょうか.ぜひお試し下さい!

タイトルとURLをコピーしました