ワードクラウド_3

【Webブラウザで15分】見る人の心に残るワードクラウド作成手順を徹底解説【現役エンジニアのPythonチュートリアル】

こんにちは、三年坊主です。
今回は「Pythonチュートリアル」第1弾として、テキスト情報から印象に残るコンテンツを作成する手順を解説します。
「ワードクラウド」と呼ばれる方法を使ってこのような画像を作ります。


数か月前から投資とエンジニア関係のブログを書き始めて実感していますが、文章だけを一生懸命書いても・・・思った以上に人に読まれないですよね。
いろいろと改善できる点はありますが、例えば印象に残る見出し画像を作れたら、文字の羅列だけだと興味を持てなくてスキップしていた読者さんが、ひょっとしたら記事の中身を少し読んでくれるかもしれません。

ブログに限らず、Qiita記事のURLやLINEグループの会話など、テキスト情報は身の回りにあふれています。
それらを活用して、手元のパソコンで環境構築不要・Webブラウザだけで、パッと見た人の印象に残るコンテンツを作る手順を説明します。

【目次】

(1) チュートリアルの成果物:ワードクラウドとは?
(2) このチュートリアルを読んでほしい人
(3) 必要なもの・学習する内容
(4) Google DriveでPythonの実行環境を用意する(Google Colaboratory)
(5) 日本語フォントと必要なライブラリをインストール
(6) ワードクラウド作成(準備編)
(7) ワードクラウド作成(実行編):Qiita記事とLINEグループ会話を例に
(8) ワードクラウド作成(応用編):より印象に残るコンテンツに仕上げる
(9) おわりに
※ 購入者特典(コピペできるGoogle Colaboratoryデータと質問サポート)

※チュートリアルに対応したGoogle Colaboratoryデータへのリンクと、チュートリアルの内容に関する質問にお答えするサポートの詳細を、購入者特典として末尾に記載していますので、よければご活用ください。

注意:2018/12/9~25、割引価格100円で販売していました。

追記1(2018/12/20):販売開始から5日で10部突破しました!ありがとうございます!

追記2(2018/12/20):割引価格100円での販売は2018/12/25までとさせていただきます。


(1) チュートリアルの成果物:ワードクラウドとは?

ワードクラウドは、文章中の単語を複数使って、頻度に応じて大きさや色などを変えて表現する方法のことです。
下の図を見てもらうと分かりやすいですが、多く出現する単語が大きく表示されるので、長い文章を全部読まなくても大まかな内容が理解できたり、単なる文字の羅列よりも印象に残りやすいメリットがあります。

この画像は、LINEグループのトーク内容をテキスト情報として使ったのですが、ブログに関するグループだけあって「記事」「ブログ」などが大きく表示されていたり、「FX」「仮想通貨」「ふるさと納税」などの話題もあったことなど、一目見るだけで分かります。


(2) このチュートリアルを読んでほしい人

今回のチュートリアルは、このような方に読んでいただけると嬉しいです。

・Pythonの基礎を勉強したので、次は何か作ってみたいと思っている人
・手元にあるテキスト情報をワードクラウドで可視化してみたい人
・画像と組み合わせて、見る人の印象に残るワードクラウドを作りたい人

興味はあるけど、Pythonの基礎が不安だな・・・」と感じている人は、Progateなどを使って復習してみましょう。


(3) 必要なもの・学習する内容

今回のチュートリアルに必要なものをリストアップしました。
手持ちのパソコンでPythonの環境構築は不要です。

・Chromeブラウザ
・普段お使いのGoogleアカウント(別で用意してもOK)
・ワードクラウドを作りたいテキスト(例:LINEグループのトーク内容、Qiita記事のURL)
・マスキングに使うマスク画像(任意)


「マスク画像」は、ワードクラウドで単語を表示する・しない位置を決めるための画像のことで、マスク画像の白い部分=単語を表示しない、それ以外の部分=単語を表示する、という風に使います。
シルエット素材サイトから画像を利用させてもらうのもありですね。

冒頭のサンプルでは、資産運用ブログBANK ACADEMYで有名なキャラクター「ペンタごん」画像を(小林亮平さん承諾の上で)お借りして、白い部分だけに単語を表示しています。


学習内容としては、Pythonに関する以下のツールやライブラリの使い方がメインです。

・Google Colaboratory: Webブラウザ上でPythonを実行できるツール
・MeCab: 日本語を取り扱うライブラリ(単語の区切りを検出する)
・wordcloud: ワードクラウドを作成するライブラリ

テキスト情報の取得とワードクラウド表示のため、こちらのライブラリも補助的に使います。

・requests: Webからデータをダウンロードできるライブラリ
・BeautifulSoup: 取得したHTMLを操作できるライブラリ
・matplotlib: 画像を表示するためのライブラリ


(4) Google DriveでPythonの実行環境を用意する(Google Colaboratory)

手持ちのパソコンでPythonの環境構築をせずに、今回はGoogle Colaboratory:Web上で一瞬でPythonの実行環境を用意できるツールを使います。
はじめ方は、こちらの記事などを参考にしてください。


設定ができたら、Google Colaboratoryの画面を見てみましょう。
「セル」の中にPythonのコードを書く→実行(Ctrl + Enter)→セルのすぐ下で実行結果を確認できます。

以下の項目では、ワードクラウドを作るためにこのセルに書くべき内容を具体的に説明していきます


(5) 日本語フォントと必要なライブラリをインストール

Google Colaboratoryの準備ができたら、日本語フォントと必要なライブラリをインストールしていきます。


日本語フォントのインストール

ワードクラウドで使用する、日本語フォントをインストールします。
新しいセルに以下を入力してみましょう。
最初の「!」も一緒に入力することで、「apt-get」というコマンドを実行して日本語フォントをインストールできます。

!apt-get -y install fonts-ipafont-gothic

正しい場所にインストールされたか確認します。ここでも「!」を忘れずに。

!ls /usr/share/fonts/opentype/ipafont-gothic/ipagp.ttf


MeCabのインストール

Google Colaboratory上に、MeCabと関連ライブラリをインストールします。
下のセルの最終行でインストールしているmecab-python3 というのは、MeCabをPython3から使えるようにするためのライブラリです。
2018年11月13日にmecab-python3が0.996.1にバージョンアップしました。インストールの際に、以前のVersion0.7とは違って「swig」が必要になるので、以下のインストール手順に加えています(apt-getの最後のほう)。

このセルは実行に少し時間がかかります(トイレに行って帰ってきたらちょうどいいくらいかなと思います)。

# install MeCab
!apt-get -q -y install sudo file mecab libmecab-dev mecab-ipadic-utf8 git curl python-mecab swig > /dev/null
!git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git > /dev/null 
!echo yes | mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd -n > /dev/null 2>&1
!pip install mecab-python3 > /dev/null

上のセルでは、mecab-ipadic-NEologdという辞書もインストールしています。
MeCabは、日本語の文章を単語に区切るときに「辞書」を使っているのですが、mecab-ipadic-NEologdには

・MeCabのデフォルト辞書に載っていない新しい単語や固有表現に強い
・インターネット上の情報などをもとに週2回以上更新されている

というメリットがあります。


辞書がきちんとインストールされたことを次の手順で確認しましょう。エラーなく実行できればOKです。

# check path to "ipadic-neologd" 
!echo `mecab-config --dicdir`"/mecab-ipadic-neologd"


インストールしたMeCabを実際にPython3から使ってみましょう。

MeCabでは、日本語の文章を入力すると、分割された単語が出力されます。デフォルトの出力フォーマットは以下のようになります。「表層形」は「文章中に現れるそのままの形」という意味です。

表層形\t品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用型,活用形,原形,読み,発音

以下のセルを実行して結果を見た方が分かりやすいですが、「彼女はペンパイナッポーアッポーペンと恋ダンスを踊った。」という文章を単語に分割しています。1行に1つの単語が出力されていますね。

mecab-ipadic-NEologdの辞書を使うと、「ペンパイナッポーアッポーペン」や「恋ダンス」が正しく1つの固有名詞になっているのが分かります。

import MeCab

# MeCabデフォルトの辞書を使う
m = MeCab.Tagger()
sample_txt = "彼女はペンパイナッポーアッポーペンと恋ダンスを踊った。"
print("Mecab:\n", m.parse(sample_txt))

# mecab-ipadic-NEologdの辞書を使う
path = '-d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd'
m = MeCab.Tagger(path)
print("Mecab ipadic NEologd:\n", m.parse(sample_txt))

実行結果:

Mecab:
 彼女	名詞,代名詞,一般,*,*,*,彼女,カノジョ,カノジョ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
ペンパイナッポーアッポーペン	名詞,一般,*,*,*,*,*
と	助詞,並立助詞,*,*,*,*,と,ト,ト
恋	名詞,一般,*,*,*,*,恋,コイ,コイ
ダンス	名詞,サ変接続,*,*,*,*,ダンス,ダンス,ダンス
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
踊っ	動詞,自立,*,*,五段・ラ行,連用タ接続,踊る,オドッ,オドッ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。	記号,句点,*,*,*,*,。,。,。
EOS

Mecab ipadic NEologd:
 彼女	名詞,代名詞,一般,*,*,*,彼女,カノジョ,カノジョ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
ペンパイナッポーアッポーペン	名詞,固有名詞,一般,*,*,*,Pen-Pineapple-Apple-Pen,ペンパイナッポーアッポーペン,ペンパイナッポーアッポーペン
と	助詞,並立助詞,*,*,*,*,と,ト,ト
恋ダンス	名詞,固有名詞,一般,*,*,*,恋ダンス,コイダンス,コイダンス
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
踊っ	動詞,自立,*,*,五段・ラ行,連用タ接続,踊る,オドッ,オドッ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。	記号,句点,*,*,*,*,。,。,。
EOS


TODO: 好きな文章を単語に分割してみましょう

下のセルをGoogle Colaboratory上で編集して、自分の好きな文章を単語に分割した結果をprint文で表示してみましょう。

import MeCab

# TODO: 自分の好きな文章を入れる
your_txt = ''

# mecab-ipadic-NEologdの辞書を使う
path = '-d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd'

# TODO: MeCab.Taggerと.parseを使って日本語の文章を単語に分割する


その他ライブラリをインストール

MeCab以外に、今回のチュートリアルで必要なライブラリをいくつかインストールします。

・requests: Webからデータをダウンロードできるライブラリ
・BeautifulSoup: 取得したHTMLを操作できるライブラリ
・wordcloud: ワードクラウドを作成するライブラリ
!pip install requests
!pip install beautifulsoup4
!pip install wordcloud


(6) ワードクラウド作成(準備編)

ここから、いよいよPythonのプログラムを実際に書いていきましょう。
まずは必要なライブラリをインポートします。Google Colaboratory上で画像を表示・確認したいので、"%matplotlib inline"と書いておきます。

%matplotlib inline
import matplotlib.pyplot as plt
from wordcloud import WordCloud
from bs4 import BeautifulSoup
import requests

from PIL import Image
import numpy as np

mecab-ipadic-NEologd 辞書のある場所をpathという変数に指定しておきます。

path = '-d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd'
print(path)


⓪単語のリスト→文字列→タブなど不要な記号を取り除く関数

ワードクラウド作成に必要な処理を、まとまりごとに関数の形で定義していきます。

ここでは「何かを入力すると、いろいろ処理をして何かを出力してくれるもの」くらいの意味で「関数」と書いていますが、関数を定義しておくと、

・同じ処理を使いまわせる
・自分なりのアレンジを加えたいときに1か所だけ変更すればいい

メリットがありますよね。

まずは remove_symbols_from_str:この関数は、単語のリストをくっつけて一つの文字列にした後、改行記号('\n')、タブ('\t')、スペース(' ')を取り除きます。

def remove_symbols_from_str(str_input):
   preprocessed_str = str_input.replace('\n', '').replace('\t','').replace(' ', '')
   return preprocessed_str

TODO:使ってみましょう

下のセルを編集して、関数の結果をprintしてみましょう。

# TODO: sample_strとして文字列を作る。例えば '今日は\tいい 天気です\n'
sample_str = '今日は\tいい 天気です\n'
print(remove_symbols_from_str(sample_str))


①MeCabで日本語を単語ごとに区切る関数

use_original_list = ['ブログ', 'ブロガー']
pos_tuple = ('名詞', '形容詞', '動詞') # ('名詞', '形容詞', '動詞', '副詞')

def mecab_analysis(text):
    t = MeCab.Tagger(path)

    output = []
    for chunk in t.parse(text).splitlines()[:-1]:
        (surface, feature) = chunk.split('\t')
        feature_split = feature.split(',')
        pos, original = feature_split[0], feature_split[6]

        if pos.startswith(pos_tuple):
            if surface in use_original_list:
                output.append(surface)
            else:
                output.append(original)

    return output

日本語の文章は、そのままだと単語の区切りが分からずワードクラウドを作るのが難しいので、MeCabで日本語を単語ごとに区切っていきましょう。

処理の流れ(分かる人は読み飛ばしてください):

・MeCabの出力結果を、splitlinesで1行ずつに分けて順番に見ていく
・chunkで1つの単語に着目して、まずはsplitを使ってタブ('\t')で分割→surface=「表層形」とfeature=「それ以外」に分ける
・featureをさらにカンマ(',')で分割して、「品詞」と「原形」を取り出してpos, originalに入れる
※「踊り」「踊っ」「踊る」のように「表層形」が違っても、ワードクラウド上では同じ一つの単語にまとめたいので、今回は「踊る」のような「原形」を使っています。
※「ブログ」と「ブロガー」の原形がそれぞれ「blog」「blogger」と英語になっていたので、ここでは表層形をそのまま使うようにしています。


②単語のリストを作成する関数(URL/ファイル/文字列)

次は、テキスト情報を指定すると、そこから単語のリストを作ってくれる関数です。

・get_wordlist_from_url:URL(の先にあるテキストを取得)
・get_wordlist_from_file:テキストファイル(の中身を読み込む)
・get_wordlist_from_text:文字列(を直接与える)


⓪で作ったremove_symbols_from_strと、①で作ったmecab_analysisを使えるようにしていきます。

def get_wordlist_from_url(url):
    res = requests.get(url)
    soup = BeautifulSoup(res.text)

    # Qiitaの記事に対応
    text = soup.body.section.get_text()
    text = remove_symbols_from_str(text)

    return mecab_analysis(text)

def get_wordlist_from_file(filepath):
    with open(filepath, 'r') as f:
        text = f.read()
        text = remove_symbols_from_str(text)
    return mecab_analysis(text)

def get_wordlist_from_text(text):
    text = remove_symbols_from_str(text)
    return mecab_analysis(text)


TODO:使ってみましょう

Qiitaから、新卒からの質問をソシャゲっぽい仕組みにしたら捗った話をお借りして試してみます。

sample_url = 'https://qiita.com/y-tsuna/items/fced3a9515c8f585ca50'
print(get_wordlist_from_url(sample_url))

実行結果(一部省略):

['dip', '*', '4日目', 'はじめ', 'こんにちは。', 'dip', 'UX', 'デザイン', '速度', '改善', '潤滑油', ...]


③ワードクラウドを作成・画面に表示する関数

最後に、ワードクラウドを作成・画面に表示する関数を作りましょう。

ここから先は

4,406字 / 3画像

¥ 300

気に入っていただけたら、サポートもどうぞよろしくお願いします!