Rubyで英文小説をWordleしようよ
Wordleって知ってる?Wordleはテキスト中の単語をグラフィカルに配置して、表示するツール/サービスだよ。
Wordle - Beautiful Word Clouds
例えばProject Gutenbergから、「Alice's Adventures In Wonderland」を取ってきて、Createページのテキストボックスにこれを貼りつければ、こんなものができるんだよ。
すばらしいよね!Wordleではテキスト中の単語の出現頻度に応じて、文字の大きさを調整してるよ。加えてRandomizeボタンを押したり、FontやLayoutやColorを変えたりすることで、全く違ったイメージのWordleが作れるよ。
Wordleのアルゴリズムについては、「Beautiful Visualization」というデータビジュアライゼーションの本に解説があるよ。
Wordleはすばらしいんだけど一点だけ不満があるよ。それはその単語の大きさがそのテキストの特徴を、必ずしもうまく表していないことだよ。つまりWordleではストップワードの除去が、あまりうまくいっていないんだよ。ちなみにストップワードはその言語で一般的に使われる語、例えばthe a forとかの非特徴的な単語のことだよ。先の結果を見ると、余り特徴的でない単語が並んでることがわかるよね。
で、以前にこのブログのチュートリアルで作った、WordDictionaryクラスを思い出したんだよ。
Rubyチュートリアル ~英文小説の最頻出ワードを見つけよう!(最終回) - hp12c
WordDictionaryクラスでは、他のテキストからなるベース辞書との比較で、対象テキストの特徴語を抽出できるんだったよ。試しにちょっと固めの小説をベースとして、アリスの特徴語を抽出してみるよ。
require_relative "word_dictionary" alice = "alices_adventures_in_wonderland.txt" bases = %w(english_literature.txt analyze_people_on_sight.txt) alice_wd = WordDictionary.new(alice) base_wd = bases.map { |base| WordDictionary.new(base, base) }.inject(:+) p alice_wd.uniq_words(40, base_wd) # >> [["alice", 403], ["turtle", 59], ["hatter", 56], ["mock", 56], ["gryphon", 55], ["rabbit", 51], ["mouse", 44], ["ve", 44], ["duchess", 42], ["tone", 40], ["dormouse", 40], ["cat", 37], ["march", 35], ["hare", 31], ["white", 30], ["replied", 29], ["caterpillar", 28], ["jury", 22], ["cried", 20], ["sort", 20], ["tea", 19], ["soup", 18], ["spoke", 17], ["sat", 17], ["talking", 17], ["garden", 16], ["hastily", 16], ["arm", 15], ["mad", 15], ["suppose", 14], ["didn", 14], ["anxiously", 14], ["dinah", 14], ["baby", 14], ["footman", 14], ["yes", 13], ["dodo", 13], ["cats", 13], ["wouldn", 13], ["dance", 13]]
なんかそれっぽい単語が抽出されたね
うれしいことにWordleのサイトでは、単語とその重み付けのリストを渡して、Wordleを作ることもできるんだよ(Advancedページ)。早々WordDictinaryで抽出したAliceの特徴語を使って、Wordleを作ってみたよ。
Alices Adventures In Wonderland (40 words)
Alices Adventures In Wonderland (100 words)
なんかいい感じだよね!他の小説でも試してみるよ。
The Adventures Of Sherlock Holmes
Wordleは楽しいから是非とも試してみて!僕が作ったWordleは次のURLで見れるよ。
http://www.wordle.net/gallery?username=merborne:title=Wordle - Gallery: merborne