【Python】ブログの特徴をワードクラウドで可視化しよう!【WordPress】

Python

みなさん,こんにちは.
シンノユウキ(@y_stadio)です.

今回は自分のブログの文章の特徴をワードクラウドで可視化する方法を紹介したいと思います.今回はWordPressを対象としていますので,違うサービスを利用している方は少し工夫が必要になります.

では行きましょう!

ブログ記事をCSVでエクスポートしよう!

まずは,ブログ記事をエクスポートする必要があります.URLから直接読み込んでいく方法もあるにはあるのですが,面倒なので,CSVでブログの記事本文をエクスポートしちゃいましょう.

WordPressの場合はプラグイン:「WP CSV Exporter」を使用すると便利です.もちろん,記事の本文が取得できれば良いので,他のプラグインを使用しても構いません.

エクスポートする項目は記事本文を示している「Post Content」以外はお好みで構いません.

また,記事の期間を指定することもできます.今回は,2018年に公開した記事を対象にしました.

エクスポートすると以下のようなCSVファイルがダウンロードできるかと思います.

これをPythonで扱っていきます.

今回使用するライブラリたち

では,いよいよPythonの方での作業となります.以下のコードを記述し,今回使用するライブラリたちを読み込んで下さい:

import csv
import html2text
import re
from janome.tokenizer import Tokenizer
from wordcloud import WordCloud
import matplotlib.pyplot as plt
  • csv:CSVファイルを読み書きするための標準ライブラリです.
  • html2text:HTMLファイルをプレーンテキストなどに変換するライブラリです.
  • re:文字列の正規表現による置換などに使います.
  • janome:形態素解析を行うためのライブラリです.
  • WordCloud:ワードクラウドを描くためのライブラリです.
  • matplotlib:グラフを書くためのライブラリです.

以下で使い方などは解説していきますので,とりあえず書いてしまいましょう.

CSVファイルを読み込もう!

では,次はCSVファイルを読み込んでいきます.以下のコードを実行してください:

file_path = "./*****.csv"
csv_file = open(file_path, "r", encoding="shift-jis", errors="", newline="")
f = csv.reader(csv_file, skipinitialspace=True)
header = next(f)
text = ""
for row in f:
    text += " " + row[4]

file_pathには,先ほどエクスポートしたCSVファイルのパスを入れて下さい.CSVファイルを開き,変数fにCSVの中身のようなものを入れています.

その中身をfor row in f: で一行ずつ取り出しています.row[4]がブログの本文が格納されている場所ですので,それをtextにスペース区切りで結合していっています.

この処理が終わると,全ての記事の本文がtextに含まれている状態になります.

文章をクリーニングしよう!

エクスポートされた文章は,HTMLのタグが含まれていたり,URLなど重要でない単語が含まれているなど,そのままの状態でワードクラウドを作成できるような状態ではありません.なので,以下でその文章をクリーニングしていきます.

不要な文字の削除

HTMLのタグ

まずは,記事中に含まれる不要な文字の代表格,HTMLのタグを削除していきましょう.

これには,ライブラリ:html2textを使用します.以下のコードを実行してください:

h = html2text.HTML2Text()
text = h.handle(text)

この状態でtextをprintしてみましょう.HTMLのタグが取り除かれた状態で出力されたかと思います.

URLの除外

その他,URLがtextに含まれる場合があるので,それを削除します.これには,reライブラリを使用します.以下のコードを実行してください:

text = re.sub("(https?|ttp)(:\/\/[-_\.!~*\'()a-zA-Z0-9;\/?:\@&=\+\$,%#]+)", " " ,text)

これは,正規表現を用いて,httpsもしくはhttpから始まる英数字の文字列を半角スペースに置き換えています.URLを除外する方法はいくつかあるのですが,この方法が最も簡単にできましたので,紹介しています.

これで,ある程度,不要な文字を削除することができました!

わかち書き

次は,textをワードクラウドで扱えるようにするために,わかち書きと呼ばれる書き方に変更します.これには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)

janomeで形態素解析した単語をword_listにスペース区切りで結合しています.この際,ブログの特徴を示せるように,名詞で,かつ非自立でも代名詞でもない単語のみを抽出しています.

ここの処理は,ブログ記事の数や本文の量によって大きく変わります.多すぎると動かない?可能性もあるかもしれませんが,私程度であれば問題ありませんでした.

ワードクラウドを作成しよう!

では,最後にワードクラウドを作成しましょう.

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

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

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

これで,ワードクラウドを描くことができます.

私の場合,以下のようになりました:

うーん.分からないでもないですが,一般的に多用されている言葉が多い印象ですね.「場合」や「今回」など.なので,これらを除外して,より特徴を際立たせるようにしてみましょう.

データをクリーニングする際に,以下のようなコードを追加してくだい:

text = re.sub("今回", " ", text)
text = re.sub("場合", " ", text)
text = re.sub("まとめ", " ", text)
text = re.sub("処理", " ", text)
text = re.sub("使用", " ", text)
text = re.sub("紹介", " ", text)
text = re.sub("必要", " ", text)
text = re.sub("表示", " ", text)
text = re.sub("利用", " ", text)
text = re.sub("作成", " ", text)
text = re.sub("入力", " ", text)

指定した言葉を,textから除外しています.私の場合はこれらの言葉を除外しましたが,ワードクラウドを見て不要だと思うものを削除してみてください.

微調整の結果,以下のようなワードクラウドを作成することができました!

結構,私のブログを反映できてるのでは?と感じていますが,いかがでしょう?

まとめ

今回は自分のブログ記事をテキストマイニングし,ワードクラウドとして表示する方法を紹介しました.結構簡単で手軽にできますので,ぜひお試し下さい!

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