Nutch:特定の文字列が続くURLをクロール対象外にする

Nutchのcrawl-urlfilter.txtを弄ることでクロールさせるURLを正規表現で指定できるんだけれど、許可指定しているURLに含まれる一部のURLを許可しないという事が出来ないみたい。

例えば、crawl-urlfilter.txtに

+^http://test\.co\.jp/
-^http://test\.co\.jp/notaccept/

こんな感じに指定した場合、
http://test.co.jp/notaccept/
はクロール許可したくないんだけれど、
http://test.co.jp/
が許可されてしまっているからこちらが優先されて、
http://test.co.jp/notaccept/
までも許可した事になってしまう。

この問題をどうにかするべく色々調べた結果、正規表現の否定先読みっていうのを使うと良いみたい。

否定先読み

(?!任意の正規表現)

これは、それ以前の正規表現指定した任意の文字列が続かないっていう条件を付けるもの(多分)

上の例で行くと、

+^http://test\.co\.jp/
-^http://test\.co\.jp/notaccept/

こうではなくて、

+^http://test\.co\.jp/(?!notaccept)

こうすることで、
後ろに「notaccept」が続かない「http://test.co.jp/
っていう正規表現を作ることが出来る。

追記

否定先読みの正規表現部分にはORは使えない模様…?
複数の文字列を除外したい場合には否定先読みを連続して書けばOK。

× (?!aaa|bbb)
× (?!(aaa|bbb))
○ (?!aaa)(?!bbb)

Solr:SolrでWebアプリ開発したい

Solrはどうやって使えば良いんだろう。

Solrを使えばLuceneの面倒な検索とかをいちいちjavaで書かなくても、GETとかでリクエスト飛ばせば結果が帰ってくるってことで良いのかな?

ということは、Solrをとりあえず起動させておいて、それに対して別のWebアプリで検索フォームとか結果表示とかさせればOK?

Nutch:修正したソースをコマンド実行に反映させる

Eclipseならソースを修正して実行ボタン押せば普通に動くけど、コマンドで実行させる場合はちょっとした作業が必要。

修正したソースは全て

./src/

フォルダ内に入っているものとする。

nutchのバージョンは1.0。

ant

nutchフォルダで

$ant

すると、buildフォルダにコンパイルされたファイルが生成される。

移動

修正したファイルだけbuildフォルダから移動させる。

プラグインの場合
./build/プラグイン名/プラグイン名.jar

./plugins/プラグイン名/

へ移動。

プラグイン以外の場合

まず、

./nutch-1.0.jar

を解凍して

./nutch-1.0/

フォルダを生成しておく。

次に、

./build/classes/org/apache/nutch/パッケージ名/クラス名.class

./nutch-1.0/org/apache/nutch/パッケージ名/

に移動。

nutch-1.0.job
./build/nutch-1.0.job

./

に移動。
(これ、何に使われているのかちょっと分からないけどとりあえず上書き)

実行

後は

$nutch crawl urls crawl -depth 10 -topN 100

とかすれば修正された部分が反映されているはず。

Nutch:OutOfMemoryの続き2

もう普通にcygwinでtopNを大きくしてループさせればいい気がしてきた。
Eclipseだとエラー出るけどcygwinなら問題ないし。
ただ、クロールして自動で文章抽出からインデックスまで繋げたりするのが出来ない。
とは言ってもクロールがまともに出来ないんじゃ話にならないしなぁ。

Nutch:OutOfMemoryの続き

confの「io.sort.mb」の値が

100だと、1周目のInjectorでエラー。
60だと、1周目のcrawlDBあたりでエラー。
55だと、2、3周のどっかでエラー。
30だと、25周くらいでエラー。
10だと、43周くらいでエラー。

とりあえず減らせば長く持つんだけど、根本的な解決にはならない。
色々調べてるけど原因が分からない。

Nutch:24時間クロール

Crawl.main()をループで呼ぶと25周した後のGeneratorで何故かOutOfMemoryする。
topNがいくつであっても多分同じ。

topN=100程度だと1時間くらいでエラー出ちゃうから、topN=1000にして放置。
時間設定を24時間にしてみたけど、最後まで動いてたみたい。

topN=1000にしてあっても、必ずしも1000個の文書を取ってくるわけではなくて、最大1000という事らしい。

24時間実行でループが20周。
取得した文書数は数えるの面倒だから数えてないけど、条件にマッチしてきちんと抜き出せた文書が8234個。

これだけあれば一応それなりの実験は出来そうかな?

デジカメ:デジタルズームとデジタルテレコン

中央を切り出してズームしてるのはどちらも共通。

デジタルズーム

光学で最大ズームした後に更にズーム。
なのでF値は望遠端の値

デジタルテレコン

広角端〜望遠端で指定倍率ズーム。
同じ倍率なら光学ズームよりもF値が小さい
→明るい
シャッタースピード早い
→手ぶれしにくい。

という勝手な理解だけどあってるのかな。