見出し画像

【簡単】Pythonでワードクラウドを作る方法



ワードクラウドとは


ワードクラウドは、テキストデータの中で頻繁に出現する単語を視覚的に表現する方法です。

単語の出現頻度が高いほど、その単語は大きく表示されます。

これにより、テキストの中でのキーワードやトピックを一目で把握することができます。

ワードクラウドは、ニュース記事、論文、ウェブサイトのコンテンツなど、さまざまなテキストデータの分析に使用されます。
特に、大量のテキストデータを一度に分析する際に、キーワードやトピックの傾向を迅速に把握するのに役立ちます。


ワードクラウドがやっていること


これからPythonでの実装方法を紹介していきますが、その前に、
結局、ワードクラウドは何をやっているか?のご説明です。

ワードクラウドは単語の出現回数によって、単語の表示サイズを変えます。コレがワードクラウドの本質です。

  1. まずは、分析するテキストを、単語に分解します。

  2. そして、単語ごとにテキストに出現する回数をカウントします。

  3. 出現回数が高い順に単語を並び替えを行い、出現回数に応じて表示サイズを変えるプログラムを走らせます。

なお、単語の出現位置はランダムで、コードを実行するたびに変わります。


Pythonでの実装方法


Google Colaboratoryで実装していきます

1. ライブラリーのインストール

テキストを単語に分解する形態素解析ツールなどをインストールします。

!pip install -q mecab-python3
!pip install -q ipadic
!pip install -q japanize-matplotlib
!apt-get -yq install fonts-ipafont-gothic


2.ライブラリーのインポート

import pandas as pd
import numpy as np
import unicodedata
import MeCab
from collections import Counter
import requests
from bs4 import BeautifulSoup
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import ipadic
import re


3.テキストの取得

青空文庫から「吾輩は猫である」をダウンロードしてきます。
ダウンロードしたhtmlファイルについて、テキストのみ抽出しています。

url = "https://www.aozora.gr.jp/cards/000148/files/789_14547.html"
response = requests.get(url)
soup = BeautifulSoup(response.content, "html.parser")
text = soup.get_text()


4.テキストの前処理

テキストデータを単語に分解し、名詞と動詞、形容詞だけを抽出します。
その他テキストのクリーニングを行っています。

#関数の設定
def mecab_tokenizer(text):

    replaced_text = unicodedata.normalize("NFKC",text)
    replaced_text = replaced_text.upper()
    replaced_text = re.sub(r'[【】 () () 『』 「」]', '' ,replaced_text) #【】 () 「」 『』の除去
    replaced_text = re.sub(r'[\[\[]\]]', ' ', replaced_text)   # []の除去
    replaced_text = re.sub(r'[@@]\w+', '', replaced_text)  # メンションの除去
    replaced_text = re.sub(r'\d+\.*\d*', '', replaced_text) #数字を0にする

    parsed_lines = mecab.parse(replaced_text).split("\n")[:-2]

    #表層系を取得
    surfaces = [l.split("\t")[0] for l in parsed_lines]
    #品詞を取得
    pos = [l.split("\t")[1].split(",")[0] for l in parsed_lines]
    #名詞、動詞、形容詞に絞り込み
    target_pos = ["名詞", "動詞", "形容詞"]
    token_list = [t for t , p in zip(surfaces, pos) if p in target_pos]

    #ひらがなのみの単語を除く
    kana_re = re.compile("^[ぁ-ゖ]+$")
    token_list = [t for t in token_list if not kana_re.match(t)]

    #各トークンを少しスペースを空けて(' ')結合

    return ' '.join(token_list)

#関数の実行
words = mecab_tokenizer(text)


5.ワードクラウドの作成

font_pathでフォントの種類、colormapで色を変えることもできます。
フォントはGoogleフォントからダウンロードしてくるのが便利です。
colormapについては、matplotlibのcolormapから選択することができます。

max_wordsで表示する単語数を決めることができます。

#フォントの設定
font_path="/usr/share/fonts/truetype/fonts-japanese-gothic.ttf"
#色の設定
colormap="Paired"

wordcloud = WordCloud(
    background_color="white",
    width=800,
    height=800,
    font_path=font_path,
    colormap = colormap,
    stopwords=["する", "ある", "こと", "ない"],
    max_words=100,
    ).generate(words)

plt.figure(figsize=(10, 10))
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.show()

6.ワードクラウドのカタチを変える

ワードクラウドは自由に形を変えることができます。
さきほどのワードクラウドは四角形でしたが、例えば、「吾輩は猫である」にちなんで、「猫」のカタチにすることもできます。

以下の画像をダウンロードして、Googleコラボのランタイムにアップロードしてください。ファイルパス名は、/content/cat.pngにします。

from PIL import Image

font_path="/usr/share/fonts/truetype/fonts-japanese-gothic.ttf"
colormap="coolwarm"
mask = np.array(Image.open("/content/cat.png"))

wordcloud = WordCloud(
    background_color="white",
    width=800,
    height=800,
    font_path=font_path,
    colormap = colormap,
    stopwords=["する", "ある", "こと", "ない"],
    max_words=200,
    mask=mask
    ).generate(words)

plt.figure(figsize=(10, 10))
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.show()

猫型になりましたね


よろしければサポートお願いします! いただいたサポートはクリエイターとしての活動費に使わせていただきます!