「集合知プログラミング」で図書館系ブログをクラスタリングしてみた

 2013年2月12日 プログラム公開.

 1月は1つもブログ記事を書きませんでしたが,本年もどうぞよろしくお願いします.
1月は温泉旅行に行ったり,体調崩してたり,図書館総合展フォーラム in 熊本に行ったりしていました.(熊本でお世話になって皆さまありがとうございました.)
 2月は試験と修士論文の構想発表があるので,いろいろとやらないといけないのですが,あまりに統計が分からないので現実逃避にプログラミングの勉強をはじめてしまいました.

方法

さて,タイトルの図書館系ブログのクラスタリングです.手順としては以下の方法で行いました.方法は,後述しますが「集合知プログラミング」によります.

  • 各ブログのRSSフィードリストを作成する.
  • 各フィードからブログ記事の本文を抽出する.
  • ブログ本文を抽出して,形態素解析を行い単語ごとに分割する.
  • ブログごとの単語出現回数をカウントする.
  • どのブログにも高頻度で出現する語は特徴を表す語とは言いがたいので取り除く.*1
  • K平均法を用いてブログをクラスタリング

 K平均法は,データをK個に分類するとあらかじめ決めておき,ランダムにK個の基準点を設定します.それぞれの基準点からもっとも近い二つのデータを選んで,基準点をその重心に移動する.ということを繰り返し,最終的に基準点が移動しなくなった段階でクラスターが形成されていると判断するやりかたです.下記の図を参照ください.黄色がデータで,灰色が基準点です.
f:id:otani0083:20130201191611j:plain
最終的にABC,DEと2つのクラスタが形成されているのが分かります.
データ間の距離はピアソン相関という方法で求めています.

クラスタリングの結果

今回は54のブログを10個のクラスタに分類してみました.

0
: モビーディックアンカー
: Sabarya's blog
: SENTOKYO ブログ
1
: 大阪狭山市立図書館ブログ
: 図書館雑記&日記兼用
: リブヨ・ブログ
: Katachi
: どろぶねMk-Ⅱ
2
: kumori工場
: 菜の花の大学図書館日誌
: やわらか図書館学
: ヨネザアドの学びの杜・遊びの海(米澤誠の公式ブログ)
: 香川大学図書館中央館活動ブログ
: まだ書きさしの
: 図書館の中では走らないでください!
: 黒澤公人のドキュメンテーションシステムの100年(1960年-2060年)
: めじるし。
: よしなしごと
: Daily Searchivist
: カレントアウェアネス・ポータル - カレントアウェアネス-E
: 沖縄県図書館協会
: Myrmecoleon in Paradoxical Library. ブロマガ分館
: xiaodong's memo
3
: Cute.dev: ディスカバリサービス開発日誌
: 実業史研究情報センター・ブログ 「情報の扉の、そのまた向こう」
: エル・ライブラリー 大阪産業労働資料館
: カレントアウェアネス・ポータル - カレントアウェアネス-R
: 『本棚の中のニッポン』blog
4
: カレントアウェアネス・ポータル - カレントアウェアネス
: みちくさのみち
5
: 古本おもしろがりずむ:一名・書物蔵
6
: 図書館長風味-なぐも通信
: ゆうき図書館 雑誌記事紹介ブログ
: ぺえぺえ魂
: 努力の上に花が咲く(しぶろぐ)
: Copy & Copyright Diary
: 日々記―へっぽこライブラリアンの日常―
7
: 日々のきろく
: 図書館退屈男
: clap-hand instruments of knowledge
: Traveling LIBRARIAN −旅する図書館屋
8
: ぶらりらいぶらり : 長崎大学図書館ブログ
: お茶の水女子大学附属図書館LiSA活動日誌
: システム担当ライブラリアンの日記
: 埼玉県立図書館ブログ
: できごと記
9
: 書庫はいつでも雨漏りです
: ささくれ
: 島の図書館に行こう!
: マロニエの花咲く 横芝光町立図書館blog
: かたつむりは電子図書館の夢をみるか
: 秋田県立図書館ブログ
: 全史料協 調査・研究委員会ブログ

また,おなじデータセットを利用して,2次元でブログの距離を表現すると下記のような形になります多次元尺度構成法 - Wikipediaというアルゴリズムを使っています.高次のものを低次に圧縮しているわけですが,うまく説明できないので割愛.下のイメージのような結果になりました.f:id:otani0083:20130201193354j:plain

 今回のクラスタリングに使った図書館系ブログの選定は自分のRSSフィードから適当に抜いているので,特に基準があるわけではありません.別に網羅的なものを目指したわけでもないので,入っていなくても許してください.また,データごとても少ないので,乱数の初期値でそれなりに結果が変わっています.K平均法と多次元尺度構成法の結果があまり合致しないのもそのせいだと思います.
 もう少し図書館公式のものや,アーカイブス系,館種による違いとか出るかなぁと期待していたのですが,そこまで分かりやすい結果とはなりませんでした.RSSに限定せずブログの全文記事を抽出してやればもうちょっとわかりやすい結果がでたりするかもしれません.

参考書籍

 今回のプログラムはほとんど「集合知プログラミング」に掲載されているサンプルどおりです.日本語周りのところだけ若干修正して使用しています.2008年に友人である當山仁健さんが共訳された書籍です.内容的には,APIが閉鎖されて一部利用できなくっているサンプルなどはあるものの,古びておらず今でも十分利用できるものだと思います.情報推薦・分類・クラスタリング・検索エンジンなど図書館系の人にもなじみのふかいトピックが多く,簡単にほかに応用が利くサンプルが多数掲載されているのでおすすめです.ebook版はでていないみたいです.

集合知プログラミング

集合知プログラミング

 ただ,まったくプログラミングを触ったことが無い人が読むには少々ハードルが高いのも確かです.そんな方はこちらの書籍が入門として分かりやすいので読んでみると良いかと思います.

Pythonスタートブック

Pythonスタートブック


 他の言語の経験がある人は多分このあたりを読めば十分ではないかと.
Pythonチュートリアル 第2版

Pythonチュートリアル 第2版


みんなのPython 第3版

みんなのPython 第3版

 最近プログラミングの学習サイトもいろいろ増えていますので,そちらを利用するのもいいかと思います.たとえば3分動画でマスターする初心者向けプログラミング学習サイト - ドットインストールとかコードの書き方を学ぼう | Codecademy

 私は就職してからそれこそ當山さんの影響でプログラミングをちょっとかじった程度です.小さなことでは,業務の単純作業の軽減から,大きなことでは大学院入学までプログラミングはじめたことで,いろいろと変わりました.興味持たなければli:d techもこのブログもきったやってなかったですしね.というわけでちょっとでも関心のある人は,是非,先入観なしで初めて見ていただければ.

実行プログラム

 今回はコメントも入れておらず分かりにくいのと,ほぼ書籍サンプルままなので公開しませんが,もしご関心あるという奇特なかたいらっしゃいましたら,ご連絡いただければお送りします.

よく考えたらgithubで公開すればよかったということで….
https://github.com/otani0083/Programming_Collective_Intelligence

*1:本当は底頻度の語についても同様の処理を行った方がよいのでしょうが,やってみるとほとんどの単語が残らなかったので今回は実施せず