文章をCabochaで解析してグラフにして可視化する(歌詞可視化)
最近どうやら歌詞を可視化するのが流行っているようです。
何がおもしろくて朝の時間をこんなものにつぶしたんだと10時間前の自分を責めたい pic.twitter.com/Y8kffFm8gW
— 御苑トンネル (@Tatawidepine) 2015, 9月 28
自然言語処理をすれば簡単に自動化出来るんじゃないかと思ったので、文章を与えると流れを可視化してくれるプログラムを組んでみました。
出来上がったサンプルがこちら
使ったもの
事前準備
CaboChaのインストール
僕は既にMeCabとかをインストールしてあったので超簡単でした。
$ brew install cabocha $ gem install cabocha-ruby
graphvizのインストール
これもいつだったか使ったことがあったので僕は
$ gem install gviz
するだけでよかったのですが、もしこれからやろうと思った方は柿のサイトが参考になると重います。
Gvizの目次 - Rubyの世界からGraphvizの世界にこんにちは!
かなり親切に解説してありサンプルも豊富なので、rubyがある程度わかれば簡単に使えると思います。
仕様
このブログを書きながら「これもう誰かやってんじゃね?」と思って検索してみたら、2008年時点で先見の明のある方にすでになされていたようです。つらい。
こちらの方は形態素解析を用いているため、文節ではなく形態素(単語)がノードとなっています。 僕は最初に引用したツイートを参考にして作ったため、
- 文節ごとにノードにする
- ノードAからノードBに対する矢印は1本
- bold,solid,dashed,dottedの順で1~4回目の遷移先を指定
- 登場頻度の多いノードは大きくする
という特徴をつけています。
ちなみに、「歌詞の可視化」として曲名を入力すれば勝手に取ってきてくれるようにも出来ると思ったのですが、著作権的にアレなのでやめました。
コードと使い方
githubに上げてます。
mazamachi/sentence2graph
$ ruby generate_graph.rb lyrics.txt (name)
で実行できます。2つめのfilenameは保存するときのファイル名ですが、"."は含まないようにしてください。".png"は勝手につけます。 未指定の場合は、使ったテキストファイル名がlyrics.txtの場合はlyrics.pngとして出力されます。
デフォルトでは階層表示(dot)になっていますが、オプションとして"-n"をつけると、近いもの同士を近づけて(neato)表示されます。
感想
MeCabを用いた形態素解析は575認定などでよく用いていたのですが、そろそろ係り受け解析もしてみたいと思っていたのでちょうどいいタイミングだったと思います。
しかしgraphvizってすごいですね。全然仕組み理解していないけど、どうやらバネのモデルを使ったりしてるらしい?
めっちゃとんでる
「面白さ」という観点で言うと、やはり最初に引用させていただいたツイートは、面白くなるように色分けなどしているので、やはり自動化で面白くするには限界が有るなと感じました。
今後はせっかくだしwebアプリ化してみるなんてのも有りかもしれません。要望があるか暇だったらやってみます。
ちなみに、txtファイルならなんでも良いので、試しに『羅生門』でやってみたのですが、あまりに大きくなりすぎてしまって全く意味が分かりませんでした。 一応貼っときますが、かなり圧縮したので雰囲気だけ伝われば幸いです。
中2の頃から大好きなはてなのインターンで最高の経験をした話
学科内bot作成ハッカソンを開催したので知見を共有します
「学科内 bot作成 ハッカソン」季語: ハッカソン(夏)
学科の希望者を募ってTwitter botを作るハッカソン的なものを開催しました。 ハッカソンと言っても参加者の多くは授業でプログラミングをしているくらいなので大層なものではないのですが、企画者として色々と学びや反省点があったのでノウハウの共有も兼ねてまとめます。
個人的にこれは大事だと思ったことは強調しておくので、参考にしていただければ幸いです。
企画するまで
僕の所属する電子情報工学科では、一応情報系の名を冠する学科ということもあり、学科に配属された当時から「みんなでハッカソンとかしてみたいな」的な話が一部でありました。 が、そもそも全員が実際に開発した経験があるわけではないなどの理由から特に実現することもなくその話は流れて行きました。
しかし、先学期に転機が訪れました。というのもこの学科では、実験の一環として6~7月に学科全員が2人1チームでそれぞれ独自のIP電話を(C言語で)作って発表するという恒例行事があるため、全員が一応開発経験を積むことになります。 作ったものを人前で発表するという経験は僕もなかったのですがとても楽しく、皆も楽しんでいたようなのでまたやってみようと思い、ハッカソンを企画・開催することにしました。
企画段階
参加者はtwitterや学科のslack上で募り、ある程度の人数が集まりそうだということで開催を決定しました。
googleからハッカソン 運営ガイドというものが公開されており、これを読み込むことで企画側としてのイメージを固めていきました。 ハッカソン開催を考えている人は是非読んでみることをオススメします。
教室を借りるための書類が必要だったりしてちょっと面倒だったのですが、お世話になっている先生のご協力を賜ったため割とスムーズに進みました。 開催場所は先述の運営ガイドに則り、
- プロジェクター有り
- 十分なコンセント有り
- 机同士が向かい合った会議室のような部屋ではなく、一つの机に2,3人の教室のような部屋
としました。 チームで開発するハッカソンではこれらが必須条件なのではないかと思います。
準備段階
実際に準備を始めた段階で想定された主な困難は以下のようなものでした。
- 一日で完成させる自信のある人が少ない
- アイディア出しが大変そう
- メンターの数が少ない
- そもそも企画者の僕がハッカソンに参加したことがない
それぞれどう解決したかをまとめます。
一日で完成させる自信のある人が少ない
授業でC言語使った経験しかない人も多かったのですが、とにかく全員が作ってみるのが大事だと思ったので全員に完成を目指してもらうことにしました。 そのために、
と細かい限定をかけることで、全員の足並みをそろえることにしました。 この条件は実は普段僕がbotを作る際にやっているものであり、実際に参加者が作り始める前に僕からノウハウを教えることで、スムーズに開発を開始できたのではないかと思います。
アイディア出しが大変そう
botを作ったことがあればtwitter APIを使って何ができて何ができないのかわかるので作りたいものの困難さも大雑把にイメージできますが、初めてbotを作る際には大変だろうということで、参加者への事前アンケートでアイディアを聞いておくことにしました。
その上で、回答として出てきたアイディアそれぞれに対して「自分だったらこんな感じで作る」「これはちょっと難しいかも」といったアドバイスをこちらから供給してみました。 どれほど参加者の役に立ったのかは分かりませんが、企画者が開発を始める前にアドバイスをすると開発を始めるのが楽になるのではないかと思います。
メンターの数が少ない
僕一人でメンターをするつもりだったのですが、さすがにキツそうなのでB4の先輩に手伝っていただくことにしました。圧倒的感謝。
参加人数が14人だったのでメンターは二人で何とかなりましたが、だいたい5,6人に一人くらいはメンターがいた方が良いのではないかと思います。まだ一回しか開催していないので印象でしかありませんが。
そもそも企画者の僕がハッカソンに参加したことがない
ハッカソンに参加したことがなくても、ハッカソンは開催できるという前例を作ったのでみなさん気軽に開催してみてください。先述のハッカソン運営ガイドは素晴らしいです。読み込みましょう。
開催直前〜当日
事前課題
さすがに当日だけでは間に合わなさそうなので全員に以下の事前課題を課しました。
環境構築段階ではやはり人によってはエラーが出まくっていたようなのでサポートが必須だなと感じました。 だからといって全員揃ってやっているとエラーの出た人が律速段階になってしまいがちなので難しいところです。 今回の場合はslackでエラーコードを貼ってもらいながら解決できたので、そういったコミュニケーションツールの選択も重要だと思います。
herokuへの登録はまぁスムーズだったのですが、最近herokuの無料プランの使用が変更されてしまったので僕も勝手がわからないところがありました。 開催者側は最新の情報にキャッチアップしておくべきであると思います。今回の 反省点の 一つです。
rubyの基礎の勉強についてですが、やはりこれが一番の負担になっていたように感じます。全員に書籍を買わせるわけにも行かなかったのでとりあえずドットインストールを紹介したのですが、後でよく考えてみるとオブジェクト指向プログラミング等は今回のハッカソンにはオーバースペックなところがあったかもしれません。 紹介する教材選びももっと慎重にすべきでした。
スライド・テンプレート・メンタリング
先述したとおり、今回のハッカソンでは僕のノウハウを伝えるべくスライドを作成したのですが、なかなか時間が取れなかったために、メンタリング段階で質問されるまで後回しにしたものも有りました。 当然ですがスライド作成は早めにやりましょう。
スライドを作る際に意識したことは
- 難しそうという意識を取り除く
- 皆が使いそうなものは具体的に教えてしまう(ツイートする方法など)
- 調べ方を教える
です。伝わったかは分かりませんが。 特に3つ目の「調べ方」についてはハッカソンにかぎらず開発の仕方を教えるのであれば必須ですね。すべてを教えることはできません。
ちなみに「難しそうという意識を取り除く」ために、今回僕は「twitter botとはinput/outputのいずれかもしくは両方がtwitterであるプログラムにすぎない」という名言を生み出しました。どうぞ使ってください。
twitter botの場合は特に顕著ですが、認証部分・定期的実行などは誰でもほぼ一致するので、githubでテンプレートとなるものを公開してみんなにpullして貰う形で進めました。 自分でもこれは良い選択だったと思っています。
実際に開発が始まるとやはり同じような質問が頻繁に出てくるので、FAQをタイムリーに更新して共有したほうが良かったかもしれません。
発表
みんな時間がなさそうなので口頭での発表で済ませましたが、後々のことを考えるとその場で終わってしまうのではなく、webとかで公開できるようにスライドを必須にすべきだったかもしれません。 参加者は全員僕が想像していたよりもすごいものを作ってきたので、ただ「楽しかった」で終わるのではなく、その後に繋がるような処置をしておくべきでした。
終了後
Google先生曰く、ハッカソン後の飲み会は必須とのことです。お互いを讃え合いましょう。ちなみに僕は疲れでめっちゃ酔いました。
終了後も質問は受け付けていました。どうやらその後もbot作成を続けてくれている人も多いらしく、嬉しい限りです。
ただ、開催者側に対するフィードバックを得るのを忘れていたので、開催後すぐにでも事後アンケートを行うべきだったと反省しています。 普段授業後のアンケートとか答えるの面倒くさいと思っていましたが、開催側へのフィードバックも大切なんですね。
まとめ
- 参加者のレベルに合わせた準備を行う
- 開催する以上は責任をもって教える
- 双方のフィードバックを大切にする
- 開催するのは楽しい
参加してくれた人達と手伝ってくれた方々、ありがとうございました(o_ _)o
自分と同じようなエントリをはてブしている人を探すwebサービスを作りました
お詫び(2015.6.29 12:38追記)
はてなアカウントでのログインの際にwrite権限を要求していましたが、ご指摘の通りこの仕組では全く必要ないものなので削除しました。申し訳ありませんでした。
また、自分が表示されてしまう不具合があるようなのですが、原因が分かり次第修正いたします。
動機
はてブでブクマしたりコメントしてると、「この人自分がブクマする時よく見るな……」っていう人いますよね?
それはダジャレの人とかカッコいいメガネの人のように目立つ人だけじゃなく、有名ブックマカーではなくても似たような嗜好の人はいるわけです。
ところで、はてブにはよく使われているとはあまり言えない「お気に入り」機能があるわけで、逆にそういった人達をお気に入りに登録していけば「人気エントリ」や「新着エントリ」よりも更に自分向けの情報が流れてくるのではないか?という思いから、このwebアプリを作ってみました。
名づけて"Hateneighbor"です。
Hateneighbor
「はてな村のご近所さん」と言う意味で名づけました。
ある程度作り終わるまではてブ公式に「おすすめユーザー」機能があることを知らなかったのは秘密……
一応差別化のために何が共通か表示するようにしたので許していただきたい……
何をするか
はてブアカウントでログインすると、自分のブックマーク最新20件を取得し、それらをブックマークしている人、及びそれらの関連エントリをブックマークしている人を探します。
フォローボタンも付いているので、簡単にフォローも出来ます。
また、共通ブックマークも一覧して見ることが出来ます。
技術的なもろもろ
いつも通り、ruby+sinatraをherokuで動かしています。
デザインとかもいつも通りbootstrap頼りですが、今までよりはそれなりに綺麗に出来たのではないかと思っています。(まだ思い通りに動いていないところは多いですが……特にmobile……)
途中、heroku上だと処理に時間がかかりすぎて勝手にtimeoutされる事に気づいて発狂したのですが、gem parallelを使うことで解決することが出来ました。これまでrubyで並列処理したことはなかったのですが、簡単な上に超便利なので一人感動してました。
はてなapiとかについては、今回もはてブAPIでwebサービスを作りたい全ての人に向けて書きましたを参考にさせていただきました。
今回もJSONとかRSSを取得してrubyでハッシュとして処理することが多かったので、@HatenastarRankを作った時の記事と似たようなことをしています。swimath2.hatenablog.com
個人的な開発記録
実は先日はてなインターンに応募させていただいたのですが、今まではてなapiを使って作ったものが@HatenastarRankしかなかったので、せっかくだしwebサービスでも使ってみようと思ったことも動機の一つです。
作っている途中にお気に入り機能があることに気付き絶望したので一週間ほど間が開いたのですが、実際に組んでいたのは2,3日程度だと思います。
- 1日目にログイン→類似ユーザーのリストアップ、簡単なwebアプリ化
- 2日目にデザインをまともにして情報を増やす
- 3日目に細かい修正
って感じで進めました。
ノートにおおまかなデザインを描いてそれに従って作っていく、というごく一般的な手法を初めてとったのですが、当然のように開発がめっちゃ楽になりました。
正直汚すぎて載せたくないですが、参考のために載せときます。
こんだけ適当でも捗るよ、って感じで見てください。
先日作ったtop - 偶然俳句ツイートwebもherokuで動かしているためか謎バグが発生するので、そろそろvpsかawsに手を出さないといけないなと感じています。
本題とはあまり関係ないですが、最近bashをzshに変えてaliasとかバンバン使うようにしたらかなり快適にgitとか使えるようになった気がします。
こういった小さな面倒を楽にする方法を追求することもエンジニアになるなら必要なのではないかと感じました。
大学の課題の合間を縫ってどうにか完成させたのですが、まだまだ満足のいかないところは多いので、今後も機能を追加していこうと思います。
ご不満、ご要望がある場合は、このブログのコメントでもはてブのコメントでも、喜んで拝見するので書いていただけると幸いです。
アイコン
HとNで家っぽくするつもりでしたが、時間無かったので適当になりました。デザインのお勉強もそのうちしてみたい気もします。