ワードクラウド

ワードクラウド(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 と辞書をインストールします。Mac では Homebrew でインストールするのが簡単です。また,MeCab を Python から使うためのライブラリもインストールします。

brew install mecab mecab-ipadic
pip install mecab-python3

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

In [ ]: import MeCab

In [ ]: mecab = MeCab.Tagger()

In [ ]: print(mecab.parse("すもももももももものうち"))
すもも  名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
うち    名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS


In [ ]: chasen = MeCab.Tagger("-Ochasen")

In [ ]: print(chasen.parse("すもももももももものうち"))
すもも  スモモ  すもも  名詞-一般               
も      モ      も      助詞-係助詞             
もも    モモ    もも    名詞-一般               
も      モ      も      助詞-係助詞             
もも    モモ    もも    名詞-一般               
の      ノ      の      助詞-連体化             
うち    ウチ    うち    名詞-非自立-副詞可能            
EOS


In [ ]: wakati = MeCab.Tagger("-Owakati")

In [ ]: 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')
流言蜚語ワードクラウド

「その」「ある」などのあまり意味のないことばが大きく出てしまいました。これらの単語は「ストップワード」として外してしまいましょう。そのためには 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()

Last modified: