ワードクラウド

ワードクラウド(word cloud)とは頻出語を頻度に比例する大きさで雲のように並べたものです。

英語のワードクラウドは wordcloud ライブラリで簡単に描けます。あらかじめ pip install wordcloud などとしてインストールしておきます。テキストとしては何でもいいのですが、ここでは WordCloud() の説明文(docstring)を用いてみます:

from wordcloud import WordCloud

text = WordCloud.__doc__
wc = WordCloud(width=480, height=320)
wc.generate(text)
wc.to_file('wc1.png')
WordCloudの説明のワードクラウド

日本語はこのように簡単にはいきません。まずは単語に分解しなければなりません(形態素解析)。そのためのツールとして、MeCab(めかぶ、和布蕪)が有名ですが、インストールが難しい場合は、Python だけで実装した Janome(じゃのめ、蛇の目)が便利です。ここではとりあえず MeCab を使って説明します。

まず MeCab と辞書をインストールします。Windows では MeCab 64bit version でうまくいきました。インストールの際に文字コードを求められますので、必ず UTF-8 を選びます。Mac では Homebrew でインストールするのが簡単です(brew install mecab mecab-ipadic)。

さらに、MeCab を Python から使うためのライブラリもインストールします。

pip install mecab-python3

動作確認してみましょう:

import MeCab

mecab = MeCab.Tagger()
print(mecab.parse("すもももももももものうち"))
すもも  名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
うち    名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS
chasen = MeCab.Tagger("-Ochasen")
print(chasen.parse("すもももももももものうち"))
すもも  スモモ  すもも  名詞-一般               
も      モ      も      助詞-係助詞             
もも    モモ    もも    名詞-一般               
も      モ      も      助詞-係助詞             
もも    モモ    もも    名詞-一般               
の      ノ      の      助詞-連体化             
うち    ウチ    うち    名詞-非自立-副詞可能            
EOS
wakati = MeCab.Tagger("-Owakati")
print(wakati.parse("すもももももももものうち"))
すもも も もも も もも の うち 

とりあえず最後の例のようにして分かち書きにすればワードクラウドが作れそうです。

サンプルとして、寺田寅彦の流言蜚語を題材としてみます。青空文庫のサイトからコピペしてください。改行を含む長い文章ですので、全体を """...""" で囲みます。

text = """
長い管の中へ、水素と酸素とを適当な割合に混合したものを入れておく、
(中略)
甚だしい恥辱を曝さらす事なくて済みはしないかと思われるのである。
"""
words = wakati.parse(text)
wc = WordCloud(width=480, height=320, background_color="white",
               font_path="/System/Library/Fonts/ヒラギノ角ゴシック W6.ttc")
wc.generate(words)
wc.to_file('wc2.png')

Windows では font_path は例えば "C:/WINDOWS/Fonts/meiryob.ttc" などとします。

流言蜚語ワードクラウド

「その」「ある」などのあまり意味のないことばが大きく出てしまいました。これらの単語は「ストップワード」として外してしまいましょう。そのためには WordCloud() に例えば stopwords={"その","ある"} のようなオプション引数を与えます。

もっと楽に済ませるには、せっかく MeCab で品詞がわかるのですから、名詞だけにしてしまうという手もあります:

nodes = mecab.parseToNode(text)
s = []
while nodes:
    if nodes.feature[:2] == '名詞':
        s.append(nodes.surface)
    nodes = nodes.next
wc = WordCloud(width=480, height=320, background_color="white",
               stopwords={"もの","これ","ため","それ","ところ","よう"},
               font_path="/System/Library/Fonts/ヒラギノ角ゴシック W6.ttc")
wc.generate(" ".join(s))
wc.to_file('wc3.png')
流言蜚語ワードクラウド

ちなみに、プログラム中にテキストを書き込むのは面倒なので、テキストは別ファイルにして、次のようにして読み込むのが楽です:

with open('filename.txt') as f:
    text = f.read()

ワードクラウド(タグクラウド)については、文科省の『高等学校学習指導要領(平成30年告示)解説 情報編』p.39 に次のように書かれています。

更に、テキストマイニングの学習として、新聞記事や小説などをテキストデータとして読み込み、適当な整形等を行った上で、単語の出現頻度について調べさせ、出現頻度に応じた文字の大きさで単語を一覧表示したタグクラウドを作らせ、単語の重要度や他の単語との関係性を捉える学習活動などが考えられる。英語と日本語では、テキストマイニングをする際にどのような部分に違いがあるのかについて討論したり、実際にテキストマイニングを行って比較したりする活動なども考えられる。

このため、AIテキストマイニング by ユーザーローカルというサイトなどを使って実習している学校があります。

一方、テキストマイニングの専門家からはワードクラウドは評判が良くありません。例えば Word clouds considered harmful をご覧ください。