読者です 読者をやめる 読者になる 読者になる

クフでダローバルな日記

タフでもグローバルもない

文章をCabochaで解析してグラフにして可視化する(歌詞可視化)

プログラミング日記

最近どうやら歌詞を可視化するのが流行っているようです。

自然言語処理をすれば簡単に自動化出来るんじゃないかと思ったので、文章を与えると流れを可視化してくれるプログラムを組んでみました。

出来上がったサンプルがこちら

f:id:SWIMATH2:20151001124624p:plain

使ったもの

事前準備

CaboChaのインストール

僕は既にMeCabとかをインストールしてあったので超簡単でした。

$ brew install cabocha
$ gem install cabocha-ruby

graphvizのインストール

これもいつだったか使ったことがあったので僕は

$ gem install gviz

するだけでよかったのですが、もしこれからやろうと思った方は柿のサイトが参考になると重います。

Gvizの目次 - Rubyの世界からGraphvizの世界にこんにちは!

かなり親切に解説してありサンプルも豊富なので、rubyがある程度わかれば簡単に使えると思います。

仕様

このブログを書きながら「これもう誰かやってんじゃね?」と思って検索してみたら、2008年時点で先見の明のある方にすでになされていたようです。つらい。

kenkiti.hatenadiary.jp

こちらの方は形態素解析を用いているため、文節ではなく形態素(単語)がノードとなっています。 僕は最初に引用したツイートを参考にして作ったため、

  1. 文節ごとにノードにする
  2. ノードAからノードBに対する矢印は1本
    • bold,solid,dashed,dottedの順で1~4回目の遷移先を指定
  3. 登場頻度の多いノードは大きくする

という特徴をつけています。

ちなみに、「歌詞の可視化」として曲名を入力すれば勝手に取ってきてくれるようにも出来ると思ったのですが、著作権的にアレなのでやめました。

コードと使い方

githubに上げてます。
mazamachi/sentence2graph

$ ruby generate_graph.rb lyrics.txt (name)

で実行できます。2つめのfilenameは保存するときのファイル名ですが、"."は含まないようにしてください。".png"は勝手につけます。 未指定の場合は、使ったテキストファイル名がlyrics.txtの場合はlyrics.pngとして出力されます。

デフォルトでは階層表示(dot)になっていますが、オプションとして"-n"をつけると、近いもの同士を近づけて(neato)表示されます。

感想

MeCabを用いた形態素解析は575認定などでよく用いていたのですが、そろそろ係り受け解析もしてみたいと思っていたのでちょうどいいタイミングだったと思います。

しかしgraphvizってすごいですね。全然仕組み理解していないけど、どうやらバネのモデルを使ったりしてるらしい?

個人的に一番面白かったのは、円広志さんの「夢想花」です。

f:id:SWIMATH2:20151001124219j:plain

めっちゃとんでる

「面白さ」という観点で言うと、やはり最初に引用させていただいたツイートは、面白くなるように色分けなどしているので、やはり自動化で面白くするには限界が有るなと感じました。

今後はせっかくだしwebアプリ化してみるなんてのも有りかもしれません。要望があるか暇だったらやってみます。

ちなみに、txtファイルならなんでも良いので、試しに『羅生門』でやってみたのですが、あまりに大きくなりすぎてしまって全く意味が分かりませんでした。 一応貼っときますが、かなり圧縮したので雰囲気だけ伝われば幸いです。

f:id:SWIMATH2:20151001124107j:plain