ソースTakumi(友人)のblog,facebook,picasaの投稿データ
概要 blog,facebookでの発言履歴を収集し、形態素解析。
どのようなワードがどのような順序で出現する可能性が高いか、を機械学習し、
“Takumi(友人)が言いそうな言葉”をsvgでビジュアライズするとともにweb audio apiで音声再生。


※下記画像をクリックすると、デモ映像が再生されます。
takumi_scimulator


詳細な裏側解説は下記の通りとなります。

(1) blogなどからのWebスクレイピング
Takumi君の発言履歴を元データとするため、まずは彼のblogをWebスクレイピングしていきます。
今回はRubyの”Anemone”パッケージを利用しております。
RubyのAnemoneには再帰読み込み(blogトップを指定してそこからリンク先を辿っていく)など、
クローリングに便利な機能がついております。

今回、blog要素がdiv要素でうまくタイトル、本文が抜き出せなかったので、
さらに大きな固まりでdiv指定して取得し、エスケープ処理しながら邪魔な文字列(タグ含む)は削除していっております。





詳細は過去ポスト「blogデータを収集する」をご参照くださいませ。

スクレイピングした結果は下記のようなcsvに書き出しております。

webスクレイピング


(2) 発言内容を形態素解析
次に上記CSVに含まれるTakumi君の発言を形態素解析していきます。
今回はRMeCabを利用しております。
RMeCabは、オープンソースの形態素解析エンジンであるMeCabをR上で
実行できるようにしたパッケージとなります。

文章に含まれる単語ごとの品詞や頻度を下記のように書き出す事ができます。

形態素解析

見ていただくとわかるように、そのままだと接続詞が多くなるため、
目的に応じて、例えば”名詞”のみ、”動詞”のみなど指定する事も可能です。
また、ワードの頻度だけでなく、ワードの並びの集合であるNgramの頻度も出す事ができます。

ちなみにRでのデータの読み込みからNgramの頻度算出、
そのネットワーク表示のためのフローおよび結果は下記のようになります。







[コード解説]
※type=0で文字単位、type=1で形態素原型、type=2で品詞情報単位
※posで抽出する品詞を指定(カンマ区切りで複数指定も可能)
 pos = c(“名詞”,”動詞”,”助詞”)
※デフォルトはN=2のバイグラム。N=3とすると3つの語の連続
※グラフデータの変換は、そのままやるとごちゃごちゃしがちなので、望む結果になるよう頻度で制限

形態素解析のネットワーク表示



(3) 発言単語ごとにmp3で録音しweb audio apiで制御
Takumi君を2時間ほど拘束し、単語ごとに録音していきます。
なお録音はQuickTimePlayerを立ち上げ、「ファイル」→「新規オーディオ収録」でできます。
ちなみに録音開始/停止は、録音ボタンのクリックだとクリック音まで録音されてしまいます。
録音開始/停止はスペースキーでも可能ですので、そちらのほうがノイズが入らず良いかと思います。

録音した音声は、web audio api経由で読み込み、javascriptで制御できるようにしておきます。
今回は、通常の出現頻度に応じたランダム再生モードのほか、
「confidence」と「love」というパラメータをバーで自由に調整できるようにし、
ワードの出現頻度を動的に変更できるようにしました。



(4) ひたすらsvg、three.js、web audio apiで実装
メイン処理は以上でして、あとはそれをビジュアライズしていきます。
形態素解析した結果をsvgで書き出す箇所などは出来るだけ自動でhtmlに変換できるようにしておきます。

svgで形態素解析結果の表示



(5) リハ/プレゼン
takumi_scimulator

実は、これはTakumi君の披露宴で、余興としてやったネタとなります。
実際には、プレゼンの後、デモンストレーションし、
さらに何人かの人にテーブルインタビューをしながら、
随時リアルタイムでパラメータ調整するというインタラクティブなスタイルでした。

当日の12:30までプログラミングし、15:00から会場リハ、15:30から披露宴開始という
なかなかアクロバティックなスケジュールでした。。

TakumiくんMaiさん、おめでとうございます!