2011年7月22日金曜日

Rubyでコンテンツベースのレコメンドエンジンを作成

Rubyでコンテンツベースのレコメンドエンジンを作ってみました.といっても,元々Perlで書かれたものをRubyで書き直しただけです.元のプログラムはWEB+DB PRESS Vol.58の記事[1]で解説されていたものです.今回はソースファイル四つとデータファイル四つです.それらは次のリンクからダウンロードできます.

Term.rb
sample01.rb
sample02.rb
sample06.rb
url.txt
page01.txt
page02.txt
page03.txt

sample02.rbの元のプログラムでは,Yahoo!検索APIを利用しています.それと同様にするはずだったのですが,利用制限によりいつもエラーページがかえってきていたので,Googleの通常の検索サービスを利用することにしています.また,sample02.rbとsample06.rbをサイズの大きいHTML文書に対して実行する際は,処理時間がものすごく長くなるので注意してください.参考資料[1]の記事には,上記に含まれていないプログラムがあります.処理内容がちょっとディープすぎて,作成するのに時間がかかりそうだったので,それらについては実装していません.

実行方法と実行結果は,以下のとおりです.

$ ruby sample01.rb http://dl.dropbox.com/u/15893102/wdpress58_algorithm/page01.html
1 Ruby
1 Perl
1 言語
1 軽量
$ ruby sample02.rb http://dl.dropbox.com/u/15893102/wdpress58_algorithm/page01.html
7 Ruby
6 Perl
6 言語
7 軽量
$ ruby sample06.rb url.txt http://dl.dropbox.com/u/15893102/wdpress58_algorithm/page03.html
1: 0.45 page01
2: 0.00 page02


参考資料
[1] 伊藤 直也, 内容からの記事推薦に挑戦, アルゴリズム実践教室 第3回, WEB+DB, Vol. 58, pp. 147-155, 2010-09

関連資料
[2] MacPortsでrb-hpricotをインストール
[3] MacPortsでrb-mecabをインストール
[4] Rubyでレコメンドエンジンを作成
[5] Rubyでベイジアンフィルタを作成

2011年7月18日月曜日

MacPortsでrb-hpricotをインストール

MacPortsでrb-hpricotをインストールしたので,メモしておきます.rb-hpricotは,RubyでHTML文書を解析するために必要なモジュールです.

$ sudo port install rb-hpricot

このモジュールを使う際は,次のとおりソースの先頭で読み込んでおく必要があります.

require 'rubygems'
require 'hpricot'


今回のインストールは,ページ[1]を参考にしました.

参考記事
[1] Mechanize, Hpricot, MeCab でブログの頻出単語を調べる

関連記事
MacPortsでRubyをインストール

2011年7月15日金曜日

MacPortsでrb-mecabをインストール

MacPortsでrb-mecabをインストールしたので,メモしておきます.rb-mecabは,RubyからMecabを利用するためのモジュールです.

$ sudo port install rb-mecab

このモジュールを使う際は,次のとおりソースの先頭で読み込んでおく必要があります.

require 'MeCab'

今回のインストールは,ページ[1]を参考にしました.

参考記事
[1] Rubyの形態素解析「MeCab」で文章から名詞を抽出してみる

関連記事
MacPortsでMecabをインストール
MacPortsでRubyをインストール

2011年7月10日日曜日

読了:ロングテール[アップデート版]

Chris Andersonのロングテールを読みました.

Chris Anderson, 藤森 ゆりこ(訳): ロングテール[アップデート版], 早川書房, 2009-07

本書に関する私的視点からの要約と考察を以下に記します.

[要約]
ロングテールとは,ロングテールド・ディストリビューション(裾の長い分布)の長い裾野の部分のことである.

人気度順に並べた商品の販売数をプロットすると,ロングテールド・ディストリビューションになる場合が多い.この分布において,人気度が高く,幅が狭い範囲をヘッドと呼び,人気度が低く,幅が広い範囲をテールと呼ぶ.ヘッドにはヒット商品が並び,テールにはニッチ商品が並ぶ.

近年,各種市場で見られるロングテールド・ディストリビューションに変化が起こっている.その変化とは,ヘッドが低くなり,テールが伸びるという現象である.商品の売れ筋がヒットからニッチへ移行しているのである.特に,テールの伸びは著しく,まさしくそれはロングテールとなっている.

この変化は,次に挙げる3つ追い風が市場に吹くことによって引き起こされている.従来の市場は,コスト,空間,時間などの制約から商品のラインナップは限定されていた.そして,それがヒットや大衆文化を生み出す要因となっていた.しかし,現在はそれら3つの追い風が従来の市場に課されていた制約を吹き飛ばしたり,弱めたりしている.

  • 生産手段の民主化
    商品の選択肢が増加し,人々の嗜好にあった商品が登場するようになった.
  • 流通手段の民主化
    消費のコストが減少し,それらの商品が人々の手に届くようになった.
  • 需要と供給の一致
    選択肢が増えても,口コミやフィルタにより商品を探し出せるようになった.

ロングテールド・ディストリビューションの変化は,市場だけでなく文化にも影響を及ぼしている.従来はヒットが文化を形成する役割を担っていたが,今後はニッチがその役割を担うようになる.人々は,常に一般的な興味と専門的な興味の両方を持ち,個人の中にはそれらが混在している.一般的な興味を満足させるのはヒット,専門的な興味は満足させるのはニッチである.これまでニッチは一部の人々だけが手に入れられるものだったが,広くアクセスできるロングテールの登場により,そうすることができなかった人々にもニッチが行き渡るようになった.さらに,商品に関する情報を共有する仕組みの登場により,ニッチを嗜好する人同士が出会えるようになった.こうして,ニッチごとに細分化された個別文化が醸造されるようになった.

[考察]
市場があれば,ロングテールド・ディストリビューション(必ずしもロングテールを備えているとは限らない)が登場するのは,社会活動の習わしのようなものみたいだ.

現代の市場では多数の人々がアクセスできる場に無数の商品が並び,そして,ここでもご多分に漏れずロングテールド・ディストリビューション(こちらはロングテールになっている)が登場する.ただ,この分布は一枚岩ではなく,たくさんの地層が積み重なってできたもののようだ.一つ一つの地層は,ある嗜好を反映しており,その中でもロングテールド・ディストリビューションが登場する.

嗜好の地層の形成を手助けしているのが,現在脚光を浴びているソーシャルメディアなのではないだろうか.特に,SNSは口コミのパワーが増幅されるメディアとして企業もその活用に躍起になっている.現状のSNSはソーシャルグラフを細分化する方向を目指し始めたような気がする.SNSの影響力がこのまま増せば,ニッチを嗜好する人同士の出会いは逆に失われるのではないだろうか.そんな気がしてならない.ツイッターのように不特定多数の人々がつながるメディアも以前として存在するので,両者のバランスがどうなっていくかは今後注意深く見ていく必要があると思う.

ちなみに,口コミには,ロングテールド・ディストリビューションのヒットを高くし,テールを低くする働きがある.そして,そうしてヒットが生まれる.近年のソーシャルメディアの普及は,口コミの働きを活性化するはずなので,各種市場のロングテールド・ディストリビューションでは,ヒットばかりが目立つようになるはずである.しかし,実際はそうならず逆の動きをしている.著者の分析によれば,人々がニッチ文化に分居しているので,口コミの影響範囲がその文化圏のみに限定されるからだそうである.なかなか鋭い考察だと感銘を受けた.