ワードクラウド

はじめに

ワードクラウド(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(じゃのめ、蛇の目)、新しめの Sudachi(Python版 SudachiPy)などがあります。

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()

Sudachiを使う

pip install sudachipy sudachidict_core でインストールできます。Pythonで使うほか、ターミナルでコマンド sudachipy も使えます:

% echo "すもももももももものうち" | sudachipy
すもも  名詞,普通名詞,一般,*,*,*        李
も      助詞,係助詞,*,*,*,*     も
もも    名詞,普通名詞,一般,*,*,*        もも
も      助詞,係助詞,*,*,*,*     も
もも    名詞,普通名詞,一般,*,*,*        もも
の      助詞,格助詞,*,*,*,*     の
うち    名詞,普通名詞,副詞可能,*,*,*    うち
EOS

Pythonから使うには次のようにします:

from sudachipy import dictionary

tokenizer_obj = dictionary.Dictionary().create()
morphemes = tokenizer_obj.tokenize("すもももももももものうち")
morphemes
<MorphemeList[
  <Morpheme(すもも, 0:3, (0, 77699))>,
  <Morpheme(も, 3:4, (0, 156944))>,
  <Morpheme(もも, 4:6, (0, 160209))>,
  <Morpheme(も, 6:7, (0, 156944))>,
  <Morpheme(もも, 7:9, (0, 160209))>,
  <Morpheme(の, 9:10, (0, 119137))>,
  <Morpheme(うち, 10:12, (0, 21763))>,
]>
[m.surface() for m in morphemes]
['すもも', 'も', 'もも', 'も', 'もも', 'の', 'うち']
" ".join([m.surface() for m in morphemes])
'すもも も もも も もも の うち'
[m.part_of_speech() for m in morphemes]
[('名詞', '普通名詞', '一般', '*', '*', '*'),
 ('助詞', '係助詞', '*', '*', '*', '*'),
 ('名詞', '普通名詞', '一般', '*', '*', '*'),
 ('助詞', '係助詞', '*', '*', '*', '*'),
 ('名詞', '普通名詞', '一般', '*', '*', '*'),
 ('助詞', '格助詞', '*', '*', '*', '*'),
 ('名詞', '普通名詞', '副詞可能', '*', '*', '*')]
[m.surface() for m in morphemes if m.part_of_speech()[0] == "名詞"]
['すもも', 'もも', 'もも', 'うち']

あとはMeCabと同様にできます。

高校「情報」とワードクラウド

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

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

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

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