SyntaxHighlighter

2012年8月20日月曜日

Bixoを使ってみる。(2)


今回はBixoを使ってWebマイニングをやってみる。
前回と同様に疑似分散環境で実行する。

まず、GettingStartに従って最新のディストリビューションファイルを
ダウンロードすると同封されているexampleパッケージ(モジュール)が
あるのでMavenでビルドする。

【WebMiningTool】

今回はWebMiningToolを起動する。
大まかな処理の流れを説明すると前回紹介したWebクロール処理の後に
クロール処理で取得したコンテンツをパースし、
外部リンクの一覧を抽出する処理と、コンテンツから抽出した
ページのテキストを構文解析して、リソースファイルとして
取り込まれるnagative-phrases.txtとpositive-phrases.txtに記載されている
それぞれの文言よりそのページのスコアを算出する処理が行われる。
最終的な出力は、ページのコンテンツ一覧(content)とクロール結果(crawldb)と
外部リンク一覧(results)とステータス(status)となっている。

【実行】

exampleには既にbixoの実行用シェルがbinフォルダに存在するので、
ターミナルから下記コマンドを実行する。

【実行結果】

今回も[ループ数-タイムスタンプ]という名前でディレクトリが作成されている。
各ディレクトリにはcontent, crawldb, results, statusが格納されている。

各ディレクトリの中には出力結果されたファイルが格納されている。
contentに格納されている内容は下記の通り。
こんな感じでクロールしたHTMLが入ってる。

続いてcrawldb
続いてresults
最後にstatus
見てみると分かる通り、スコアが0になってしまっている。
どうもフレーズの抽出に失敗しているようで、原因は調査中。

実はこのExampleでページランクのアルゴリズムを実装しているのかと
思っていたのだが(ただの先入観)
実際はコンテンツのフレーズをポジティブフレーズ、ネガティブフレーズの
出力確率によってページのスコア付けをするというとても単純なアルゴリズムで
スコアを算出していた。

まあ、いずれにしろWebクローリングが手軽にできて、
なおかつCascadingで実装されているので、機能を付加して
データマイニングもできるという素晴らしいツールにはほかならない。
確率スコアのSubassemblyだけでなく、クラス分類のSubassemblyなど
応用してみても面白そう。
実装できたらいいなー。と希望的観測ですが。。
また次回はGAEに戻るかなー。

2012年8月12日日曜日

Bixoを使ってみる。(1)

今回は、Cascading関連のプロダクト、Bixoについて。

Bixoとは

BixoとはHadoop上で動作するCascadingのPipeにより構成される
Webマイニングツールキットである。
カスタマイズされたCascadingPipeAssemblyを構築することによって、
ユースケースに適用したWebマイニングアプリケーションを作成することが
出来る。

Bixoのアーキテクチャ

BixoはいくつかのCascadingのOperationとSubassembiesによって構成されていて、
HTMLのWebページをフェッチする為にこれらが組み合わされている。
HTMLのWebページをパースした結果が出力される。

FetchSubassemblyはURLよりWEBページのフェッチを行い、
StatusDatums(フェッチの状況を保持している)とFetchedDatum(フェッチしtWebページの情報を保持している)が出力される。
Parse SubassemblyはWebページをフェッチした結果のコンテンツを処理するSubAssemblyで、HTMLからテキストを抽出するのが典型的

Fetch処理の流れ

FetchSubassemblyは効率的にWebページのフェッチを行う為に、
いくつかのフェーズによって成り立っている。
ケースによって異なるが一般的には下記のとおり。

1.ホスト名でグループ化
2.ホスト名IPアドレスに解決する処理と、robots.txtよりURLをフィルターする。
3.フィルタリング、グループ化したIPアドレスをさらに制限する(オプション)
4.URLの数と、クロールの遅延に基づいてフェッチ時間を割り当てる。
5.グループ化されたURLによってReducerを振り分ける
6.並列にFetch処理を行う。

疑似分散環境で実行

GettingStartに従って、最新のディストリビューションファイルを
ダウンロードする。そして実行。

【実行】
【出力結果】
下記のように[ループ数-タイムスタンプ]という名前でディレクトリが作成されいてる。
各ディレクトリには以下のようにcrawldb,status,content,parseが格納されている。
今回はここまで。
 次回は出力情報についてと、フェッチしたデータをもとに
データマイニングを行うところまでやる予定。

2012年8月6日月曜日

GoogleAppEngine MapReduceとGoogleCloudStorageを連携させてみた


また久しぶりのエントリになってしまったが、
実はひそかにPythonを勉強していたのだ。

GAE MapReduceはJava版を以前紹介したが、Mapperのみの実装だったので、
なんだか物足りなさを感じていた。
しかし、Python版はなんとShuffle,Reduceまでフル実装だった!
Pythonに乗り換えた理由である。

ただ、実際に動作させてみると分かるが、中間ファイルの読み書きの多さが欠点に感じる
(Shard数を16で動作させるとDatastore Write Operationsが一気に60%くらいになった)
ここで、GoogleCloudStorageに入力ファイル、中間ファイル、出力ファイルを格納してみてはどうだろうか。と考えた。
※実際はPipelineAPIでバンバン読み書きしてるからっぽいけど。。^^;

GAE MapReduceのソースをみる限り出力ファイルはGoogleCloudStorageに対応しているように見えたが、入力ファイルについては対応していないようだった。
早速作ってみた。
GoogleStorageLineInputReaderというGoogleCloudStorageより入力ファイルを読み込むクラスを作成した。
ちょうど本家Hadoop MapReduceのTextInputFormatのように値はテキストファイルの1行、キーはその値の開始位置というレコードを出力する。

中間ファイル、出力ファイルはGoogleCloudStorage向けに出力するようにパッチを当てた。

ソースGitHubに公開してあるのでそちらで参照して欲しい。

早速動かしてみよう。
今回もWordCountだ。w
入力ファイルはGoogleCloudStorageにアップロードしておく必要がある。
それと、中間ファイル、出力ファイルが格納されるバケットも予め用意しておく必要がある。














入力ファイルは以下の内容



Mapper,Reducer,MapreducePipelineの実装


そして実行。














Shuffleフェーズ
















完了。










うん、結果バッチリ。













今回はまだ小規模なデータしか扱ってないので、
まだ課題は見つからなかったが、これから中規模、大規模と
チャレンジしていきたい(クラウド貧乏にならないように注意が必要だがw)

あと、Pythonもまだ触りたてなので、磨いていきたい。
次回も引き続きGAE MapReduceで遊んでみようかな。
Google Compute Engineも気になる。。)乞うご期待。