WordCloudでスクレイピングとテキストマイニングを体験

Pythonで機械学習を勉強していると、「Wordcloud」という言葉を目にする機会があると思います。WordCloudとは、文章の中から単語を選び出し、その出現頻度によって単語の大きさを変えながら並べる手法です。一見難しそうに見えますが、WordCloudを使うと簡単にテキストマイニングが実現できます。


例えば、下記の画像はPython StartLabの公式ページからデータを抽出して作成したものです。出現頻度の高い文字が一目でわかるように表示されますので、そのページで何を言いたいのかを簡単に理解することができます。

今回は、このようなWordcloudを簡単に実装する手法を学んでいきましょう。

WordCloudをインストールする

まずはpipコマンドでWordCloudをインストールします。

pip install wordcloud

同様に、WEBスクレイピングや言語処理に必要な以下のライブラリのインストールも行っておきましょう。

pip install requests
pip install beautifulsoup4 
pip install janome
pip install numpy
pip install pillow

マスク画像の準備

今回は指定した形で並べたいと思いますのでマスク画像を用意します。
白い部分がマスクされて、色のついている部分(今回は黒一色ですが)に文字が表示されます。
こんな感じの画像を使用しました。

これで記事の最初にあるような画像が作成できます。
このファイルをプログラムの直下にstartlablogo.pngという名前で保存します。

日本語フォントのパスを用意

日本語を使用するのに日本語フォントのパスを用意します。
.ttcという拡張子をファイル検索してください。
見つかったファイルのフルパスを保存しておきましょう。
フリーで使用できるフォントも数多く公開されていますのでそういったものをダウンロードしてきてもいいですね。

プログラムを書いて画像を保存

次に実際にWEBスクレイピングからWordcloudの実行までを行っていきます。以下がプログラムの全文です。

import requests
from bs4 import BeautifulSoup
from wordcloud import WordCloud
from janome.tokenizer import Tokenizer
from PIL import Image
import numpy as np
 
def scraping():
    reading_url= "https://startlab.jp/"
    html=requests.get(reading_url)
    parse=BeautifulSoup(html.text,'html.parser')
    parse_tag=parse.find_all("p")
    topics=[]
    for text_data in parse_tag:
        topics.append(text_data.getText())
    return topics
 
def purse():
    tokenizer=Tokenizer()
    words=[]
    topics=scraping()
    mask = np.array(Image.open('startlablogo.png'))
    
    for word in topics:
        tokens=tokenizer.tokenize(word)
        for token in tokens:
            pos=token.part_of_speech.split(',')[0]
            if pos in ['名詞']:
                words.append(token.base_form)
    text=' '.join(words)
    wordcloud=WordCloud(
        mask = mask,
        background_color='white',
        contour_width=2,
        contour_color='black',
        font_path='保存しておいたフォントのフルパスを記述',
        ).generate(text)
    wordcloud.to_file('./result.png')
 
purse()

分解して見ていきます。
まずはインターネット経由で文章の取得をする関数を設定します。今回はPythonStartlabのホームページから取り出しています。URLを変更すれば、他のWEBサイトから情報を取得することが可能になります。

def scraping():
    reading_url= "https://startlab.jp/"
    html=requests.get(reading_url)
    parse=BeautifulSoup(html.text,'html.parser')
    parse_tag=parse.find_all("p")
    topics=[]
    for text_data in parse_tag:
        topics.append(text_data.getText())
    return topics

次にWordCloudの処理をする関数です。

def purse():
    tokenizer=Tokenizer()
    words=[]
    topics=scraping()
    mask = np.array(Image.open('startlablogo.png'))
    
    for word in topics:
        tokens=tokenizer.tokenize(word)
        for token in tokens:
            pos=token.part_of_speech.split(',')[0]
            if pos in ['名詞']:
                words.append(token.base_form)
    text=' '.join(words)
    wordcloud=WordCloud(
        mask = mask,
        background_color='white',
        contour_width=2,
        contour_color='black',
        font_path='保存しておいたフォントのフルパスを記述',
        ).generate(text)
    wordcloud.to_file('./result.png')

WordCloudの実行部分に関しては、maskでマスクをするための画像情報のオブジェクトを指定します。background_colorで背景色を白に設定し、縁取りの太さをcontour_width=2と設定し、縁取りの色をcontour_color='black'で黒にしています。

あとはフォントのパスを指定してgenerateで生成したい文字列が入ったオブジェクトをしています。
wordcloud.to_fileで出力先ファイルを指定して実行すれば完成です。

このプログラムを実行するとカレントディレクトリにresult.pngという名前で最初に見た画像ファイルが出来上がります。とても簡単にできました!ぜひ、色々なサイトでWordcloudを使って遊んでみてくださいね。