WordCloudで単語頻度図を作る
本技術ブログの目的
こんにちは。DATUM STUDIOの岩城です。本技術ブログでは、テキスト中の単語頻度を可視化するためにWordCloundを用いた単語頻度図の作成を行います。WordCloudはテキストデータを頻度の高い単語ほど大きな文字で表示した単語頻度図を生成するライブラリです。自然言語処理において対象とするテキスト中の単語頻度を調べることは極めて重要で、WordCloudによる単語頻度図はそれらの直感的な理解に役立ちます。
今回は馴染み深い(?)「日本国憲法」を題材にPythonからWordCloudの単語頻度図の描画を目指します。
描画までの流れ
描画までの流れは下記の通りです。
(1) テキストデータの準備
(2) MeCabによるテキストのわかちがき
(3) WordCloudによる描画
上記に示す様に、テキストデータをWordCloudに投入するだけでは単語頻度図が得られません。WordCloudでテキストの単語頻度図を作成するには、テキストの「わかちがき」(2)をする必要があります。「わかちがき」とは文章を単語単位で分割することで、MeCab, Kuromoji などの形態素解析ツールがよく利用されます。例えば「今日私は学校へ行きます。」という文章があるとすると、形態素解析ツールは「今日/私/は/学校/へ/行き/ます/。」の様に単語レベルで文章を「わかちがき」します。単語ごとに空白で区切られる英語などの言語と違って日本語は文章中における単語の切れ目が明確でないため、テキストから単語を抽出するには「わかちがき」の工程が欠かせません。
「わかちがき」された単語をそのまま用いても良いですが、助詞や句読点などの記号は文章の意味に寄与しないため、重要な品詞のみが選択される場合も多いです。また、名詞でも「こと」の様に文意に影響しない単語を stopword として除外する処理もしばしば行われます。ここでは名詞、動詞、形容詞の品詞選択と任意のstopword の処理を実行しました。
Pythonスクリプト例
「描画までの流れ」の処理を実際に行ったPythonスクリプト例は下記の通りです。まずは既成モジュールをインポートします。
import os from PIL import Image import numpy as np import pandas as pd import MeCab from wordcloud import WordCloud
次に計算に必要なクラスや関数の定義です。「わかちがき」は Wakatiという自作クラスで処理されます。選択する品詞リストやストップワードもここで設定しています。
# .txtファイルからテキストを抽出する関数 def get_text(path): f = open(path, encoding="utf-8") text = f.read() f.close() return text class Wakati: # コンストラクタ def __init__(self, text): self.text = text self.tokens = None self.targets = ["名詞", "動詞", "形容詞"] self.stopwords = ["する", "れる", "これ", "こと", "とき", "なる", "ため", "ところ", "ふる"] # 分かち書きを行うメソッド def tokenize(self): words = self.get_words() self.tokens = self.get_stopped_words(words) return self.tokens # 形態素解析の結果をDataFrameで返す関数 def get_dfw(self): t = MeCab.Tagger("Owakati") t.parse("") node = t.parseToNode(self.text) surfaces = [] stems = [] poss = [] while node: surface = node.surface feature = node.feature.split(",") stem = feature[6] pos = feature[0] surfaces.append(surface) stems.append(stem) poss.append(pos) node = node.next dfw = pd.DataFrame() dfw["SURFACE"] = surfaces[1:-1] dfw["STEM"] = stems[1:-1] dfw["POS"] = poss[1:-1] return dfw # 形態素解析結果から目的となる品詞に一致した単語リストを取得する関数 def get_words(self): dfw = self.get_dfw() words = [] for row in dfw.iterrows(): for target_pos in self.targets: if row[1]["POS"] == target_pos: if row[1]["STEM"] != "*": words.append(row[1]["STEM"]) return words # 単語リストからストップワードを除去した単語リストを返す関数 def get_stopped_words(self, words): stopped_words = [word for word in words if word not in self.stopwords] return stopped_words # トークンリストを半角スペースで結合したテキストに変換する関数 def tokens2linetext(tokens): linetext = "" for token in tokens: linetext += token linetext += " " return linetext[:-1]
最後にテキストから「わかちがき」を通じてWordCloudの単語頻度図を作成する部分です。描画条件は引数で変更が可能で、今回は外形を弊社ロゴの一部にアレンジしてみました(mask=datum_mask の部分)。
# テキストデータの取り込み path = "preprocessed_日本国憲法.txt" text = get_text(path) # テキストの形態素解析 tokens = Wakati(text).tokenize() # 形態素解析結果を半角スペースで結合されたテキストに変換 linetext = tokens2linetext(tokens) # フォントパスの準備 ''' fontpath:計算環境に応じてフォントパスを設定して下さい ''' fontpath = "/library/fonts/ヒラギノ丸ゴ ProN W4.ttc" # WordCloudの外形画像の準備 mask_path = "datum_mask.png" datum_mask = np.array(Image.open(mask_path)) # WordCloudを用いて単語頻度図を作成 wc = WordCloud( background_color="white", colormap="winter", mask=datum_mask, font_path=fontpath, collocations=False, height=674, width=1024 ) wc.generate(linetext) # 出力ファイル名設定と単語頻度図の出力 filename = os.path.basename(path) filename = os.path.splitext(filename)[0] outname = "wcfig_" + filename + ".png" wc.to_file(outname)
作図結果
「日本国憲法」を対象としたWordCloudによる単語頻度図は下図の様になりました。
まとめ
題材が「日本国憲法」だけあって「国民」、「国会」、「内閣」、「法律」、「憲法」などの単語
が大きく目立ちます。それ以外に関しても中学の公民で習った聞き覚えのあるワードが埋め込まれて
いる様に見られます。なかなか「日本国憲法」を文章として目を通す機会はないかもしれませんが、
本技術ブログの様にWordCloudの単語頻度図にすれば、少なくとも何について書かれていてるか
直感的に捉える助けとなったでしょう。テキスト内容の可視化にWordCloudによる単語頻度図の作成
はオススメです。
[参考文献]
(1) http://www.shugiin.go.jp/internet/itdb_annai.nsf/html/statics/shiryo/dl-constitution.htm
(2) https://amueller.github.io/word_cloud/generated/wordcloud.WordCloud.html
DATUM STUDIOは、クライアントの事業成長と経営課題解決を最適な形でサポートする、データ・ビジネスパートナーです。
データ分析の分野でお客様に最適なソリューションをご提供します。まずはご相談ください。
Contact
Explore Jobs
関連記事