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の影響力がこのまま増せば,ニッチを嗜好する人同士の出会いは逆に失われるのではないだろうか.そんな気がしてならない.ツイッターのように不特定多数の人々がつながるメディアも以前として存在するので,両者のバランスがどうなっていくかは今後注意深く見ていく必要があると思う.

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

2011年6月5日日曜日

Dojoでリモートのライブラリとローカルの自作コードを両立させる方法

Dojoでネット上にあるライブラリと,自前サーバにある自作コードを両立させて使う方法をメモしておきます.

まずは,状況設定です.「http://ajax.googleapis.com/ajax/libs/dojo/1.4/dojo/dojo.xd.js」に置かれているものをライブラリとして使うことにします.一方,次の図の「war/js/rfj」ディレクトリに置かれている「ScrollBar.js」を自作コードとして使うことにします.


この状況下で「ScrollBar.js」ファイルで定義されている「ScrollBar」クラスを「war/scroll_bar_test.html」ファイル内で使うためには,次のようなコードを記します.

<script
  type="text/javascript"
  src="http://ajax.googleapis.com/ajax/libs/dojo/1.4/dojo/dojo.xd.js"
  djconfig="parseOnLoad: true,
    baseUrl: './', modulePaths: {'rfj': 'js/rfj'}">
</script>
<script type="text/javascript">
dojo.require("rfj.ScrollBar");

dojo.addOnLoad(function() {
  var scrollBar = new rfj.ScrollBar();
);
</script>


ポイントは,最初のscript要素にあるdjconfig属性の値にあります.ローカルのコードが置かれている場所を「baseUrl: './', modulePaths: {'rfj': 'js/rfj'}」という記述で指定します.

baseUrlには,自作コードへのパスを記す際の起点となるディレクトリをこの記述が記されたHTMLファイルから見た相対パスで記します.今回は,「war/scroll_bar_test.html」ファイルがあるのと同じディレクトリを起点とするので,「./」を指定しています.

modulePathsには,Dojoでいうところのモジュールを置いてあるディレクトリのパスを記します.このパスは,baseUrlで指定したディレクトリからの相対パスとなります.「ScrollBar」クラスが定義されている「ScrollBar.js」ファイルは「war/js/rfj」ディレクトリにあるので,そのディレクトリを「war/scroll_bar_test.html」ファイルのあるディレクトリからの相対パスで記すと,「./js/rfj」となります.

2011年6月4日土曜日

FirefoxにてDIV要素を連続でドラッグ&ドロップできない問題

FirefoxにてDIV要素を連続でドラッグ&ドロップできない問題に遭遇しました.一応解決したので,メモしておきます.

DIV要素を水平にドラッグ&ドロップできるようにしたつもりでしたが,一旦ドロップして再度ドラッグしようとすると,そうならずに半透明になった要素がマウスポインタの動きに合わせて追随してくるという問題にFirefoxで遭遇しました.つまり,次の図のような感じです.


結局,下記のようにCSSを変更すると期待通りの動作をするようになりました.

.scroll_bar-handle {
  position: absolute;
  height: 16px;
  top: 0px;
  background-color: red;
  -moz-user-select: none; /* これを追加 */
}


Firefoxでは,要素に対して操作が行われると,それが選択対象となるようです.続けて選択対象の要素に対して操作を加えようとすると,その分身が表示されます.そして,本体に加えられた操作がその分身に対して適用されるようになるみたいです.その設定を無効にするのが,CSSに新たに加えた1行となります.他のブラウザ(といってもChromeだけですが)では,当初から期待通りに動作していたので,この問題(その仕様を知らなかった僕に問題があるのですが)はFirefoxに固有のもののようです.

2011年2月11日金曜日

Eclipse HeliosにGoogle Plugin for Eclipseをインストールする方法

Eclipse HeliosにGoogle Plugin for Eclipseをインストールしたので,その方法をメモしておきます.今回のインストールは[1]のページを参考にしました(というかそのとおりに行いました).
  1. 「Help」→「Install New Software...」を選択
  2. 「Add」を選択
  3. 「Name」に「Google Plugin for Eclipse」を入力
  4. 「Location」に「http://dl.google.com/eclipse/plugin/3.6」を入力
  5. 「OK」を選択
  6. 「Plugin」を選択
  7. 「SDKs」を選択
  8. 「Next」を選択
  9. 「Next」を選択
  10. 「I accept the terms of the license agreements」を選択
  11. 「Finish」を選択
  12. 「Restart Now」を選択
[1] Google Plugin for Eclipse 3.6 (Helios) Installation Instructions

2011年1月10日月曜日

Apache Antをインストール

Apache Antをインストールしたので,その手順をメモしておきます.なお,インストールした環境は,Windows 7+JDK1.6+Cygwinです.
  1. Apache Antのサイトから最新版(現時点では1.8.2)をダウンロード
  2. $ unzip apache-ant-1.8.2-bin.zip
  3. $ mv apache-ant-1.8.2 /opt/ant
  4. 環境変数JAVA_HOMEが設定されているか確認.されていなかったら設定する.
  5. 環境変数ANT_HOMEに「C:\Cygwin\opt\ant」を設定.
  6. 環境変数PATHに「%ANT_HOME%/bin」を追加.

2011年1月7日金曜日

Rubyでレコメンドエンジンを作成

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

recommend01.rb
recommend02.rb
recommend03.rb
tags.txt

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

$ ruby recommend01.rb
0.32659863237109
0.408248290463863
0.8
$ ruby recommend02.rb tags.txt
7: 1.00 シリコンバレーから将棋を観る
8: 0.32 「ほんとうのプロダクトアウト開発」 — マツダはなぜ,よみがえったのか?
11: 0.32 Googleを支える技術
1: 0.26 実践ハイパフォーマンスMySQL 第2版
14: 0.07 Perlプログラマのレベル 10
13: 0.00 Perl で CSS セレクタ
2: 0.00 編集距離(Levenshtein Distance)
12: 0.00 HTML::TreeBuilder + CSSセレクタがいい感じな件
6: 0.00 γ符号,δ符号,ゴロム符号による圧縮効果
3: 0.00 最長共通部分列問題(Logest Common Subsequence)
5: 0.00 YAPC::Asia 2009 1日目 「Perlで圧縮」の資料
9: 0.00 Burrows Wheeler Transform と Suffix Array
4: 0.00 YAPC::Asia 2日目 「はてなブックマークのシステムについて」
15: 0.00 ETech 2006 レポート
10: 0.00 モノリスでジャガーをスキャンしたらじゃがボックルが届いた
$ ruby recommend03.rb tags.txt
7: 1.00 シリコンバレーから将棋を観る
8: 0.32 「ほんとうのプロダクトアウト開発」 — マツダはなぜ,よみがえったのか?
11: 0.32 Googleを支える技術
1: 0.26 実践ハイパフォーマンスMySQL 第2版
14: 0.07 Perlプログラマのレベル 10


参考資料
[1] 伊藤 直也: レコメンドエンジン開発に挑戦—関連記事を導き出すしくみを知る, アルゴリズム実践教室 第2回, WEB+DB PRESS, Vol. 57, pp. 156-164, 2010-08

関連資料
[2] MacPortsでrb-mecabをインストール
[3] Rubyでベイジアンフィルタを作成

2011年1月4日火曜日

MacPortsでMecabをインストール

MacPortsでMecabをインストールしたので,メモしておきます.Mecabはフリーの形態素解析ツールです.

$sudo port install mecab
$sudo port install mecab-ipadic-utf8
$sudo vi /opt/local/etc/mecabrc
--
dicdir = /opt/local/lib/mecab/dic/ipadic-utf8
--


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

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

MacPortsでRubyをインストール

MacPortsでRubyをインストールしたので,メモしておきます.

$ sudo port install ruby
$ sudo port install ruby19


Rubyは素人でよくわからないので,とりあえずバージョン1.8とバージョン1.9の両方をインストールしました.この場合,コマンドは1.8がrubyで,1.9がruby1.9になるみたい.

英語での四則演算の読み方

英語での四則演算の読み方を調べたので,メモしておきます.

今,数式が結構登場する英語の論文を読んでいます.
数式がちょっと複雑なると読めないんだよね.
そういうわけで,数式の読み方をおさらい中です.

ちなみに,四則演算,和,差,積,商の英訳はそれぞれ,the four basic operations of arithmetic, addition, subtraction, multiplication, divisionとなります.

Addition
Ex:
1 + 1 = 2
One plus one is(equals, is equal to) two.
One plus one makes two.

Subtraction
Ex:
2 - 1 = 1
Two minux one is(equals, is equal to) one.
Two take away on is six.

Multiplication
Ex:
1 * 1 = 1
One multiplied by one is(equals, is equal to) one.
One times one is(equals, is equal to) one.

Division
Ex: 1 / 1 = 1
One divided by one is(equals, is equal to) one.

Ex: 10 / 3 = 3 r 1
Ten divided by three equals three with a remainder of one.