戦略コンサルタントとして仕事をしていたとき、大企業の戦略会議に向けてスライドを大量に製造していました。そこで叩きこまれたことは今でも大事にしており、特に紙にメッセージを落としこむ上で重要なこととして以下の2つのことを意識するようにしています。
- 一目見た時に、文字を読む前から正しい印象が伝わるような構成になっていること
- 言葉が「クリスタライズ」されていて、端的でありながら細かいニュアンスまで伝えること
重役会議など、そもそも時間のない人たちに話を聞いてもらい、誤解を生まないように議論を進めていくのは容易ではなく、特に第一印象でコケると聞く側が全くお留守になってしまうという状況を生み出します。
一方で、ストーリーというのはどんなに端的に表しても長くなっていくものです。結局のところ1行にまとめることができるお話だけで済むほど世界は退屈な所ではないからです。だからこそ第一印象で相手の興味をひくことはなおさら重要なわけです。
本題に移りますが、数年前、海外で仕事をしていた時にWordleというサービスを知り、タイポグラフィーの新しい面白さに見とれてしまいました。ワードクラウドと一般的に呼ばれている手法で、長文から重要な単語を抜き出し、各単語の大きさがその重要さを表す、という単純な仕組みですが、非常に美しく、インパクトの強い表現をすることができます。いろいろな亜種が登場し、こったものではこんなものまであります。
最先端研究所での研究テーマを考える中でワードクラウドを思い出し、日本語ではどんな物があるのかと思って調べてみたところこんな程度のものしかなく、
がっかりしてしまったわけです。
そこで、現在研究開発中のコードと、英語のワードクラウドのコードでオープンソースのもの、かつパイソンで書かれているものをガッチャンコして、日本語版ワードクラウドを作ってみようと試みたところ、そこそこ面白いものができました。
参考にしたのはドイツの大学で言語学をやっているこの人のコード: http://peekaboo-vision.blogspot.de/2012/11/a-wordcloud-in-python.html
ちょっとお固いですが、試しに日本国憲法をワードクラウドにしてみました。
興味のある方のために、手順をご紹介。オープンソース 形態素解析エンジンをつかって、「単語」という観念のない日本語の文章をバラバラに切っていきます。
def str2nodes(s):
t_chasen=MeCab.Tagger("-Ochasen")
return t_chasen.parseToNode(s), t_chasen
そして、特に重要な種類の単語を抜き出します。
def extract(nodes, allow, deny, remove=[], verbose=False):
l=[]
while nodes:
word_type=nodes.feature.split(',')
word_type_sub1=word_type[0]
word_type_sub2=word_type[1]
word_type_sub3=word_type[2]
tagged=(nodes.surface, word_type[0], word_type[1], word_type[2])
if word_type_sub1 in allow or not allow:
if verbose:
print "%-15s %-15s %-15s %-15s" % (nodes.surface, word_type_sub1, word_type_sub2, word_type_sub3)
if word_type_sub2 not in deny or not deny:
if tagged[0] not in remove:
l.append(tagged[0])
nodes= nodes.next
return l
現在単語の選別に使っているのフィルターは
ALLOW=['名詞', '動詞', '形容詞']
DENY=['代名詞', '非自立', '接尾']
REMOVE=['する', 'ある']
です。ワードの描画はマイナーチェンジの必要はあったものの、基本的にAndreas Muller氏のコードをそのまま使っています。アルゴリズムとしては
- ワードの頻出回数をカウント(sklearnパッケージを使っている)
- 頻出回数の大きいものから大きいサイズを与え、だんだん小さくしていく
- 単語を一度描画し、キャンバス上でそのサイズのオブジェクトをオーバーラップなくを描画できる場所を探す
- 見つかれば描画、見つからなければ文字を小さくして探す
描画可能な領域を見つけるには、キャンバス上のあらゆる座標から、十分な空きスペースがあるのか調べる必要があり、非常にCPUインテンシブな部分です。Andreas Muller氏はCythonをつかってCコードを生成し、コンパイルして高速化しており、上記の例を作るのにもほとんど時間はかかりませんでした。むしろ文章の形態素解析のほうが時間がかかった感じです。
第一弾としてはまずまずの出来ですが、色々と向上したい点はあります:
- 日本語なので縦書をしたい
- 色やフォントなど、もっと色々試してみたい
- もっと読みやすいレイアウトにしたい
- だれでも使えるようにWebサービス化したい、などなど
次回もう少し掘り下げてみたいと思います。